@lobehub/ui 5.20.2 → 5.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/A/index.d.mts +1 -2
- package/es/A/index.mjs.map +1 -1
- package/es/Accordion/Accordion.d.mts +2 -4
- package/es/Accordion/Accordion.mjs +2 -2
- package/es/Accordion/Accordion.mjs.map +1 -1
- package/es/Accordion/AccordionItem.d.mts +2 -4
- package/es/Accordion/AccordionItem.mjs +2 -2
- package/es/Accordion/AccordionItem.mjs.map +1 -1
- package/es/Accordion/ArrowIcon.mjs.map +1 -1
- package/es/Accordion/context.mjs +18 -17
- package/es/Accordion/context.mjs.map +1 -1
- package/es/Accordion/index.d.mts +2 -2
- package/es/Accordion/style.mjs.map +1 -1
- package/es/Accordion/type.d.mts +1 -1
- package/es/ActionIcon/ActionIcon.d.mts +2 -4
- package/es/ActionIcon/ActionIcon.mjs +1 -1
- package/es/ActionIcon/ActionIcon.mjs.map +1 -1
- package/es/ActionIcon/components/utils.mjs.map +1 -1
- package/es/ActionIcon/index.d.mts +2 -2
- package/es/ActionIcon/style.mjs +1 -1
- package/es/ActionIcon/style.mjs.map +1 -1
- package/es/ActionIcon/type.d.mts +3 -1
- package/es/ActionIconGroup/ActionIconGroup.d.mts +1 -2
- package/es/ActionIconGroup/ActionIconGroup.mjs.map +1 -1
- package/es/ActionIconGroup/index.d.mts +2 -2
- package/es/ActionIconGroup/style.mjs +1 -1
- package/es/ActionIconGroup/style.mjs.map +1 -1
- package/es/ActionIconGroup/type.d.mts +9 -2
- package/es/Alert/Alert.d.mts +2 -4
- package/es/Alert/Alert.mjs.map +1 -1
- package/es/Alert/index.d.mts +2 -2
- package/es/Alert/style.mjs +1 -1
- package/es/Alert/style.mjs.map +1 -1
- package/es/Alert/type.d.mts +1 -1
- package/es/AutoComplete/Select.d.mts +2 -4
- package/es/AutoComplete/Select.mjs.map +1 -1
- package/es/AutoComplete/index.d.mts +2 -2
- package/es/AutoComplete/style.mjs +1 -1
- package/es/AutoComplete/style.mjs.map +1 -1
- package/es/AutoComplete/type.d.mts +0 -1
- package/es/Avatar/Avatar.mjs.map +1 -1
- package/es/Avatar/AvatarGroup/index.d.mts +2 -4
- package/es/Avatar/AvatarGroup/index.mjs.map +1 -1
- package/es/Avatar/AvatarGroup/style.mjs.map +1 -1
- package/es/Avatar/index.d.mts +2 -3
- package/es/Avatar/style.mjs.map +1 -1
- package/es/Avatar/type.d.mts +2 -1
- package/es/Avatar/utils.mjs.map +1 -1
- package/es/Block/Block.d.mts +1 -2
- package/es/Block/Block.mjs.map +1 -1
- package/es/Block/index.d.mts +2 -2
- package/es/Block/style.mjs +1 -1
- package/es/Block/style.mjs.map +1 -1
- package/es/Block/type.d.mts +1 -1
- package/es/Burger/Burger.d.mts +2 -4
- package/es/Burger/Burger.mjs.map +1 -1
- package/es/Burger/index.d.mts +2 -2
- package/es/Burger/style.mjs.map +1 -1
- package/es/Burger/type.d.mts +1 -1
- package/es/Button/Button.d.mts +1 -2
- package/es/Button/Button.mjs.map +1 -1
- package/es/Button/index.d.mts +2 -2
- package/es/Button/style.mjs +1 -1
- package/es/Button/style.mjs.map +1 -1
- package/es/Button/type.d.mts +1 -1
- package/es/Checkbox/Checkbox.mjs +2 -2
- package/es/Checkbox/Checkbox.mjs.map +1 -1
- package/es/Checkbox/CheckboxGroup.d.mts +1 -2
- package/es/Checkbox/CheckboxGroup.mjs +4 -3
- package/es/Checkbox/CheckboxGroup.mjs.map +1 -1
- package/es/Checkbox/index.d.mts +2 -3
- package/es/Checkbox/style.mjs.map +1 -1
- package/es/Checkbox/type.d.mts +2 -1
- package/es/CodeDiff/CodeDiff.d.mts +2 -4
- package/es/CodeDiff/CodeDiff.mjs +1 -1
- package/es/CodeDiff/CodeDiff.mjs.map +1 -1
- package/es/CodeDiff/DiffPanel.mjs.map +1 -1
- package/es/CodeDiff/PatchDiff.d.mts +2 -4
- package/es/CodeDiff/PatchDiff.mjs +1 -1
- package/es/CodeDiff/PatchDiff.mjs.map +1 -1
- package/es/CodeDiff/index.d.mts +1 -1
- package/es/CodeDiff/index.mjs +2 -2
- package/es/CodeDiff/style.mjs +1 -1
- package/es/CodeDiff/style.mjs.map +1 -1
- package/es/CodeDiff/theme.mjs.map +1 -1
- package/es/CodeDiff/type.d.mts +1 -1
- package/es/CodeEditor/CodeEditor.d.mts +2 -4
- package/es/CodeEditor/CodeEditor.mjs +2 -2
- package/es/CodeEditor/CodeEditor.mjs.map +1 -1
- package/es/CodeEditor/index.d.mts +2 -2
- package/es/CodeEditor/style.mjs.map +1 -1
- package/es/CodeEditor/type.d.mts +1 -1
- package/es/Collapse/Collapse.d.mts +2 -4
- package/es/Collapse/Collapse.mjs.map +1 -1
- package/es/Collapse/index.d.mts +1 -1
- package/es/Collapse/style.mjs.map +1 -1
- package/es/Collapse/type.d.mts +1 -1
- package/es/ColorSwatches/ColorSwatches.d.mts +1 -2
- package/es/ColorSwatches/ColorSwatches.mjs +3 -3
- package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
- package/es/ColorSwatches/index.d.mts +1 -1
- package/es/ColorSwatches/style.mjs.map +1 -1
- package/es/ColorSwatches/type.d.mts +1 -1
- package/es/ConfigProvider/index.d.mts +3 -9
- package/es/ConfigProvider/index.mjs +11 -10
- package/es/ConfigProvider/index.mjs.map +1 -1
- package/es/ContextMenu/index.d.mts +2 -1
- package/es/CopyButton/CopyButton.d.mts +2 -4
- package/es/CopyButton/CopyButton.mjs.map +1 -1
- package/es/CopyButton/index.d.mts +1 -1
- package/es/CopyButton/type.d.mts +1 -0
- package/es/DatePicker/DatePicker.d.mts +2 -4
- package/es/DatePicker/DatePicker.mjs.map +1 -1
- package/es/DatePicker/index.d.mts +2 -2
- package/es/DatePicker/style.mjs +1 -1
- package/es/DatePicker/style.mjs.map +1 -1
- package/es/DatePicker/type.d.mts +0 -1
- package/es/DownloadButton/DownloadButton.d.mts +1 -2
- package/es/DownloadButton/DownloadButton.mjs.map +1 -1
- package/es/DownloadButton/index.d.mts +1 -1
- package/es/DownloadButton/type.d.mts +1 -0
- package/es/DraggablePanel/DraggablePanel.mjs +4 -3
- package/es/DraggablePanel/DraggablePanel.mjs.map +1 -1
- package/es/DraggablePanel/components/DraggablePanelBody.d.mts +2 -4
- package/es/DraggablePanel/components/DraggablePanelBody.mjs.map +1 -1
- package/es/DraggablePanel/components/DraggablePanelContainer.d.mts +2 -4
- package/es/DraggablePanel/components/DraggablePanelContainer.mjs.map +1 -1
- package/es/DraggablePanel/components/DraggablePanelFooter.d.mts +2 -4
- package/es/DraggablePanel/components/DraggablePanelFooter.mjs.map +1 -1
- package/es/DraggablePanel/components/DraggablePanelHeader.d.mts +2 -4
- package/es/DraggablePanel/components/DraggablePanelHeader.mjs +2 -2
- package/es/DraggablePanel/components/DraggablePanelHeader.mjs.map +1 -1
- package/es/DraggablePanel/components/style.mjs.map +1 -1
- package/es/DraggablePanel/index.d.mts +5 -6
- package/es/DraggablePanel/style.mjs.map +1 -1
- package/es/DraggablePanel/type.d.mts +0 -1
- package/es/DraggablePanel/utils.mjs.map +1 -1
- package/es/DraggableSideNav/DraggableSideNav.d.mts +2 -4
- package/es/DraggableSideNav/DraggableSideNav.mjs +2 -2
- package/es/DraggableSideNav/DraggableSideNav.mjs.map +1 -1
- package/es/DraggableSideNav/index.d.mts +2 -2
- package/es/DraggableSideNav/style.mjs.map +1 -1
- package/es/DraggableSideNav/type.d.mts +0 -1
- package/es/Drawer/Drawer.d.mts +2 -4
- package/es/Drawer/Drawer.mjs.map +1 -1
- package/es/Drawer/index.d.mts +2 -2
- package/es/Drawer/type.d.mts +1 -1
- package/es/Dropdown/Dropdown.d.mts +2 -4
- package/es/Dropdown/Dropdown.mjs.map +1 -1
- package/es/Dropdown/index.d.mts +2 -2
- package/es/Dropdown/type.d.mts +3 -2
- package/es/DropdownMenu/index.d.mts +3 -2
- package/es/EditableText/ControlInput.d.mts +2 -0
- package/es/EditableText/ControlInput.mjs.map +1 -1
- package/es/EditableText/EditableText.d.mts +2 -4
- package/es/EditableText/EditableText.mjs +2 -2
- package/es/EditableText/EditableText.mjs.map +1 -1
- package/es/EditableText/index.d.mts +2 -2
- package/es/EditableText/type.d.mts +9 -1
- package/es/EditorSlashMenu/EditorSlashMenu.d.mts +23 -13
- package/es/EditorSlashMenu/EditorSlashMenu.mjs.map +1 -1
- package/es/EditorSlashMenu/MenuItemRenderer.mjs.map +1 -1
- package/es/EditorSlashMenu/atoms.d.mts +14 -59
- package/es/EditorSlashMenu/atoms.mjs.map +1 -1
- package/es/EditorSlashMenu/index.d.mts +2 -2
- package/es/EditorSlashMenu/style.mjs.map +1 -1
- package/es/EditorSlashMenu/type.d.mts +16 -9
- package/es/EditorSlashMenu/useKeyboardNavigation.mjs.map +1 -1
- package/es/EditorSlashMenu/useNormalizedItems.mjs.map +1 -1
- package/es/EditorSlashMenu/utils.mjs.map +1 -1
- package/es/EmojiPicker/AvatarUploader.mjs.map +1 -1
- package/es/EmojiPicker/EmojiPicker.d.mts +2 -4
- package/es/EmojiPicker/EmojiPicker.mjs +8 -5
- package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
- package/es/EmojiPicker/index.d.mts +2 -2
- package/es/EmojiPicker/style.mjs.map +1 -1
- package/es/EmojiPicker/type.d.mts +1 -1
- package/es/Empty/Empty.d.mts +1 -2
- package/es/Empty/Empty.mjs.map +1 -1
- package/es/Empty/index.d.mts +2 -2
- package/es/Empty/type.d.mts +4 -1
- package/es/FileTypeIcon/FileTypeIcon.d.mts +1 -2
- package/es/FileTypeIcon/FileTypeIcon.mjs.map +1 -1
- package/es/FileTypeIcon/components/FileIcon.mjs.map +1 -1
- package/es/FileTypeIcon/components/FolderIcon.mjs.map +1 -1
- package/es/FileTypeIcon/index.d.mts +2 -2
- package/es/FileTypeIcon/style.mjs.map +1 -1
- package/es/FileTypeIcon/type.d.mts +0 -1
- package/es/Flex/Center.d.mts +1 -2
- package/es/Flex/Center.mjs.map +1 -1
- package/es/Flex/FlexBasic.d.mts +2 -4
- package/es/Flex/FlexBasic.mjs.map +1 -1
- package/es/Flex/Flexbox.d.mts +2 -1
- package/es/Flex/index.d.mts +3 -2
- package/es/Flex/type.d.mts +1 -2
- package/es/Flex/utils.mjs.map +1 -1
- package/es/FluentEmoji/FluentEmoji.d.mts +1 -2
- package/es/FluentEmoji/FluentEmoji.mjs.map +1 -1
- package/es/FluentEmoji/index.d.mts +2 -2
- package/es/FluentEmoji/style.mjs.map +1 -1
- package/es/FluentEmoji/type.d.mts +0 -1
- package/es/FluentEmoji/utils.mjs +1 -1
- package/es/FluentEmoji/utils.mjs.map +1 -1
- package/es/FontLoader/index.d.mts +2 -4
- package/es/FontLoader/index.mjs.map +1 -1
- package/es/Footer/Footer.d.mts +2 -4
- package/es/Footer/Footer.mjs.map +1 -1
- package/es/Footer/index.d.mts +2 -2
- package/es/Footer/style.mjs.map +1 -1
- package/es/Footer/type.d.mts +1 -1
- package/es/Form/Form.mjs.map +1 -1
- package/es/Form/components/FormDivider.mjs.map +1 -1
- package/es/Form/components/FormFlatGroup.mjs.map +1 -1
- package/es/Form/components/FormGroup.d.mts +2 -4
- package/es/Form/components/FormGroup.mjs.map +1 -1
- package/es/Form/components/FormItem.d.mts +2 -4
- package/es/Form/components/FormItem.mjs.map +1 -1
- package/es/Form/components/FormProvider.mjs +1 -1
- package/es/Form/components/FormProvider.mjs.map +1 -1
- package/es/Form/components/FormSubmitFooter.d.mts +2 -4
- package/es/Form/components/FormSubmitFooter.mjs.map +1 -1
- package/es/Form/components/FormTitle.d.mts +1 -2
- package/es/Form/components/FormTitle.mjs.map +1 -1
- package/es/Form/components/merge.mjs.map +1 -1
- package/es/Form/index.d.mts +5 -6
- package/es/Form/style.mjs +1 -1
- package/es/Form/style.mjs.map +1 -1
- package/es/Form/type.d.mts +5 -1
- package/es/FormModal/FormModal.d.mts +2 -4
- package/es/FormModal/FormModal.mjs.map +1 -1
- package/es/FormModal/index.d.mts +2 -2
- package/es/FormModal/style.mjs.map +1 -1
- package/es/FormModal/type.d.mts +3 -1
- package/es/Freeze/Freeze.d.mts +2 -7
- package/es/Freeze/Freeze.mjs +1 -1
- package/es/Freeze/Freeze.mjs.map +1 -1
- package/es/Freeze/index.d.mts +2 -2
- package/es/Freeze/type.d.mts +0 -1
- package/es/Grid/Grid.d.mts +1 -2
- package/es/Grid/Grid.mjs.map +1 -1
- package/es/Grid/index.d.mts +2 -2
- package/es/Grid/style.mjs.map +1 -1
- package/es/Grid/type.d.mts +1 -1
- package/es/GroupAvatar/GroupAvatar.d.mts +1 -2
- package/es/GroupAvatar/GroupAvatar.mjs.map +1 -1
- package/es/GroupAvatar/index.d.mts +2 -2
- package/es/GroupAvatar/style.mjs +1 -1
- package/es/GroupAvatar/style.mjs.map +1 -1
- package/es/GroupAvatar/type.d.mts +0 -1
- package/es/GuideCard/GuideCard.d.mts +2 -4
- package/es/GuideCard/GuideCard.mjs.map +1 -1
- package/es/GuideCard/index.d.mts +2 -1
- package/es/GuideCard/style.mjs.map +1 -1
- package/es/GuideCard/type.d.mts +2 -1
- package/es/Header/Header.d.mts +2 -4
- package/es/Header/Header.mjs.map +1 -1
- package/es/Header/index.d.mts +2 -2
- package/es/Header/style.mjs.map +1 -1
- package/es/Header/type.d.mts +1 -1
- package/es/Highlighter/FullFeatured.mjs +2 -2
- package/es/Highlighter/FullFeatured.mjs.map +1 -1
- package/es/Highlighter/Highlighter.d.mts +2 -4
- package/es/Highlighter/Highlighter.mjs +2 -2
- package/es/Highlighter/Highlighter.mjs.map +1 -1
- package/es/Highlighter/LangSelect.mjs +1 -1
- package/es/Highlighter/LangSelect.mjs.map +1 -1
- package/es/Highlighter/SyntaxHighlighter/StaticRenderer.mjs.map +1 -1
- package/es/Highlighter/SyntaxHighlighter/StreamRenderer.mjs +2 -1
- package/es/Highlighter/SyntaxHighlighter/StreamRenderer.mjs.map +1 -1
- package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -4
- package/es/Highlighter/SyntaxHighlighter/index.mjs.map +1 -1
- package/es/Highlighter/SyntaxHighlighter/style.mjs +1 -1
- package/es/Highlighter/SyntaxHighlighter/style.mjs.map +1 -1
- package/es/Highlighter/const.mjs.map +1 -1
- package/es/Highlighter/index.d.mts +2 -2
- package/es/Highlighter/index.mjs +1 -1
- package/es/Highlighter/style.mjs +1 -1
- package/es/Highlighter/style.mjs.map +1 -1
- package/es/Highlighter/theme/lobe-theme.d.mts +1 -1
- package/es/Highlighter/theme/lobe-theme.mjs.map +1 -1
- package/es/Highlighter/type.d.mts +2 -1
- package/es/Hotkey/Hotkey.d.mts +2 -4
- package/es/Hotkey/Hotkey.mjs +2 -1
- package/es/Hotkey/Hotkey.mjs.map +1 -1
- package/es/Hotkey/const.mjs.map +1 -1
- package/es/Hotkey/index.d.mts +2 -2
- package/es/Hotkey/style.mjs +1 -1
- package/es/Hotkey/style.mjs.map +1 -1
- package/es/Hotkey/type.d.mts +1 -1
- package/es/Hotkey/utils.mjs.map +1 -1
- package/es/HotkeyInput/HotkeyInput.d.mts +2 -4
- package/es/HotkeyInput/HotkeyInput.mjs +2 -2
- package/es/HotkeyInput/HotkeyInput.mjs.map +1 -1
- package/es/HotkeyInput/index.d.mts +1 -1
- package/es/HotkeyInput/style.mjs.map +1 -1
- package/es/HotkeyInput/type.d.mts +0 -1
- package/es/HtmlPreview/HtmlPreview.d.mts +2 -4
- package/es/HtmlPreview/HtmlPreview.mjs +1 -1
- package/es/HtmlPreview/HtmlPreview.mjs.map +1 -1
- package/es/HtmlPreview/Iframe.d.mts +2 -4
- package/es/HtmlPreview/Iframe.mjs +1 -1
- package/es/HtmlPreview/Iframe.mjs.map +1 -1
- package/es/HtmlPreview/buildShellSrcDoc.mjs.map +1 -1
- package/es/HtmlPreview/buildStaticSrcDoc.mjs.map +1 -1
- package/es/HtmlPreview/const.mjs.map +1 -1
- package/es/HtmlPreview/index.d.mts +2 -2
- package/es/HtmlPreview/index.mjs +1 -1
- package/es/HtmlPreview/injectAutoHeightScript.mjs.map +1 -1
- package/es/HtmlPreview/type.d.mts +1 -1
- package/es/Icon/Icon.d.mts +2 -4
- package/es/Icon/Icon.mjs.map +1 -1
- package/es/Icon/components/IconProvider.d.mts +2 -4
- package/es/Icon/components/IconProvider.mjs.map +1 -1
- package/es/Icon/components/utils.mjs.map +1 -1
- package/es/Icon/index.d.mts +2 -2
- package/es/Icon/style.mjs +7 -6
- package/es/Icon/style.mjs.map +1 -1
- package/es/Icon/type.d.mts +0 -1
- package/es/Image/Image.mjs.map +1 -1
- package/es/Image/PreviewGroup.d.mts +2 -4
- package/es/Image/PreviewGroup.mjs.map +1 -1
- package/es/Image/components/Preview.mjs.map +1 -1
- package/es/Image/components/Toolbar.mjs.map +1 -1
- package/es/Image/components/usePreview.mjs +1 -1
- package/es/Image/components/usePreview.mjs.map +1 -1
- package/es/Image/components/usePreviewGroup.mjs +1 -1
- package/es/Image/components/usePreviewGroup.mjs.map +1 -1
- package/es/Image/index.d.mts +2 -3
- package/es/Image/style.mjs.map +1 -1
- package/es/Image/type.d.mts +0 -1
- package/es/ImageSelect/ImageSelect.d.mts +2 -4
- package/es/ImageSelect/ImageSelect.mjs +2 -2
- package/es/ImageSelect/ImageSelect.mjs.map +1 -1
- package/es/ImageSelect/index.d.mts +2 -1
- package/es/ImageSelect/styles.mjs.map +1 -1
- package/es/ImageSelect/type.d.mts +8 -1
- package/es/Img/index.mjs.map +1 -1
- package/es/Input/Input.d.mts +2 -4
- package/es/Input/Input.mjs.map +1 -1
- package/es/Input/InputNumber.d.mts +2 -4
- package/es/Input/InputNumber.mjs.map +1 -1
- package/es/Input/InputOPT.d.mts +2 -4
- package/es/Input/InputOPT.mjs.map +1 -1
- package/es/Input/InputPassword.d.mts +2 -4
- package/es/Input/InputPassword.mjs.map +1 -1
- package/es/Input/TextArea.d.mts +2 -4
- package/es/Input/TextArea.mjs.map +1 -1
- package/es/Input/index.d.mts +6 -5
- package/es/Input/style.mjs +1 -1
- package/es/Input/style.mjs.map +1 -1
- package/es/Input/type.d.mts +0 -1
- package/es/Layout/Layout.mjs +6 -6
- package/es/Layout/Layout.mjs.map +1 -1
- package/es/Layout/components/LayoutFooter.d.mts +3 -4
- package/es/Layout/components/LayoutFooter.mjs +1 -1
- package/es/Layout/components/LayoutFooter.mjs.map +1 -1
- package/es/Layout/components/LayoutHeader.d.mts +2 -4
- package/es/Layout/components/LayoutHeader.mjs +1 -1
- package/es/Layout/components/LayoutHeader.mjs.map +1 -1
- package/es/Layout/components/LayoutMain.d.mts +3 -4
- package/es/Layout/components/LayoutMain.mjs +1 -1
- package/es/Layout/components/LayoutMain.mjs.map +1 -1
- package/es/Layout/components/LayoutSidebar.d.mts +2 -4
- package/es/Layout/components/LayoutSidebar.mjs +1 -1
- package/es/Layout/components/LayoutSidebar.mjs.map +1 -1
- package/es/Layout/components/LayoutSidebarInner.d.mts +2 -4
- package/es/Layout/components/LayoutSidebarInner.mjs +1 -1
- package/es/Layout/components/LayoutSidebarInner.mjs.map +1 -1
- package/es/Layout/components/LayoutToc.d.mts +2 -4
- package/es/Layout/components/LayoutToc.mjs +1 -1
- package/es/Layout/components/LayoutToc.mjs.map +1 -1
- package/es/Layout/index.d.mts +1 -2
- package/es/Layout/index.mjs +6 -6
- package/es/Layout/style.mjs.map +1 -1
- package/es/Layout/type.d.mts +0 -1
- package/es/List/List.mjs.map +1 -1
- package/es/List/ListItem/index.d.mts +2 -4
- package/es/List/ListItem/index.mjs.map +1 -1
- package/es/List/ListItem/style.mjs.map +1 -1
- package/es/List/ListItem/time.mjs.map +1 -1
- package/es/List/index.d.mts +2 -3
- package/es/List/type.d.mts +1 -1
- package/es/Markdown/Markdown.d.mts +2 -4
- package/es/Markdown/Markdown.mjs +1 -1
- package/es/Markdown/Markdown.mjs.map +1 -1
- package/es/Markdown/SyntaxMarkdown/CachedMarkdown.mjs +1 -1
- package/es/Markdown/SyntaxMarkdown/CachedMarkdown.mjs.map +1 -1
- package/es/Markdown/SyntaxMarkdown/MarkdownRender.mjs.map +1 -1
- package/es/Markdown/SyntaxMarkdown/StreamdownRender.mjs +5 -3
- package/es/Markdown/SyntaxMarkdown/StreamdownRender.mjs.map +1 -1
- package/es/Markdown/SyntaxMarkdown/fenceState.mjs.map +1 -1
- package/es/Markdown/SyntaxMarkdown/streamAnimationMeta.mjs.map +1 -1
- package/es/Markdown/SyntaxMarkdown/style.mjs.map +1 -1
- package/es/Markdown/SyntaxMarkdown/useSmoothStreamContent.mjs +6 -2
- package/es/Markdown/SyntaxMarkdown/useSmoothStreamContent.mjs.map +1 -1
- package/es/Markdown/SyntaxMarkdown/useStreamQueue.mjs +2 -1
- package/es/Markdown/SyntaxMarkdown/useStreamQueue.mjs.map +1 -1
- package/es/Markdown/Typography.d.mts +2 -4
- package/es/Markdown/Typography.mjs.map +1 -1
- package/es/Markdown/components/CodeBlock.mjs +2 -2
- package/es/Markdown/components/CodeBlock.mjs.map +1 -1
- package/es/Markdown/components/Footnotes.mjs.map +1 -1
- package/es/Markdown/components/MarkdownProvider.mjs +3 -2
- package/es/Markdown/components/MarkdownProvider.mjs.map +1 -1
- package/es/Markdown/components/MarkdownTable/hastTableToMarkdown.mjs.map +1 -1
- package/es/Markdown/components/MarkdownTable/index.mjs.map +1 -1
- package/es/Markdown/components/SearchResultCards/SearchResultCard.mjs.map +1 -1
- package/es/Markdown/components/SearchResultCards/index.d.mts +3 -4
- package/es/Markdown/components/SearchResultCards/index.mjs.map +1 -1
- package/es/Markdown/components/SearchResultCards/style.mjs.map +1 -1
- package/es/Markdown/components/useDelayedAnimated.mjs.map +1 -1
- package/es/Markdown/index.d.mts +3 -3
- package/es/Markdown/markdown.style.mjs +11 -10
- package/es/Markdown/markdown.style.mjs.map +1 -1
- package/es/Markdown/plugins/rehypeCustomFootnotes.mjs +1 -1
- package/es/Markdown/plugins/rehypeCustomFootnotes.mjs.map +1 -1
- package/es/Markdown/plugins/rehypeKatexDir.d.mts +1 -2
- package/es/Markdown/plugins/rehypeKatexDir.mjs +1 -1
- package/es/Markdown/plugins/rehypeKatexDir.mjs.map +1 -1
- package/es/Markdown/plugins/rehypeStreamAnimated.d.mts +2 -3
- package/es/Markdown/plugins/rehypeStreamAnimated.mjs +3 -4
- package/es/Markdown/plugins/rehypeStreamAnimated.mjs.map +1 -1
- package/es/Markdown/plugins/remarkBr.mjs +1 -1
- package/es/Markdown/plugins/remarkBr.mjs.map +1 -1
- package/es/Markdown/plugins/remarkColor.mjs +1 -1
- package/es/Markdown/plugins/remarkColor.mjs.map +1 -1
- package/es/Markdown/plugins/remarkCustomFootnotes.mjs +2 -2
- package/es/Markdown/plugins/remarkCustomFootnotes.mjs.map +1 -1
- package/es/Markdown/plugins/remarkGfmPlus.mjs +1 -1
- package/es/Markdown/plugins/remarkGfmPlus.mjs.map +1 -1
- package/es/Markdown/plugins/remarkVideo.mjs +1 -1
- package/es/Markdown/plugins/remarkVideo.mjs.map +1 -1
- package/es/Markdown/streamProfiler/StreamdownProfilerProvider.mjs +1 -1
- package/es/Markdown/streamProfiler/StreamdownProfilerProvider.mjs.map +1 -1
- package/es/Markdown/style.mjs.map +1 -1
- package/es/Markdown/type.d.mts +4 -1
- package/es/MaskShadow/MaskShadow.d.mts +2 -4
- package/es/MaskShadow/MaskShadow.mjs.map +1 -1
- package/es/MaskShadow/index.d.mts +2 -2
- package/es/MaskShadow/style.mjs +1 -1
- package/es/MaskShadow/style.mjs.map +1 -1
- package/es/MaskShadow/type.d.mts +1 -0
- package/es/MaterialFileTypeIcon/MaterialFileTypeIcon.d.mts +1 -2
- package/es/MaterialFileTypeIcon/MaterialFileTypeIcon.mjs.map +1 -1
- package/es/MaterialFileTypeIcon/icon-map.json.d.mts +2 -2
- package/es/MaterialFileTypeIcon/index.d.mts +2 -2
- package/es/MaterialFileTypeIcon/type.d.mts +1 -2
- package/es/MaterialFileTypeIcon/utils.mjs +1 -1
- package/es/MaterialFileTypeIcon/utils.mjs.map +1 -1
- package/es/Menu/Menu.d.mts +2 -4
- package/es/Menu/Menu.mjs.map +1 -1
- package/es/Menu/baseItem.d.mts +1 -1
- package/es/Menu/checkboxItem.d.mts +1 -1
- package/es/Menu/index.d.mts +2 -2
- package/es/Menu/renderUtils.d.mts +1 -1
- package/es/Menu/renderUtils.mjs.map +1 -1
- package/es/Menu/style.mjs +1 -1
- package/es/Menu/style.mjs.map +1 -1
- package/es/Menu/switchItem.d.mts +1 -1
- package/es/Menu/type.d.mts +2 -2
- package/es/Menu/utils.d.mts +0 -1
- package/es/Menu/utils.mjs.map +1 -1
- package/es/Mermaid/FullFeatured.mjs +1 -1
- package/es/Mermaid/FullFeatured.mjs.map +1 -1
- package/es/Mermaid/Mermaid.d.mts +2 -4
- package/es/Mermaid/Mermaid.mjs +1 -1
- package/es/Mermaid/Mermaid.mjs.map +1 -1
- package/es/Mermaid/SyntaxMermaid/StaticMermaid.mjs +2 -1
- package/es/Mermaid/SyntaxMermaid/StaticMermaid.mjs.map +1 -1
- package/es/Mermaid/SyntaxMermaid/StreamMermaid.mjs +2 -1
- package/es/Mermaid/SyntaxMermaid/StreamMermaid.mjs.map +1 -1
- package/es/Mermaid/SyntaxMermaid/index.d.mts +2 -4
- package/es/Mermaid/SyntaxMermaid/index.mjs.map +1 -1
- package/es/Mermaid/SyntaxMermaid/style.mjs +1 -1
- package/es/Mermaid/SyntaxMermaid/style.mjs.map +1 -1
- package/es/Mermaid/const.mjs.map +1 -1
- package/es/Mermaid/index.d.mts +3 -3
- package/es/Mermaid/type.d.mts +1 -1
- package/es/Modal/Modal.d.mts +2 -4
- package/es/Modal/Modal.mjs.map +1 -1
- package/es/Modal/ModalProvider.d.mts +1 -3
- package/es/Modal/ModalProvider.mjs +1 -1
- package/es/Modal/ModalProvider.mjs.map +1 -1
- package/es/Modal/ModalStackItem.mjs.map +1 -1
- package/es/Modal/RawModalStackItem.mjs.map +1 -1
- package/es/Modal/imperative.d.mts +1 -5
- package/es/Modal/imperative.mjs.map +1 -1
- package/es/Modal/index.d.mts +2 -2
- package/es/Modal/style.mjs.map +1 -1
- package/es/Modal/type.d.mts +0 -1
- package/es/MotionProvider/index.d.mts +2 -5
- package/es/MotionProvider/index.mjs.map +1 -1
- package/es/NeuralNetworkLoading/NeuralNetworkLoading.d.mts +2 -4
- package/es/NeuralNetworkLoading/NeuralNetworkLoading.mjs.map +1 -1
- package/es/NeuralNetworkLoading/index.d.mts +2 -2
- package/es/NeuralNetworkLoading/type.d.mts +0 -1
- package/es/Popover/index.d.mts +4 -3
- package/es/Provider.d.mts +2 -1
- package/es/ScrollArea/index.d.mts +2 -1
- package/es/ScrollShadow/ScrollShadow.d.mts +1 -2
- package/es/ScrollShadow/ScrollShadow.mjs.map +1 -1
- package/es/ScrollShadow/index.d.mts +2 -2
- package/es/ScrollShadow/style.mjs +1 -1
- package/es/ScrollShadow/style.mjs.map +1 -1
- package/es/ScrollShadow/type.d.mts +1 -1
- package/es/ScrollShadow/useScrollOverflow.mjs.map +1 -1
- package/es/SearchBar/SearchBar.d.mts +2 -4
- package/es/SearchBar/SearchBar.mjs +2 -2
- package/es/SearchBar/SearchBar.mjs.map +1 -1
- package/es/SearchBar/index.d.mts +2 -2
- package/es/SearchBar/style.mjs.map +1 -1
- package/es/SearchBar/type.d.mts +1 -1
- package/es/Segmented/Segmented.d.mts +2 -4
- package/es/Segmented/Segmented.mjs.map +1 -1
- package/es/Segmented/index.d.mts +2 -2
- package/es/Segmented/style.mjs +1 -1
- package/es/Segmented/style.mjs.map +1 -1
- package/es/Segmented/type.d.mts +1 -1
- package/es/Select/Select.d.mts +2 -4
- package/es/Select/Select.mjs.map +1 -1
- package/es/Select/index.d.mts +2 -2
- package/es/Select/style.mjs +1 -1
- package/es/Select/style.mjs.map +1 -1
- package/es/Select/type.d.mts +1 -1
- package/es/SideNav/SideNav.d.mts +2 -4
- package/es/SideNav/SideNav.mjs.map +1 -1
- package/es/SideNav/index.d.mts +2 -2
- package/es/SideNav/style.mjs.map +1 -1
- package/es/SideNav/type.d.mts +1 -1
- package/es/Skeleton/Skeleton.mjs.map +1 -1
- package/es/Skeleton/SkeletonAvatar.d.mts +1 -2
- package/es/Skeleton/SkeletonAvatar.mjs.map +1 -1
- package/es/Skeleton/SkeletonBlock.d.mts +1 -2
- package/es/Skeleton/SkeletonBlock.mjs.map +1 -1
- package/es/Skeleton/SkeletonButton.d.mts +1 -2
- package/es/Skeleton/SkeletonButton.mjs.map +1 -1
- package/es/Skeleton/SkeletonParagraph.d.mts +1 -2
- package/es/Skeleton/SkeletonParagraph.mjs.map +1 -1
- package/es/Skeleton/SkeletonTags.d.mts +1 -2
- package/es/Skeleton/SkeletonTags.mjs.map +1 -1
- package/es/Skeleton/SkeletonTitle.d.mts +1 -2
- package/es/Skeleton/SkeletonTitle.mjs.map +1 -1
- package/es/Skeleton/index.d.mts +7 -8
- package/es/Skeleton/style.mjs.map +1 -1
- package/es/Skeleton/type.d.mts +0 -1
- package/es/SliderWithInput/SliderWithInput.d.mts +2 -4
- package/es/SliderWithInput/SliderWithInput.mjs.map +1 -1
- package/es/SliderWithInput/index.d.mts +2 -2
- package/es/SliderWithInput/type.d.mts +2 -1
- package/es/Snippet/Snippet.d.mts +1 -2
- package/es/Snippet/Snippet.mjs.map +1 -1
- package/es/Snippet/index.d.mts +2 -2
- package/es/Snippet/style.mjs.map +1 -1
- package/es/Snippet/type.d.mts +1 -1
- package/es/SortableList/SortableList.d.mts +3 -4
- package/es/SortableList/SortableList.mjs.map +1 -1
- package/es/SortableList/components/DragHandle.d.mts +3 -4
- package/es/SortableList/components/DragHandle.mjs.map +1 -1
- package/es/SortableList/components/SortableItem.d.mts +4 -3
- package/es/SortableList/components/SortableItem.mjs +10 -9
- package/es/SortableList/components/SortableItem.mjs.map +1 -1
- package/es/SortableList/components/SortableOverlay.mjs.map +1 -1
- package/es/SortableList/index.d.mts +2 -2
- package/es/SortableList/style.mjs.map +1 -1
- package/es/SortableList/type.d.mts +5 -1
- package/es/Tabs/Tabs.d.mts +1 -2
- package/es/Tabs/Tabs.mjs.map +1 -1
- package/es/Tabs/index.d.mts +2 -2
- package/es/Tabs/style.mjs.map +1 -1
- package/es/Tabs/type.d.mts +0 -1
- package/es/Tag/Tag.d.mts +1 -2
- package/es/Tag/Tag.mjs.map +1 -1
- package/es/Tag/index.d.mts +2 -1
- package/es/Tag/styles.mjs +1 -1
- package/es/Tag/styles.mjs.map +1 -1
- package/es/Tag/type.d.mts +0 -1
- package/es/Tag/utils.mjs +1 -1
- package/es/Tag/utils.mjs.map +1 -1
- package/es/Text/Text.d.mts +1 -2
- package/es/Text/Text.mjs +1 -1
- package/es/Text/Text.mjs.map +1 -1
- package/es/Text/index.d.mts +2 -2
- package/es/Text/styles.mjs +1 -1
- package/es/Text/styles.mjs.map +1 -1
- package/es/Text/type.d.mts +1 -1
- package/es/ThemeProvider/AppElementContext.mjs.map +1 -1
- package/es/ThemeProvider/ConfigProvider.mjs.map +1 -1
- package/es/ThemeProvider/GlobalStyle/antdOverride.mjs.map +1 -1
- package/es/ThemeProvider/GlobalStyle/essential.mjs +90 -0
- package/es/ThemeProvider/GlobalStyle/essential.mjs.map +1 -0
- package/es/ThemeProvider/GlobalStyle/global.mjs +0 -79
- package/es/ThemeProvider/GlobalStyle/global.mjs.map +1 -1
- package/es/ThemeProvider/GlobalStyle/index.mjs +4 -2
- package/es/ThemeProvider/GlobalStyle/index.mjs.map +1 -1
- package/es/ThemeProvider/Meta.d.mts +1 -2
- package/es/ThemeProvider/Meta.mjs.map +1 -1
- package/es/ThemeProvider/ThemeProvider.d.mts +2 -4
- package/es/ThemeProvider/ThemeProvider.mjs +25 -21
- package/es/ThemeProvider/ThemeProvider.mjs.map +1 -1
- package/es/ThemeProvider/index.d.mts +3 -3
- package/es/ThemeProvider/type.d.mts +2 -1
- package/es/ThemeSwitch/ThemeSwitch.d.mts +1 -2
- package/es/ThemeSwitch/ThemeSwitch.mjs.map +1 -1
- package/es/ThemeSwitch/index.d.mts +2 -2
- package/es/ThemeSwitch/type.d.mts +1 -1
- package/es/Toast/index.d.mts +2 -1
- package/es/Toc/Toc.d.mts +2 -4
- package/es/Toc/Toc.mjs.map +1 -1
- package/es/Toc/TocMobile.mjs +2 -2
- package/es/Toc/TocMobile.mjs.map +1 -1
- package/es/Toc/index.d.mts +2 -2
- package/es/Toc/style.mjs.map +1 -1
- package/es/Toc/type.d.mts +0 -1
- package/es/Toc/utils.mjs.map +1 -1
- package/es/Tooltip/index.d.mts +3 -2
- package/es/Tooltip/index.mjs +1 -1
- package/es/Video/index.d.mts +3 -4
- package/es/Video/index.mjs.map +1 -1
- package/es/Video/style.mjs +1 -1
- package/es/Video/style.mjs.map +1 -1
- package/es/awesome/AuroraBackground/AuroraBackground.d.mts +2 -4
- package/es/awesome/AuroraBackground/AuroraBackground.mjs.map +1 -1
- package/es/awesome/AuroraBackground/index.d.mts +2 -1
- package/es/awesome/AuroraBackground/style.mjs.map +1 -1
- package/es/awesome/AuroraBackground/type.d.mts +1 -1
- package/es/awesome/BottomGradientButton/BottomGradientButton.d.mts +3 -4
- package/es/awesome/BottomGradientButton/BottomGradientButton.mjs.map +1 -1
- package/es/awesome/BottomGradientButton/index.d.mts +3 -2
- package/es/awesome/BottomGradientButton/style.mjs.map +1 -1
- package/es/awesome/BottomGradientButton/type.d.mts +1 -0
- package/es/awesome/Features/FeatureItem.mjs.map +1 -1
- package/es/awesome/Features/Features.d.mts +2 -4
- package/es/awesome/Features/Features.mjs.map +1 -1
- package/es/awesome/Features/index.d.mts +2 -1
- package/es/awesome/Features/style.mjs.map +1 -1
- package/es/awesome/Features/type.d.mts +2 -1
- package/es/awesome/Giscus/Giscus.d.mts +2 -4
- package/es/awesome/Giscus/Giscus.mjs.map +1 -1
- package/es/awesome/Giscus/index.d.mts +2 -1
- package/es/awesome/Giscus/style.mjs.map +1 -1
- package/es/awesome/Giscus/type.d.mts +0 -1
- package/es/awesome/GradientButton/GradientButton.d.mts +2 -4
- package/es/awesome/GradientButton/GradientButton.mjs.map +1 -1
- package/es/awesome/GradientButton/index.d.mts +2 -1
- package/es/awesome/GradientButton/style.mjs.map +1 -1
- package/es/awesome/GradientButton/type.d.mts +1 -0
- package/es/awesome/GridBackground/GridBackground.d.mts +2 -4
- package/es/awesome/GridBackground/GridBackground.mjs.map +1 -1
- package/es/awesome/GridBackground/GridShowcase.d.mts +2 -4
- package/es/awesome/GridBackground/GridShowcase.mjs.map +1 -1
- package/es/awesome/GridBackground/components/Grid.mjs.map +1 -1
- package/es/awesome/GridBackground/index.d.mts +3 -2
- package/es/awesome/GridBackground/style.mjs.map +1 -1
- package/es/awesome/GridBackground/type.d.mts +1 -1
- package/es/awesome/Hero/Hero.d.mts +2 -4
- package/es/awesome/Hero/Hero.mjs.map +1 -1
- package/es/awesome/Hero/index.d.mts +2 -1
- package/es/awesome/Hero/style.mjs.map +1 -1
- package/es/awesome/Hero/type.d.mts +0 -1
- package/es/awesome/Spline/ParentSize.mjs.map +1 -1
- package/es/awesome/Spline/Spine.d.mts +3 -3
- package/es/awesome/Spline/Spine.mjs.map +1 -1
- package/es/awesome/Spline/index.d.mts +2 -1
- package/es/awesome/Spline/type.d.mts +0 -1
- package/es/awesome/Spotlight/Spotlight.d.mts +2 -4
- package/es/awesome/Spotlight/Spotlight.mjs.map +1 -1
- package/es/awesome/Spotlight/index.d.mts +2 -1
- package/es/awesome/Spotlight/style.mjs.map +1 -1
- package/es/awesome/Spotlight/type.d.mts +0 -1
- package/es/awesome/Spotlight/useMouseOffset.mjs.map +1 -1
- package/es/awesome/SpotlightCard/SpotlightCard.d.mts +2 -4
- package/es/awesome/SpotlightCard/SpotlightCard.mjs.map +1 -1
- package/es/awesome/SpotlightCard/SpotlightCardItem.mjs.map +1 -1
- package/es/awesome/SpotlightCard/index.d.mts +2 -1
- package/es/awesome/SpotlightCard/style.mjs.map +1 -1
- package/es/awesome/SpotlightCard/type.d.mts +0 -1
- package/es/awesome/TypewriterEffect/TypewriterEffect.d.mts +2 -4
- package/es/awesome/TypewriterEffect/TypewriterEffect.mjs.map +1 -1
- package/es/awesome/TypewriterEffect/index.d.mts +2 -1
- package/es/awesome/TypewriterEffect/style.mjs.map +1 -1
- package/es/awesome/TypewriterEffect/type.d.mts +0 -1
- package/es/awesome/index.d.mts +23 -12
- package/es/base-ui/AutoComplete/AutoComplete.d.mts +2 -4
- package/es/base-ui/AutoComplete/AutoComplete.mjs.map +1 -1
- package/es/base-ui/AutoComplete/index.d.mts +3 -2
- package/es/base-ui/AutoComplete/style.mjs.map +1 -1
- package/es/base-ui/AutoComplete/type.d.mts +1 -1
- package/es/base-ui/Button/Button.d.mts +2 -25
- package/es/base-ui/Button/Button.mjs +17 -7
- package/es/base-ui/Button/Button.mjs.map +1 -1
- package/es/base-ui/Button/SplitButton.d.mts +5 -18
- package/es/base-ui/Button/SplitButton.mjs +14 -13
- package/es/base-ui/Button/SplitButton.mjs.map +1 -1
- package/es/base-ui/Button/index.d.mts +4 -3
- package/es/base-ui/Button/style.mjs.map +1 -1
- package/es/base-ui/Button/type.d.mts +1 -1
- package/es/base-ui/Checkbox/Checkbox.d.mts +2 -4
- package/es/base-ui/Checkbox/Checkbox.mjs.map +1 -1
- package/es/base-ui/Checkbox/CheckboxGroup.d.mts +2 -4
- package/es/base-ui/Checkbox/CheckboxGroup.mjs.map +1 -1
- package/es/base-ui/Checkbox/index.d.mts +4 -3
- package/es/base-ui/Checkbox/style.mjs.map +1 -1
- package/es/base-ui/Checkbox/type.d.mts +2 -1
- package/es/base-ui/ContextMenu/ContextMenuHost.d.mts +1 -3
- package/es/base-ui/ContextMenu/ContextMenuHost.mjs.map +1 -1
- package/es/base-ui/ContextMenu/ContextMenuTrigger.d.mts +0 -1
- package/es/base-ui/ContextMenu/ContextMenuTrigger.mjs.map +1 -1
- package/es/base-ui/ContextMenu/imperative.d.mts +2 -1
- package/es/base-ui/ContextMenu/index.d.mts +4 -1
- package/es/base-ui/ContextMenu/renderItems.d.mts +4 -1
- package/es/base-ui/ContextMenu/renderItems.mjs.map +1 -1
- package/es/base-ui/ContextMenu/store.d.mts +3 -0
- package/es/base-ui/ContextMenu/store.mjs +9 -6
- package/es/base-ui/ContextMenu/store.mjs.map +1 -1
- package/es/base-ui/ContextMenu/type.d.mts +1 -0
- package/es/base-ui/DropdownMenu/DropdownMenu.d.mts +2 -4
- package/es/base-ui/DropdownMenu/DropdownMenu.mjs.map +1 -1
- package/es/base-ui/DropdownMenu/atoms.d.mts +22 -104
- package/es/base-ui/DropdownMenu/atoms.mjs.map +1 -1
- package/es/base-ui/DropdownMenu/index.d.mts +2 -1
- package/es/base-ui/DropdownMenu/renderItems.d.mts +2 -2
- package/es/base-ui/DropdownMenu/renderItems.mjs.map +1 -1
- package/es/base-ui/DropdownMenu/sharedStyle.mjs.map +1 -1
- package/es/base-ui/DropdownMenu/type.d.mts +3 -1
- package/es/base-ui/FloatingPanel/FloatingPanel.d.mts +1 -3
- package/es/base-ui/FloatingPanel/FloatingPanel.mjs +2 -1
- package/es/base-ui/FloatingPanel/FloatingPanel.mjs.map +1 -1
- package/es/base-ui/FloatingPanel/index.d.mts +2 -1
- package/es/base-ui/FloatingPanel/style.mjs.map +1 -1
- package/es/base-ui/FloatingPanel/type.d.mts +2 -2
- package/es/base-ui/FloatingSheet/FloatingSheet.d.mts +1 -22
- package/es/base-ui/FloatingSheet/FloatingSheet.mjs +6 -3
- package/es/base-ui/FloatingSheet/FloatingSheet.mjs.map +1 -1
- package/es/base-ui/FloatingSheet/FloatingSheetHeader.mjs.map +1 -1
- package/es/base-ui/FloatingSheet/helpers.mjs.map +1 -1
- package/es/base-ui/FloatingSheet/index.d.mts +2 -1
- package/es/base-ui/FloatingSheet/style.mjs.map +1 -1
- package/es/base-ui/FloatingSheet/type.d.mts +0 -1
- package/es/base-ui/FloatingSheet/useSheetDrag.mjs.map +1 -1
- package/es/base-ui/FloatingSheet/useSnapPoints.mjs.map +1 -1
- package/es/base-ui/Form/Form.mjs.map +1 -1
- package/es/base-ui/Form/components/FormDivider.d.mts +1 -2
- package/es/base-ui/Form/components/FormDivider.mjs.map +1 -1
- package/es/base-ui/Form/components/FormField.d.mts +2 -4
- package/es/base-ui/Form/components/FormField.mjs.map +1 -1
- package/es/base-ui/Form/components/FormFlatGroup.d.mts +2 -4
- package/es/base-ui/Form/components/FormFlatGroup.mjs.map +1 -1
- package/es/base-ui/Form/components/FormFooter.d.mts +1 -2
- package/es/base-ui/Form/components/FormFooter.mjs.map +1 -1
- package/es/base-ui/Form/components/FormGroup.d.mts +2 -4
- package/es/base-ui/Form/components/FormGroup.mjs.map +1 -1
- package/es/base-ui/Form/components/FormSubmitFooter.d.mts +2 -4
- package/es/base-ui/Form/components/FormSubmitFooter.mjs.map +1 -1
- package/es/base-ui/Form/components/FormTitle.d.mts +1 -2
- package/es/base-ui/Form/components/FormTitle.mjs.map +1 -1
- package/es/base-ui/Form/context.mjs.map +1 -1
- package/es/base-ui/Form/index.d.mts +17 -18
- package/es/base-ui/Form/index.mjs +2 -2
- package/es/base-ui/Form/index.mjs.map +1 -1
- package/es/base-ui/Form/style.mjs +1 -1
- package/es/base-ui/Form/style.mjs.map +1 -1
- package/es/base-ui/Form/type.d.mts +4 -1
- package/es/base-ui/Input/Input.d.mts +2 -4
- package/es/base-ui/Input/Input.mjs.map +1 -1
- package/es/base-ui/Input/InputNumber.d.mts +2 -4
- package/es/base-ui/Input/InputNumber.mjs.map +1 -1
- package/es/base-ui/Input/InputOTP.d.mts +2 -4
- package/es/base-ui/Input/InputOTP.mjs.map +1 -1
- package/es/base-ui/Input/InputPassword.d.mts +2 -4
- package/es/base-ui/Input/InputPassword.mjs.map +1 -1
- package/es/base-ui/Input/TextArea.d.mts +2 -4
- package/es/base-ui/Input/TextArea.mjs.map +1 -1
- package/es/base-ui/Input/index.d.mts +6 -5
- package/es/base-ui/Input/style.d.mts +3 -5
- package/es/base-ui/Input/style.mjs.map +1 -1
- package/es/base-ui/Input/type.d.mts +0 -1
- package/es/base-ui/Modal/Modal.d.mts +1 -2
- package/es/base-ui/Modal/Modal.mjs.map +1 -1
- package/es/base-ui/Modal/ModalLayerContext.mjs.map +1 -1
- package/es/base-ui/Modal/atoms.d.mts +11 -58
- package/es/base-ui/Modal/atoms.mjs.map +1 -1
- package/es/base-ui/Modal/constants.d.mts +0 -1
- package/es/base-ui/Modal/constants.mjs.map +1 -1
- package/es/base-ui/Modal/context.d.mts +1 -3
- package/es/base-ui/Modal/context.mjs.map +1 -1
- package/es/base-ui/Modal/imperative.d.mts +1 -3
- package/es/base-ui/Modal/imperative.mjs +2 -1
- package/es/base-ui/Modal/imperative.mjs.map +1 -1
- package/es/base-ui/Modal/index.d.mts +2 -1
- package/es/base-ui/Modal/style.mjs.map +1 -1
- package/es/base-ui/Modal/type.d.mts +1 -1
- package/es/base-ui/Popover/ArrowIcon.d.mts +1 -3
- package/es/base-ui/Popover/ArrowIcon.mjs.map +1 -1
- package/es/base-ui/Popover/Popover.d.mts +1 -2
- package/es/base-ui/Popover/Popover.mjs +2 -2
- package/es/base-ui/Popover/Popover.mjs.map +1 -1
- package/es/base-ui/Popover/PopoverGroup.d.mts +1 -2
- package/es/base-ui/Popover/PopoverGroup.mjs.map +1 -1
- package/es/base-ui/Popover/PopoverInGroup.mjs.map +1 -1
- package/es/base-ui/Popover/PopoverPortal.mjs.map +1 -1
- package/es/base-ui/Popover/PopoverStandalone.mjs +6 -3
- package/es/base-ui/Popover/PopoverStandalone.mjs.map +1 -1
- package/es/base-ui/Popover/atoms.d.mts +7 -41
- package/es/base-ui/Popover/atoms.mjs.map +1 -1
- package/es/base-ui/Popover/context.d.mts +1 -3
- package/es/base-ui/Popover/context.mjs +1 -1
- package/es/base-ui/Popover/context.mjs.map +1 -1
- package/es/base-ui/Popover/groupContext.d.mts +0 -1
- package/es/base-ui/Popover/groupContext.mjs.map +1 -1
- package/es/base-ui/Popover/hoverOnlyPress.mjs.map +1 -1
- package/es/base-ui/Popover/index.d.mts +4 -3
- package/es/base-ui/Popover/style.mjs.map +1 -1
- package/es/base-ui/Popover/type.d.mts +1 -1
- package/es/base-ui/Popover/useMergedPopoverProps.mjs.map +1 -1
- package/es/base-ui/ScrollArea/ScrollArea.d.mts +0 -1
- package/es/base-ui/ScrollArea/ScrollArea.mjs.map +1 -1
- package/es/base-ui/ScrollArea/atoms.d.mts +6 -26
- package/es/base-ui/ScrollArea/atoms.mjs.map +1 -1
- package/es/base-ui/ScrollArea/globalStyle.mjs.map +1 -1
- package/es/base-ui/ScrollArea/index.d.mts +2 -1
- package/es/base-ui/ScrollArea/style.mjs.map +1 -1
- package/es/base-ui/ScrollArea/type.d.mts +0 -1
- package/es/base-ui/Segmented/Segmented.d.mts +2 -23
- package/es/base-ui/Segmented/Segmented.mjs +2 -2
- package/es/base-ui/Segmented/Segmented.mjs.map +1 -1
- package/es/base-ui/Segmented/atoms.d.mts +2 -16
- package/es/base-ui/Segmented/atoms.mjs.map +1 -1
- package/es/base-ui/Segmented/index.d.mts +2 -1
- package/es/base-ui/Segmented/style.mjs.map +1 -1
- package/es/base-ui/Segmented/type.d.mts +0 -1
- package/es/base-ui/Select/Select.d.mts +2 -4
- package/es/base-ui/Select/Select.mjs.map +1 -1
- package/es/base-ui/Select/atoms.d.mts +17 -77
- package/es/base-ui/Select/atoms.mjs.map +1 -1
- package/es/base-ui/Select/helpers.mjs.map +1 -1
- package/es/base-ui/Select/hooks.mjs.map +1 -1
- package/es/base-ui/Select/index.d.mts +2 -1
- package/es/base-ui/Select/parts.mjs.map +1 -1
- package/es/base-ui/Select/renderOptions.mjs.map +1 -1
- package/es/base-ui/Select/style.mjs +0 -6
- package/es/base-ui/Select/style.mjs.map +1 -1
- package/es/base-ui/Select/type.d.mts +2 -2
- package/es/base-ui/Slider/Slider.d.mts +2 -4
- package/es/base-ui/Slider/Slider.mjs.map +1 -1
- package/es/base-ui/Slider/SliderWithInput.d.mts +2 -4
- package/es/base-ui/Slider/SliderWithInput.mjs.map +1 -1
- package/es/base-ui/Slider/index.d.mts +4 -3
- package/es/base-ui/Slider/style.mjs.map +1 -1
- package/es/base-ui/Slider/type.d.mts +2 -1
- package/es/base-ui/SubmenuArrowIcon.mjs.map +1 -1
- package/es/base-ui/Switch/Switch.d.mts +2 -4
- package/es/base-ui/Switch/Switch.mjs.map +1 -1
- package/es/base-ui/Switch/atoms.d.mts +4 -35
- package/es/base-ui/Switch/atoms.mjs +3 -3
- package/es/base-ui/Switch/atoms.mjs.map +1 -1
- package/es/base-ui/Switch/index.d.mts +2 -1
- package/es/base-ui/Switch/style.mjs.map +1 -1
- package/es/base-ui/Switch/type.d.mts +0 -1
- package/es/base-ui/Tabs/Tabs.d.mts +1 -2
- package/es/base-ui/Tabs/Tabs.mjs +2 -2
- package/es/base-ui/Tabs/Tabs.mjs.map +1 -1
- package/es/base-ui/Tabs/atoms.d.mts +1 -2
- package/es/base-ui/Tabs/atoms.mjs +6 -5
- package/es/base-ui/Tabs/atoms.mjs.map +1 -1
- package/es/base-ui/Tabs/index.d.mts +2 -1
- package/es/base-ui/Tabs/style.mjs.map +1 -1
- package/es/base-ui/Tabs/type.d.mts +0 -1
- package/es/base-ui/Toast/Toast.mjs.map +1 -1
- package/es/base-ui/Toast/context.mjs.map +1 -1
- package/es/base-ui/Toast/imperative.d.mts +1 -10
- package/es/base-ui/Toast/imperative.mjs +16 -12
- package/es/base-ui/Toast/imperative.mjs.map +1 -1
- package/es/base-ui/Toast/index.d.mts +2 -1
- package/es/base-ui/Toast/style.mjs.map +1 -1
- package/es/base-ui/Toast/type.d.mts +1 -1
- package/es/base-ui/Tooltip/ArrowIcon.mjs.map +1 -1
- package/es/base-ui/Tooltip/Tooltip.d.mts +1 -2
- package/es/base-ui/Tooltip/Tooltip.mjs +1 -1
- package/es/base-ui/Tooltip/Tooltip.mjs.map +1 -1
- package/es/base-ui/Tooltip/TooltipContent.mjs.map +1 -1
- package/es/base-ui/Tooltip/TooltipGroup.d.mts +1 -2
- package/es/base-ui/Tooltip/TooltipGroup.mjs.map +1 -1
- package/es/base-ui/Tooltip/TooltipInGroup.mjs.map +1 -1
- package/es/base-ui/Tooltip/TooltipStandalone.mjs.map +1 -1
- package/es/base-ui/Tooltip/groupContext.mjs.map +1 -1
- package/es/base-ui/Tooltip/index.d.mts +2 -1
- package/es/base-ui/Tooltip/style.mjs.map +1 -1
- package/es/base-ui/Tooltip/type.d.mts +1 -1
- package/es/base-ui/Tooltip/useMergedTooltipProps.mjs.map +1 -1
- package/es/base-ui/controlSize.mjs.map +1 -1
- package/es/base-ui/index.d.mts +47 -28
- package/es/base-ui/index.mjs +4 -3
- package/es/base-ui/zIndex/constants.mjs.map +1 -1
- package/es/base-ui/zIndex/manager.mjs.map +1 -1
- package/es/base-ui/zIndex/useLayerZIndex.mjs.map +1 -1
- package/es/brand/BrandLoading/index.d.mts +1 -2
- package/es/brand/BrandLoading/index.mjs.map +1 -1
- package/es/brand/LobeChat/index.d.mts +2 -4
- package/es/brand/LobeChat/index.mjs +1 -1
- package/es/brand/LobeChat/index.mjs.map +1 -1
- package/es/brand/LobeChatText/index.d.mts +1 -2
- package/es/brand/LobeChatText/index.mjs.map +1 -1
- package/es/brand/LobeHub/index.d.mts +2 -4
- package/es/brand/LobeHub/index.mjs +1 -1
- package/es/brand/LobeHub/index.mjs.map +1 -1
- package/es/brand/LobeHub/style.mjs.map +1 -1
- package/es/brand/LobeHubText/index.d.mts +1 -2
- package/es/brand/LobeHubText/index.mjs.map +1 -1
- package/es/brand/Logo3d/index.d.mts +1 -2
- package/es/brand/Logo3d/index.mjs.map +1 -1
- package/es/brand/LogoFlat/index.d.mts +2 -4
- package/es/brand/LogoMono/index.d.mts +1 -1
- package/es/brand/LogoMono/index.mjs +1 -1
- package/es/brand/LogoThree/Loading.mjs.map +1 -1
- package/es/brand/LogoThree/LogoSpline.d.mts +3 -4
- package/es/brand/LogoThree/LogoSpline.mjs.map +1 -1
- package/es/brand/LogoThree/index.d.mts +3 -4
- package/es/brand/LogoThree/index.mjs.map +1 -1
- package/es/brand/components/Divider.mjs.map +1 -1
- package/es/brand/index.d.mts +10 -10
- package/es/brand/index.mjs +1 -1
- package/es/chat/BackBottom/BackBottom.d.mts +2 -4
- package/es/chat/BackBottom/BackBottom.mjs.map +1 -1
- package/es/chat/BackBottom/index.d.mts +2 -1
- package/es/chat/BackBottom/style.mjs.map +1 -1
- package/es/chat/BackBottom/type.d.mts +0 -1
- package/es/chat/ChatHeader/ChatHeader.mjs.map +1 -1
- package/es/chat/ChatHeader/ChatHeaderTitle.d.mts +1 -2
- package/es/chat/ChatHeader/ChatHeaderTitle.mjs.map +1 -1
- package/es/chat/ChatHeader/index.d.mts +2 -3
- package/es/chat/ChatHeader/index.mjs +1 -1
- package/es/chat/ChatHeader/style.mjs.map +1 -1
- package/es/chat/ChatHeader/type.d.mts +5 -1
- package/es/chat/ChatInputArea/ChatInputArea.mjs.map +1 -1
- package/es/chat/ChatInputArea/components/ChatInputActionBar.d.mts +1 -2
- package/es/chat/ChatInputArea/components/ChatInputActionBar.mjs.map +1 -1
- package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -4
- package/es/chat/ChatInputArea/components/ChatInputAreaInner.mjs.map +1 -1
- package/es/chat/ChatInputArea/components/ChatSendButton.d.mts +1 -2
- package/es/chat/ChatInputArea/components/ChatSendButton.mjs.map +1 -1
- package/es/chat/ChatInputArea/index.d.mts +4 -5
- package/es/chat/ChatInputArea/index.mjs +1 -1
- package/es/chat/ChatInputArea/style.mjs.map +1 -1
- package/es/chat/ChatInputArea/type.d.mts +3 -1
- package/es/chat/ChatItem/ChatItem.d.mts +2 -4
- package/es/chat/ChatItem/ChatItem.mjs.map +1 -1
- package/es/chat/ChatItem/components/Actions.mjs.map +1 -1
- package/es/chat/ChatItem/components/Avatar.mjs.map +1 -1
- package/es/chat/ChatItem/components/BorderSpacing.mjs.map +1 -1
- package/es/chat/ChatItem/components/ErrorContent.mjs.map +1 -1
- package/es/chat/ChatItem/components/Loading.mjs.map +1 -1
- package/es/chat/ChatItem/components/MessageContent.mjs.map +1 -1
- package/es/chat/ChatItem/components/Title.mjs.map +1 -1
- package/es/chat/ChatItem/index.d.mts +2 -1
- package/es/chat/ChatItem/style.mjs.map +1 -1
- package/es/chat/ChatItem/type.d.mts +8 -3
- package/es/chat/ChatList/ChatList.d.mts +2 -4
- package/es/chat/ChatList/ChatList.mjs.map +1 -1
- package/es/chat/ChatList/components/ChatActionsBar.d.mts +1 -2
- package/es/chat/ChatList/components/ChatActionsBar.mjs.map +1 -1
- package/es/chat/ChatList/components/ChatListItem.mjs.map +1 -1
- package/es/chat/ChatList/components/HistoryDivider.mjs.map +1 -1
- package/es/chat/ChatList/components/useChatListActionsBar.mjs.map +1 -1
- package/es/chat/ChatList/index.d.mts +3 -2
- package/es/chat/ChatList/style.mjs.map +1 -1
- package/es/chat/ChatList/type.d.mts +5 -2
- package/es/chat/EditableMessage/EditableMessage.d.mts +2 -4
- package/es/chat/EditableMessage/EditableMessage.mjs +3 -3
- package/es/chat/EditableMessage/EditableMessage.mjs.map +1 -1
- package/es/chat/EditableMessage/index.d.mts +2 -1
- package/es/chat/EditableMessage/type.d.mts +3 -1
- package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -4
- package/es/chat/EditableMessageList/EditableMessageList.mjs +2 -1
- package/es/chat/EditableMessageList/EditableMessageList.mjs.map +1 -1
- package/es/chat/EditableMessageList/index.d.mts +2 -1
- package/es/chat/EditableMessageList/messageReducer.mjs.map +1 -1
- package/es/chat/EditableMessageList/type.d.mts +1 -0
- package/es/chat/LoadingDots/LoadingDots.d.mts +1 -2
- package/es/chat/LoadingDots/LoadingDots.mjs.map +1 -1
- package/es/chat/LoadingDots/index.d.mts +2 -1
- package/es/chat/LoadingDots/style.mjs.map +1 -1
- package/es/chat/LoadingDots/type.d.mts +0 -1
- package/es/chat/MessageInput/MessageInput.d.mts +2 -4
- package/es/chat/MessageInput/MessageInput.mjs +1 -1
- package/es/chat/MessageInput/MessageInput.mjs.map +1 -1
- package/es/chat/MessageInput/index.d.mts +2 -1
- package/es/chat/MessageInput/style.mjs.map +1 -1
- package/es/chat/MessageInput/type.d.mts +3 -1
- package/es/chat/MessageModal/MessageModal.d.mts +2 -4
- package/es/chat/MessageModal/MessageModal.mjs +3 -3
- package/es/chat/MessageModal/MessageModal.mjs.map +1 -1
- package/es/chat/MessageModal/index.d.mts +2 -1
- package/es/chat/MessageModal/type.d.mts +2 -1
- package/es/chat/TokenTag/TokenTag.d.mts +1 -2
- package/es/chat/TokenTag/TokenTag.mjs.map +1 -1
- package/es/chat/TokenTag/index.d.mts +2 -1
- package/es/chat/TokenTag/type.d.mts +1 -0
- package/es/chat/index.d.mts +26 -16
- package/es/chat/types/chatMessage.d.mts +0 -1
- package/es/chat/types/error.mjs.map +1 -1
- package/es/chat/types/index.d.mts +2 -1
- package/es/chat/types/llm.mjs.map +1 -1
- package/es/chat/types/meta.d.mts +0 -1
- package/es/color/ColorScales/ScaleRow.mjs.map +1 -1
- package/es/color/ColorScales/index.d.mts +2 -4
- package/es/color/ColorScales/index.mjs.map +1 -1
- package/es/color/ColorScales/style.mjs.map +1 -1
- package/es/color/CssVar/ScaleRow.mjs.map +1 -1
- package/es/color/CssVar/VarRow.mjs.map +1 -1
- package/es/color/CssVar/index.d.mts +2 -4
- package/es/color/CssVar/index.mjs.map +1 -1
- package/es/color/CssVar/style.mjs.map +1 -1
- package/es/color/colors/blue.d.mts +1 -2
- package/es/color/colors/blue.mjs.map +1 -1
- package/es/color/colors/cyan.d.mts +1 -2
- package/es/color/colors/cyan.mjs.map +1 -1
- package/es/color/colors/geekblue.d.mts +1 -2
- package/es/color/colors/geekblue.mjs.map +1 -1
- package/es/color/colors/gold.d.mts +1 -2
- package/es/color/colors/gold.mjs.map +1 -1
- package/es/color/colors/gray.d.mts +1 -2
- package/es/color/colors/gray.mjs.map +1 -1
- package/es/color/colors/green.d.mts +1 -2
- package/es/color/colors/green.mjs.map +1 -1
- package/es/color/colors/index.d.mts +15 -16
- package/es/color/colors/index.mjs +1 -1
- package/es/color/colors/index.mjs.map +1 -1
- package/es/color/colors/lime.d.mts +1 -2
- package/es/color/colors/lime.mjs.map +1 -1
- package/es/color/colors/magenta.d.mts +1 -2
- package/es/color/colors/magenta.mjs.map +1 -1
- package/es/color/colors/orange.d.mts +1 -2
- package/es/color/colors/orange.mjs.map +1 -1
- package/es/color/colors/primary.d.mts +1 -2
- package/es/color/colors/primary.mjs.map +1 -1
- package/es/color/colors/purple.d.mts +1 -2
- package/es/color/colors/purple.mjs.map +1 -1
- package/es/color/colors/red.d.mts +1 -2
- package/es/color/colors/red.mjs.map +1 -1
- package/es/color/colors/volcano.d.mts +1 -2
- package/es/color/colors/volcano.mjs.map +1 -1
- package/es/color/colors/yellow.d.mts +1 -2
- package/es/color/colors/yellow.mjs.map +1 -1
- package/es/color/index.d.mts +21 -21
- package/es/color/neutrals/index.d.mts +6 -7
- package/es/color/neutrals/index.mjs +1 -1
- package/es/color/neutrals/index.mjs.map +1 -1
- package/es/color/neutrals/mauve.d.mts +1 -2
- package/es/color/neutrals/mauve.mjs.map +1 -1
- package/es/color/neutrals/olive.d.mts +1 -2
- package/es/color/neutrals/olive.mjs.map +1 -1
- package/es/color/neutrals/sage.d.mts +1 -2
- package/es/color/neutrals/sage.mjs.map +1 -1
- package/es/color/neutrals/sand.d.mts +1 -2
- package/es/color/neutrals/sand.mjs.map +1 -1
- package/es/color/neutrals/slate.d.mts +1 -2
- package/es/color/neutrals/slate.mjs.map +1 -1
- package/es/eslint/index.mjs.map +1 -1
- package/es/hooks/useCopied.mjs.map +1 -1
- package/es/hooks/useEventCallback.mjs.map +1 -1
- package/es/hooks/useFloatingLayer.mjs +1 -1
- package/es/hooks/useFloatingLayer.mjs.map +1 -1
- package/es/hooks/useHighlight.mjs +5 -2
- package/es/hooks/useHighlight.mjs.map +1 -1
- package/es/hooks/useIsClient.mjs.map +1 -1
- package/es/hooks/useMarkdown/latex.mjs +1 -1
- package/es/hooks/useMarkdown/latex.mjs.map +1 -1
- package/es/hooks/useMarkdown/useMarkdownComponents.mjs.map +1 -1
- package/es/hooks/useMarkdown/useMarkdownContent.mjs.map +1 -1
- package/es/hooks/useMarkdown/useMarkdownRehypePlugins.mjs.map +1 -1
- package/es/hooks/useMarkdown/useMarkdownRemarkPlugins.mjs.map +1 -1
- package/es/hooks/useMarkdown/utils.d.mts +1 -5
- package/es/hooks/useMarkdown/utils.mjs +1 -1
- package/es/hooks/useMarkdown/utils.mjs.map +1 -1
- package/es/hooks/useMermaid.mjs +3 -1
- package/es/hooks/useMermaid.mjs.map +1 -1
- package/es/hooks/useNativeButton.mjs.map +1 -1
- package/es/hooks/useStableValue.mjs.map +1 -1
- package/es/hooks/useStreamHighlight.mjs +3 -2
- package/es/hooks/useStreamHighlight.mjs.map +1 -1
- package/es/hooks/useStreamMermaid.mjs.map +1 -1
- package/es/hooks/useTextOverflow.mjs.map +1 -1
- package/es/i18n/context.d.mts +2 -3
- package/es/i18n/context.mjs +2 -2
- package/es/i18n/context.mjs.map +1 -1
- package/es/i18n/resources/en/chat.d.mts +1 -1
- package/es/i18n/resources/en/chat.mjs.map +1 -1
- package/es/i18n/resources/en/common.d.mts +1 -1
- package/es/i18n/resources/en/common.mjs.map +1 -1
- package/es/i18n/resources/en/editableMessage.d.mts +1 -1
- package/es/i18n/resources/en/editableMessage.mjs.map +1 -1
- package/es/i18n/resources/en/emojiPicker.d.mts +1 -1
- package/es/i18n/resources/en/emojiPicker.mjs.map +1 -1
- package/es/i18n/resources/en/form.d.mts +1 -1
- package/es/i18n/resources/en/form.mjs.map +1 -1
- package/es/i18n/resources/en/hotkey.d.mts +1 -1
- package/es/i18n/resources/en/hotkey.mjs.map +1 -1
- package/es/i18n/resources/en/image.d.mts +1 -1
- package/es/i18n/resources/en/image.mjs.map +1 -1
- package/es/i18n/resources/en/index.d.mts +10 -12
- package/es/i18n/resources/en/index.mjs +1 -1
- package/es/i18n/resources/en/messageModal.d.mts +1 -1
- package/es/i18n/resources/en/messageModal.mjs.map +1 -1
- package/es/i18n/resources/en/sideNav.d.mts +1 -1
- package/es/i18n/resources/en/sideNav.mjs.map +1 -1
- package/es/i18n/resources/zhCn/chat.d.mts +1 -1
- package/es/i18n/resources/zhCn/chat.mjs.map +1 -1
- package/es/i18n/resources/zhCn/common.d.mts +1 -1
- package/es/i18n/resources/zhCn/common.mjs.map +1 -1
- package/es/i18n/resources/zhCn/editableMessage.d.mts +1 -1
- package/es/i18n/resources/zhCn/editableMessage.mjs.map +1 -1
- package/es/i18n/resources/zhCn/emojiPicker.d.mts +1 -1
- package/es/i18n/resources/zhCn/emojiPicker.mjs.map +1 -1
- package/es/i18n/resources/zhCn/form.d.mts +1 -1
- package/es/i18n/resources/zhCn/form.mjs.map +1 -1
- package/es/i18n/resources/zhCn/hotkey.d.mts +1 -1
- package/es/i18n/resources/zhCn/hotkey.mjs.map +1 -1
- package/es/i18n/resources/zhCn/image.d.mts +1 -1
- package/es/i18n/resources/zhCn/image.mjs.map +1 -1
- package/es/i18n/resources/zhCn/index.d.mts +10 -12
- package/es/i18n/resources/zhCn/index.mjs +1 -1
- package/es/i18n/resources/zhCn/messageModal.d.mts +1 -1
- package/es/i18n/resources/zhCn/messageModal.mjs.map +1 -1
- package/es/i18n/resources/zhCn/sideNav.d.mts +1 -1
- package/es/i18n/resources/zhCn/sideNav.mjs.map +1 -1
- package/es/i18n/types.d.mts +9 -10
- package/es/i18n/useTranslation.d.mts +0 -1
- package/es/i18n/useTranslation.mjs.map +1 -1
- package/es/icons/Auth0/components/Avatar.d.mts +1 -2
- package/es/icons/Auth0/components/Avatar.mjs.map +1 -1
- package/es/icons/Auth0/components/Mono.d.mts +1 -2
- package/es/icons/Auth0/components/Mono.mjs.map +1 -1
- package/es/icons/Auth0/index.d.mts +3 -4
- package/es/icons/Authelia/components/Avatar.d.mts +1 -2
- package/es/icons/Authelia/components/Avatar.mjs.map +1 -1
- package/es/icons/Authelia/components/Color.d.mts +1 -2
- package/es/icons/Authelia/components/Color.mjs.map +1 -1
- package/es/icons/Authelia/components/Mono.d.mts +1 -2
- package/es/icons/Authelia/components/Mono.mjs.map +1 -1
- package/es/icons/Authelia/index.d.mts +4 -5
- package/es/icons/Authentik/components/Avatar.d.mts +1 -2
- package/es/icons/Authentik/components/Avatar.mjs.map +1 -1
- package/es/icons/Authentik/components/Color.d.mts +1 -2
- package/es/icons/Authentik/components/Color.mjs.map +1 -1
- package/es/icons/Authentik/components/Mono.d.mts +1 -2
- package/es/icons/Authentik/components/Mono.mjs.map +1 -1
- package/es/icons/Authentik/index.d.mts +4 -5
- package/es/icons/Casdoor/components/Avatar.d.mts +1 -2
- package/es/icons/Casdoor/components/Avatar.mjs.map +1 -1
- package/es/icons/Casdoor/components/Color.d.mts +1 -2
- package/es/icons/Casdoor/components/Color.mjs.map +1 -1
- package/es/icons/Casdoor/components/Mono.d.mts +1 -2
- package/es/icons/Casdoor/components/Mono.mjs.map +1 -1
- package/es/icons/Casdoor/index.d.mts +4 -5
- package/es/icons/Clerk/components/Avatar.d.mts +1 -2
- package/es/icons/Clerk/components/Avatar.mjs.map +1 -1
- package/es/icons/Clerk/components/Color.d.mts +1 -2
- package/es/icons/Clerk/components/Color.mjs.map +1 -1
- package/es/icons/Clerk/components/Mono.d.mts +1 -2
- package/es/icons/Clerk/components/Mono.mjs.map +1 -1
- package/es/icons/Clerk/index.d.mts +4 -5
- package/es/icons/DingTalk/components/Avatar.d.mts +1 -2
- package/es/icons/DingTalk/components/Avatar.mjs.map +1 -1
- package/es/icons/DingTalk/components/Color.d.mts +1 -2
- package/es/icons/DingTalk/components/Color.mjs.map +1 -1
- package/es/icons/DingTalk/components/Mono.d.mts +1 -2
- package/es/icons/DingTalk/components/Mono.mjs.map +1 -1
- package/es/icons/DingTalk/index.d.mts +4 -5
- package/es/icons/Discord/components/Avatar.d.mts +1 -2
- package/es/icons/Discord/components/Avatar.mjs.map +1 -1
- package/es/icons/Discord/components/Color.d.mts +1 -2
- package/es/icons/Discord/components/Color.mjs.map +1 -1
- package/es/icons/Discord/components/Mono.d.mts +1 -2
- package/es/icons/Discord/components/Mono.mjs.map +1 -1
- package/es/icons/Discord/index.d.mts +4 -5
- package/es/icons/GoogleChat/components/Avatar.d.mts +1 -2
- package/es/icons/GoogleChat/components/Avatar.mjs.map +1 -1
- package/es/icons/GoogleChat/components/Color.d.mts +1 -2
- package/es/icons/GoogleChat/components/Color.mjs.map +1 -1
- package/es/icons/GoogleChat/components/Mono.d.mts +1 -2
- package/es/icons/GoogleChat/components/Mono.mjs.map +1 -1
- package/es/icons/GoogleChat/index.d.mts +4 -5
- package/es/icons/IMessage/components/Avatar.d.mts +1 -2
- package/es/icons/IMessage/components/Avatar.mjs.map +1 -1
- package/es/icons/IMessage/components/Color.d.mts +1 -2
- package/es/icons/IMessage/components/Color.mjs.map +1 -1
- package/es/icons/IMessage/components/Inner.mjs.map +1 -1
- package/es/icons/IMessage/components/Mono.d.mts +1 -2
- package/es/icons/IMessage/components/Mono.mjs.map +1 -1
- package/es/icons/IMessage/index.d.mts +4 -5
- package/es/icons/Lark/components/Avatar.d.mts +1 -2
- package/es/icons/Lark/components/Avatar.mjs.map +1 -1
- package/es/icons/Lark/components/Color.d.mts +1 -2
- package/es/icons/Lark/components/Color.mjs.map +1 -1
- package/es/icons/Lark/components/Mono.d.mts +1 -2
- package/es/icons/Lark/components/Mono.mjs.map +1 -1
- package/es/icons/Lark/index.d.mts +4 -5
- package/es/icons/Line/components/Avatar.d.mts +1 -2
- package/es/icons/Line/components/Avatar.mjs.map +1 -1
- package/es/icons/Line/components/Color.d.mts +1 -2
- package/es/icons/Line/components/Color.mjs.map +1 -1
- package/es/icons/Line/components/Mono.d.mts +1 -2
- package/es/icons/Line/components/Mono.mjs.map +1 -1
- package/es/icons/Line/index.d.mts +4 -5
- package/es/icons/Logto/components/Avatar.d.mts +1 -2
- package/es/icons/Logto/components/Avatar.mjs.map +1 -1
- package/es/icons/Logto/components/Color.d.mts +1 -2
- package/es/icons/Logto/components/Color.mjs.map +1 -1
- package/es/icons/Logto/components/Mono.d.mts +1 -2
- package/es/icons/Logto/components/Mono.mjs.map +1 -1
- package/es/icons/Logto/index.d.mts +4 -5
- package/es/icons/MicrosoftEntra/components/Avatar.d.mts +1 -2
- package/es/icons/MicrosoftEntra/components/Avatar.mjs.map +1 -1
- package/es/icons/MicrosoftEntra/components/Color.d.mts +1 -2
- package/es/icons/MicrosoftEntra/components/Color.mjs.map +1 -1
- package/es/icons/MicrosoftEntra/components/Mono.d.mts +1 -2
- package/es/icons/MicrosoftEntra/components/Mono.mjs.map +1 -1
- package/es/icons/MicrosoftEntra/index.d.mts +4 -5
- package/es/icons/MicrosoftTeams/components/Avatar.d.mts +1 -2
- package/es/icons/MicrosoftTeams/components/Avatar.mjs.map +1 -1
- package/es/icons/MicrosoftTeams/components/Color.d.mts +1 -2
- package/es/icons/MicrosoftTeams/components/Color.mjs.map +1 -1
- package/es/icons/MicrosoftTeams/components/Mono.d.mts +1 -2
- package/es/icons/MicrosoftTeams/components/Mono.mjs.map +1 -1
- package/es/icons/MicrosoftTeams/index.d.mts +4 -5
- package/es/icons/NextAuth/components/Avatar.d.mts +1 -2
- package/es/icons/NextAuth/components/Avatar.mjs.map +1 -1
- package/es/icons/NextAuth/components/Color.d.mts +1 -2
- package/es/icons/NextAuth/components/Color.mjs.map +1 -1
- package/es/icons/NextAuth/components/Mono.d.mts +1 -2
- package/es/icons/NextAuth/components/Mono.mjs.map +1 -1
- package/es/icons/NextAuth/index.d.mts +4 -5
- package/es/icons/QQ/components/Avatar.d.mts +1 -2
- package/es/icons/QQ/components/Avatar.mjs.map +1 -1
- package/es/icons/QQ/components/Color.d.mts +1 -2
- package/es/icons/QQ/components/Color.mjs.map +1 -1
- package/es/icons/QQ/components/Mono.d.mts +1 -2
- package/es/icons/QQ/components/Mono.mjs.map +1 -1
- package/es/icons/QQ/index.d.mts +4 -5
- package/es/icons/Slack/components/Avatar.d.mts +1 -2
- package/es/icons/Slack/components/Avatar.mjs.map +1 -1
- package/es/icons/Slack/components/Color.d.mts +1 -2
- package/es/icons/Slack/components/Color.mjs.map +1 -1
- package/es/icons/Slack/components/Mono.d.mts +1 -2
- package/es/icons/Slack/components/Mono.mjs.map +1 -1
- package/es/icons/Slack/index.d.mts +4 -5
- package/es/icons/Telegram/components/Avatar.d.mts +1 -2
- package/es/icons/Telegram/components/Avatar.mjs.map +1 -1
- package/es/icons/Telegram/components/Color.d.mts +1 -2
- package/es/icons/Telegram/components/Color.mjs.map +1 -1
- package/es/icons/Telegram/components/Inner.mjs.map +1 -1
- package/es/icons/Telegram/components/Mono.d.mts +1 -2
- package/es/icons/Telegram/components/Mono.mjs.map +1 -1
- package/es/icons/Telegram/index.d.mts +4 -5
- package/es/icons/WeChat/components/Avatar.d.mts +1 -2
- package/es/icons/WeChat/components/Avatar.mjs.map +1 -1
- package/es/icons/WeChat/components/Color.d.mts +1 -2
- package/es/icons/WeChat/components/Color.mjs.map +1 -1
- package/es/icons/WeChat/components/Mono.d.mts +1 -2
- package/es/icons/WeChat/components/Mono.mjs.map +1 -1
- package/es/icons/WeChat/index.d.mts +4 -5
- package/es/icons/WhatsApp/components/Avatar.d.mts +1 -2
- package/es/icons/WhatsApp/components/Avatar.mjs.map +1 -1
- package/es/icons/WhatsApp/components/Color.d.mts +1 -2
- package/es/icons/WhatsApp/components/Color.mjs.map +1 -1
- package/es/icons/WhatsApp/components/Mono.d.mts +1 -2
- package/es/icons/WhatsApp/components/Mono.mjs.map +1 -1
- package/es/icons/WhatsApp/index.d.mts +4 -5
- package/es/icons/Zitadel/components/Avatar.d.mts +1 -2
- package/es/icons/Zitadel/components/Avatar.mjs.map +1 -1
- package/es/icons/Zitadel/components/Color.d.mts +1 -2
- package/es/icons/Zitadel/components/Color.mjs.map +1 -1
- package/es/icons/Zitadel/components/Mono.d.mts +1 -2
- package/es/icons/Zitadel/components/Mono.mjs.map +1 -1
- package/es/icons/Zitadel/index.d.mts +4 -5
- package/es/icons/index.d.mts +58 -58
- package/es/icons/lucideExtra/AndroidIcon.d.mts +2 -5
- package/es/icons/lucideExtra/AndroidIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/AppleIcon.d.mts +2 -5
- package/es/icons/lucideExtra/AppleIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/AppstoreIcon.d.mts +2 -5
- package/es/icons/lucideExtra/AppstoreIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/BotPromptIcon.d.mts +2 -5
- package/es/icons/lucideExtra/BotPromptIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/BrainOffIcon.d.mts +2 -5
- package/es/icons/lucideExtra/BrainOffIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/ChromeIcon.d.mts +2 -5
- package/es/icons/lucideExtra/ChromeIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/CodepenIcon.d.mts +2 -5
- package/es/icons/lucideExtra/CodepenIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/CodesandboxIcon.d.mts +2 -5
- package/es/icons/lucideExtra/CodesandboxIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/CreateBotIcon.d.mts +2 -5
- package/es/icons/lucideExtra/CreateBotIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/DiscordIcon.d.mts +2 -5
- package/es/icons/lucideExtra/DiscordIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/FacebookIcon.d.mts +2 -5
- package/es/icons/lucideExtra/FacebookIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/FigmaIcon.d.mts +2 -5
- package/es/icons/lucideExtra/FigmaIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/FramerIcon.d.mts +2 -5
- package/es/icons/lucideExtra/FramerIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/GithubIcon.d.mts +2 -5
- package/es/icons/lucideExtra/GithubIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/GitlabIcon.d.mts +2 -5
- package/es/icons/lucideExtra/GitlabIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/GlobeOffIcon.d.mts +2 -5
- package/es/icons/lucideExtra/GlobeOffIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/GooglePlayIcon.d.mts +2 -5
- package/es/icons/lucideExtra/GooglePlayIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/GroupBotIcon.d.mts +2 -5
- package/es/icons/lucideExtra/GroupBotIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/GroupBotSquareIcon.d.mts +2 -5
- package/es/icons/lucideExtra/GroupBotSquareIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/InstagramIcon.d.mts +2 -5
- package/es/icons/lucideExtra/InstagramIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/LeftClickIcon.d.mts +2 -5
- package/es/icons/lucideExtra/LeftClickIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/LeftDoubleClickIcon.d.mts +2 -5
- package/es/icons/lucideExtra/LeftDoubleClickIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/LinkedinIcon.d.mts +2 -5
- package/es/icons/lucideExtra/LinkedinIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/McpIcon.d.mts +2 -5
- package/es/icons/lucideExtra/McpIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/NotionIcon.d.mts +2 -5
- package/es/icons/lucideExtra/NotionIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/PocketIcon.d.mts +2 -5
- package/es/icons/lucideExtra/PocketIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/ProviderIcon.d.mts +2 -5
- package/es/icons/lucideExtra/ProviderIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/RailSymbolIcon.d.mts +2 -5
- package/es/icons/lucideExtra/RailSymbolIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/RedditIcon.d.mts +2 -5
- package/es/icons/lucideExtra/RedditIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/RightClickIcon.d.mts +2 -5
- package/es/icons/lucideExtra/RightClickIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/RightDoubleClickIcon.d.mts +2 -5
- package/es/icons/lucideExtra/RightDoubleClickIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/ShapesUploadIcon.d.mts +2 -5
- package/es/icons/lucideExtra/ShapesUploadIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/SkillsIcon.d.mts +2 -5
- package/es/icons/lucideExtra/SkillsIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/SlackIcon.d.mts +2 -5
- package/es/icons/lucideExtra/SlackIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/ThinkIcon.d.mts +2 -5
- package/es/icons/lucideExtra/ThinkIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/TreeDownRightIcon.d.mts +2 -5
- package/es/icons/lucideExtra/TreeDownRightIcon.mjs.map +1 -1
- package/es/icons/lucideExtra/TreeUpDownRightIcon.d.mts +2 -5
- package/es/icons/lucideExtra/TreeUpDownRightIcon.mjs.map +1 -1
- package/es/index.d.mts +165 -97
- package/es/index.mjs +11 -11
- package/es/mdx/Callout/index.d.mts +2 -2
- package/es/mdx/Callout/index.mjs.map +1 -1
- package/es/mdx/Callout/style.mjs.map +1 -1
- package/es/mdx/Cards/Card.d.mts +4 -2
- package/es/mdx/Cards/Card.mjs.map +1 -1
- package/es/mdx/Cards/index.d.mts +2 -2
- package/es/mdx/Cards/index.mjs.map +1 -1
- package/es/mdx/Cards/style.mjs.map +1 -1
- package/es/mdx/FileTree/File.d.mts +3 -2
- package/es/mdx/FileTree/File.mjs.map +1 -1
- package/es/mdx/FileTree/Folder.d.mts +3 -2
- package/es/mdx/FileTree/Folder.mjs.map +1 -1
- package/es/mdx/FileTree/index.d.mts +1 -2
- package/es/mdx/FileTree/index.mjs.map +1 -1
- package/es/mdx/FileTree/style.mjs.map +1 -1
- package/es/mdx/Mdx/index.d.mts +3 -4
- package/es/mdx/Mdx/index.mjs.map +1 -1
- package/es/mdx/Steps/index.d.mts +1 -2
- package/es/mdx/Steps/index.mjs.map +1 -1
- package/es/mdx/Steps/style.mjs.map +1 -1
- package/es/mdx/Tabs/Tab.d.mts +1 -2
- package/es/mdx/Tabs/Tab.mjs.map +1 -1
- package/es/mdx/Tabs/index.d.mts +3 -2
- package/es/mdx/Tabs/index.mjs.map +1 -1
- package/es/mdx/Tabs/style.mjs.map +1 -1
- package/es/mdx/index.d.mts +15 -15
- package/es/mdx/index.mjs +1 -1
- package/es/mdx/mdxComponents/Citation/PopoverPanel.mjs.map +1 -1
- package/es/mdx/mdxComponents/Citation/index.mjs.map +1 -1
- package/es/mdx/mdxComponents/Citation/style.mjs.map +1 -1
- package/es/mdx/mdxComponents/CodeBlock.d.mts +2 -2
- package/es/mdx/mdxComponents/CodeBlock.mjs +1 -1
- package/es/mdx/mdxComponents/CodeBlock.mjs.map +1 -1
- package/es/mdx/mdxComponents/Image.d.mts +2 -2
- package/es/mdx/mdxComponents/Image.mjs.map +1 -1
- package/es/mdx/mdxComponents/Link.d.mts +1 -2
- package/es/mdx/mdxComponents/Link.mjs.map +1 -1
- package/es/mdx/mdxComponents/Pre.d.mts +5 -2
- package/es/mdx/mdxComponents/Pre.mjs +2 -2
- package/es/mdx/mdxComponents/Pre.mjs.map +1 -1
- package/es/mdx/mdxComponents/Section.mjs.map +1 -1
- package/es/mdx/mdxComponents/Video.d.mts +1 -2
- package/es/mdx/mdxComponents/Video.mjs.map +1 -1
- package/es/mdx/mdxComponents/index.d.mts +2 -3
- package/es/mdx/mdxComponents/index.mjs.map +1 -1
- package/es/mobile/ChatHeader/ChatHeader.mjs.map +1 -1
- package/es/mobile/ChatHeader/ChatHeaderTitle.d.mts +2 -4
- package/es/mobile/ChatHeader/ChatHeaderTitle.mjs.map +1 -1
- package/es/mobile/ChatHeader/index.d.mts +2 -3
- package/es/mobile/ChatHeader/index.mjs +1 -1
- package/es/mobile/ChatHeader/style.mjs.map +1 -1
- package/es/mobile/ChatHeader/type.d.mts +1 -1
- package/es/mobile/ChatInputArea/ChatInputArea.mjs.map +1 -1
- package/es/mobile/ChatInputArea/components/ChatSendButton.d.mts +2 -4
- package/es/mobile/ChatInputArea/components/ChatSendButton.mjs.map +1 -1
- package/es/mobile/ChatInputArea/index.d.mts +2 -3
- package/es/mobile/ChatInputArea/index.mjs +1 -1
- package/es/mobile/ChatInputArea/style.mjs.map +1 -1
- package/es/mobile/ChatInputArea/type.d.mts +2 -1
- package/es/mobile/SafeArea/SafeArea.d.mts +1 -2
- package/es/mobile/SafeArea/SafeArea.mjs.map +1 -1
- package/es/mobile/SafeArea/index.d.mts +2 -1
- package/es/mobile/SafeArea/style.mjs.map +1 -1
- package/es/mobile/SafeArea/type.d.mts +0 -1
- package/es/mobile/TabBar/TabBar.d.mts +2 -4
- package/es/mobile/TabBar/TabBar.mjs +2 -2
- package/es/mobile/TabBar/TabBar.mjs.map +1 -1
- package/es/mobile/TabBar/index.d.mts +2 -1
- package/es/mobile/TabBar/style.mjs.map +1 -1
- package/es/mobile/TabBar/type.d.mts +1 -1
- package/es/mobile/index.d.mts +8 -6
- package/es/node_modules/{@types → .bun/@types_hast@3.0.5/node_modules/@types}/hast/index.d.mts +3 -4
- package/es/node_modules/{@types → .bun/@types_mdx@2.0.14/node_modules/@types}/mdx/types.d.mts +19 -12
- package/es/node_modules/{@types → .bun/@types_unist@3.0.3/node_modules/@types}/unist/index.d.mts +2 -2
- package/es/node_modules/{unist-util-is → .bun/unist-util-is@6.0.1/node_modules/unist-util-is}/lib/index.mjs +7 -2
- package/es/node_modules/.bun/unist-util-is@6.0.1/node_modules/unist-util-is/lib/index.mjs.map +1 -0
- package/es/node_modules/.bun/unist-util-visit-parents@6.0.2/node_modules/unist-util-visit-parents/lib/color.node.mjs +12 -0
- package/es/node_modules/.bun/unist-util-visit-parents@6.0.2/node_modules/unist-util-visit-parents/lib/color.node.mjs.map +1 -0
- package/es/node_modules/{unist-util-visit → .bun/unist-util-visit-parents@6.0.2}/node_modules/unist-util-visit-parents/lib/index.mjs +2 -2
- package/es/node_modules/.bun/unist-util-visit-parents@6.0.2/node_modules/unist-util-visit-parents/lib/index.mjs.map +1 -0
- package/es/node_modules/{unist-util-visit → .bun/unist-util-visit@5.1.0/node_modules/unist-util-visit}/lib/index.mjs +3 -3
- package/es/node_modules/.bun/unist-util-visit@5.1.0/node_modules/unist-util-visit/lib/index.mjs.map +1 -0
- package/es/storybook/StoryBook/index.d.mts +3 -4
- package/es/storybook/StoryBook/index.mjs +1 -1
- package/es/storybook/StoryBook/index.mjs.map +1 -1
- package/es/storybook/StoryBook/style.mjs.map +1 -1
- package/es/storybook/index.mjs +1 -1
- package/es/styles/classNames.mjs.map +1 -1
- package/es/styles/customTheme.mjs.map +1 -1
- package/es/styles/theme/algorithms/darkAlgorithm.mjs.map +1 -1
- package/es/styles/theme/algorithms/lightAlgorithm.mjs.map +1 -1
- package/es/styles/theme/antdTheme.mjs.map +1 -1
- package/es/styles/theme/customStylish.d.mts +0 -1
- package/es/styles/theme/customStylish.mjs.map +1 -1
- package/es/styles/theme/customStylishStatic.d.mts +0 -1
- package/es/styles/theme/customStylishStatic.mjs.map +1 -1
- package/es/styles/theme/customToken.d.mts +0 -1
- package/es/styles/theme/customToken.mjs.map +1 -1
- package/es/styles/theme/generateColorPalette.d.mts +2 -10
- package/es/styles/theme/generateColorPalette.mjs.map +1 -1
- package/es/styles/theme/token/base.mjs.map +1 -1
- package/es/styles/theme/token/dark.mjs.map +1 -1
- package/es/styles/theme/token/light.mjs.map +1 -1
- package/es/types/customToken.d.mts +4 -4
- package/es/types/index.d.mts +0 -1
- package/es/utils/blobToPng.mjs +1 -1
- package/es/utils/blobToPng.mjs.map +1 -1
- package/es/utils/copyToClipboard.mjs.map +1 -1
- package/es/utils/destroyOnInvalidActiveTriggerElement.mjs.map +1 -1
- package/es/utils/devSingleton.mjs.map +1 -1
- package/es/utils/dom.mjs.map +1 -1
- package/es/utils/downloadBlob.mjs.map +1 -1
- package/es/utils/formatTime.mjs.map +1 -1
- package/es/utils/genCdnUrl.d.mts +1 -6
- package/es/utils/genCdnUrl.mjs +1 -1
- package/es/utils/genCdnUrl.mjs.map +1 -1
- package/es/utils/getNow.mjs.map +1 -1
- package/es/utils/isDeepEqual.mjs.map +1 -1
- package/es/utils/parseTrigger.d.mts +1 -0
- package/es/utils/parseTrigger.mjs.map +1 -1
- package/es/utils/placement.d.mts +1 -2
- package/es/utils/placement.mjs.map +1 -1
- package/es/utils/safeParseJSON.mjs.map +1 -1
- package/es/utils/safeReadableColor.mjs.map +1 -1
- package/es/utils/smoothCorners.d.mts +0 -1
- package/es/utils/smoothCorners.mjs +1 -1
- package/es/utils/smoothCorners.mjs.map +1 -1
- package/package.json +70 -55
- package/es/icons/lucideExtra/index.d.mts +0 -37
- package/es/node_modules/unist-util-is/lib/index.mjs.map +0 -1
- package/es/node_modules/unist-util-visit/lib/index.mjs.map +0 -1
- package/es/node_modules/unist-util-visit/node_modules/unist-util-visit-parents/lib/color.node.mjs +0 -12
- package/es/node_modules/unist-util-visit/node_modules/unist-util-visit-parents/lib/color.node.mjs.map +0 -1
- package/es/node_modules/unist-util-visit/node_modules/unist-util-visit-parents/lib/index.mjs.map +0 -1
|
@@ -9,7 +9,7 @@ import { styles, variants } from "./style.mjs";
|
|
|
9
9
|
import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
10
10
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
11
|
import { cx, useThemeMode } from "antd-style";
|
|
12
|
-
import
|
|
12
|
+
import useMergeState from "use-merge-value";
|
|
13
13
|
import { isEqual } from "es-toolkit/compat";
|
|
14
14
|
import { Undo2Icon, XIcon } from "lucide-react";
|
|
15
15
|
import { useHotkeys, useRecordHotkeys } from "react-hotkeys-hook";
|
|
@@ -22,7 +22,7 @@ const HotkeyInput = memo(({ value = "", defaultValue = "", resetValue = "", onCh
|
|
|
22
22
|
const { isDarkMode } = useThemeMode();
|
|
23
23
|
const { t } = useTranslation(hotkey_default);
|
|
24
24
|
const isAppleDevice = useMemo(() => checkIsAppleDevice(isApple), [isApple]);
|
|
25
|
-
const [hotkeyValue, setHotkeyValue] =
|
|
25
|
+
const [hotkeyValue, setHotkeyValue] = useMergeState(defaultValue, {
|
|
26
26
|
defaultValue,
|
|
27
27
|
onChange,
|
|
28
28
|
value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HotkeyInput.mjs","names":["hotkeyMessages","Flexbox"],"sources":["../../src/HotkeyInput/HotkeyInput.tsx"],"sourcesContent":["'use client';\n\nimport { type InputRef } from 'antd';\nimport { cx, useThemeMode } from 'antd-style';\nimport { isEqual } from 'es-toolkit/compat';\nimport { Undo2Icon, XIcon } from 'lucide-react';\nimport {\n type FocusEvent,\n memo,\n type MouseEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useHotkeys, useRecordHotkeys } from 'react-hotkeys-hook';\nimport useControlledState from 'use-merge-value';\n\nimport ActionIcon from '@/ActionIcon';\nimport { Flexbox } from '@/Flex';\nimport Hotkey from '@/Hotkey';\nimport { checkIsAppleDevice, NORMATIVE_MODIFIER, splitKeysByPlus } from '@/Hotkey/utils';\nimport hotkeyMessages from '@/i18n/resources/en/hotkey';\nimport { useTranslation } from '@/i18n/useTranslation';\n\nimport { styles, variants } from './style';\nimport { type HotkeyInputProps } from './type';\n\nconst HotkeyInput = memo<HotkeyInputProps>(\n ({\n value = '',\n defaultValue = '',\n resetValue = '',\n onChange,\n onClear,\n onConflict,\n placeholder,\n disabled,\n shadow,\n allowClear,\n allowReset = true,\n style,\n className,\n hotkeyConflicts = [],\n variant,\n texts,\n isApple,\n onBlur,\n onReset,\n onFocus,\n }) => {\n const [isFocused, setIsFocused] = useState(false);\n const [hasConflict, setHasConflict] = useState(false);\n const [hasInvalidCombination, setHasInvalidCombination] = useState(false);\n const inputRef = useRef<InputRef>(null);\n const { isDarkMode } = useThemeMode();\n const { t } = useTranslation(hotkeyMessages);\n const isAppleDevice = useMemo(() => checkIsAppleDevice(isApple), [isApple]);\n const [hotkeyValue, setHotkeyValue] = useControlledState(defaultValue, {\n defaultValue,\n onChange,\n value,\n });\n\n // 使用 useRecordHotkeys 处理快捷键录入\n const [recordedKeys, { start, stop, isRecording, resetKeys }] = useRecordHotkeys();\n\n useHotkeys(\n '*',\n () => {\n inputRef.current?.blur();\n },\n {\n enableOnContentEditable: true,\n enableOnFormTags: true,\n enabled: isRecording && !disabled,\n keydown: false,\n keyup: true,\n preventDefault: true,\n },\n );\n\n // 处理按键,保证格式正确:修饰键在前,最多一个非修饰键在后\n const formatKeys = useCallback((keysSet: Set<string>) => {\n const modifiers: string[] = [];\n const normalKeys: string[] = [];\n\n for (const key of keysSet) {\n // 处理不同表示的修饰键\n const normalizedKey: any = key.toLowerCase();\n if (NORMATIVE_MODIFIER.includes(normalizedKey)) {\n // 统一修饰键表示\n if (\n (!isAppleDevice && normalizedKey === 'ctrl') ||\n (isAppleDevice && normalizedKey === 'meta')\n ) {\n if (!modifiers.includes('mod')) modifiers.push('mod');\n } else if (!modifiers.includes(normalizedKey)) {\n modifiers.push(normalizedKey);\n }\n } else {\n normalKeys.push(key);\n }\n }\n\n // 至少需要一个修饰键\n if (modifiers.length === 0 && normalKeys.length > 0) {\n return { isValid: false, keys: [] };\n }\n\n // 只允许一个非修饰键,如果有多个,只保留最后一个\n const finalKey = normalKeys.length > 0 ? [normalKeys.at(-1)] : [];\n const shortcuts = [modifiers, finalKey];\n\n return {\n // 组合必须包含至少一个按键\n isValid: shortcuts.every((k) => k.length > 0),\n keys: shortcuts.flat(),\n };\n }, []);\n\n // 获取格式化后的按键字符串\n const { isValid, keys } = formatKeys(recordedKeys);\n const keysString = keys.join('+');\n\n // 检查快捷键冲突\n const checkHotkeyConflict = useCallback(\n (newHotkey: string): boolean => {\n return hotkeyConflicts\n .filter((conflictKey) => conflictKey !== resetValue)\n .some((conflictKey) => {\n const newKeys = splitKeysByPlus(newHotkey);\n const conflictKeys = splitKeysByPlus(conflictKey);\n return isEqual(newKeys, conflictKeys);\n });\n },\n [hotkeyConflicts],\n );\n\n // 当按键组合完成时处理结果\n useEffect(() => {\n if (recordedKeys.size > 0 && !isRecording) {\n if (!isValid) {\n setHasInvalidCombination(true);\n setHasConflict(false);\n return;\n }\n\n setHasInvalidCombination(false);\n const newKeysString = keysString;\n\n // 检查冲突\n const conflict = checkHotkeyConflict(newKeysString);\n if (conflict) {\n setHasConflict(true);\n onConflict?.(newKeysString);\n } else {\n setHasConflict(false);\n setHotkeyValue?.(newKeysString);\n }\n }\n }, [\n recordedKeys,\n isRecording,\n isValid,\n keysString,\n checkHotkeyConflict,\n setHotkeyValue,\n onConflict,\n ]);\n\n // 处理输入框焦点\n const handleFocus = (e: FocusEvent<HTMLInputElement>) => {\n if (disabled) return;\n setIsFocused(true);\n setHasConflict(false);\n setHasInvalidCombination(false);\n start(); // 开始记录\n onFocus?.(e);\n };\n\n const handleBlur = (e: FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n stop(); // 停止记录\n onBlur?.(e);\n };\n\n const handleClear = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setHotkeyValue?.('');\n resetKeys();\n setHasConflict(false);\n setHasInvalidCombination(false);\n setIsFocused(false);\n stop();\n onClear?.(hotkeyValue);\n };\n\n // 重置功能\n const handleReset = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setHotkeyValue?.(resetValue);\n resetKeys();\n setHasConflict(false);\n setHasInvalidCombination(false);\n setIsFocused(false);\n stop(); // 停止记录\n onReset?.(hotkeyValue, resetValue);\n };\n\n const handleClick = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (disabled || isFocused) return;\n inputRef.current?.focus();\n };\n\n const placeholderText = placeholder ?? t('hotkey.placeholder');\n const resetTitle = texts?.reset ?? t('hotkey.reset');\n const clearTitle = texts?.clear ?? t('hotkey.clear');\n const conflictText = texts?.conflicts ?? t('hotkey.conflict');\n const invalidText = texts?.invalidCombination ?? t('hotkey.invalidCombination');\n\n return (\n <Flexbox\n className={className}\n gap={8}\n style={{\n position: 'relative',\n ...style,\n }}\n >\n <Flexbox\n horizontal\n align={'center'}\n justify={'space-between'}\n className={cx(\n variants({\n disabled,\n error: hasConflict || hasInvalidCombination,\n focused: isFocused,\n shadow,\n variant: variant || (isDarkMode ? 'filled' : 'outlined'),\n }),\n )}\n onClick={handleClick}\n >\n <div style={{ pointerEvents: 'none' }}>\n {isRecording ? (\n <span className={styles.placeholder}>\n {keys.length > 0 ? <Hotkey keys={keysString} /> : placeholderText}\n </span>\n ) : hotkeyValue ? (\n <Hotkey keys={hotkeyValue} />\n ) : (\n <span className={styles.placeholder}>{placeholderText}</span>\n )}\n </div>\n\n {/* 隐藏的输入框,用于接收焦点 */}\n <input\n readOnly\n className={styles.hiddenInput}\n disabled={disabled}\n ref={inputRef as any}\n style={{ pointerEvents: 'none' }}\n onBlur={handleBlur}\n onFocus={handleFocus}\n />\n\n {!isFocused && hotkeyValue && !disabled && (allowReset || allowClear) && (\n <Flexbox horizontal gap={4}>\n {allowReset && hotkeyValue !== resetValue && (\n <ActionIcon\n icon={Undo2Icon}\n size={'small'}\n title={resetTitle}\n variant={'filled'}\n onClick={handleReset}\n />\n )}\n {allowClear && (\n <ActionIcon\n icon={XIcon}\n size={'small'}\n title={clearTitle}\n variant={'filled'}\n onClick={handleClear}\n />\n )}\n </Flexbox>\n )}\n </Flexbox>\n {hasConflict && <div className={styles.errorText}>{conflictText}</div>}\n {hasInvalidCombination && <div className={styles.errorText}>{invalidText}</div>}\n </Flexbox>\n );\n },\n);\n\nHotkeyInput.displayName = 'HotkeyInput';\n\nexport default HotkeyInput;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HotkeyInput.mjs","names":["hotkeyMessages","useControlledState","Flexbox"],"sources":["../../src/HotkeyInput/HotkeyInput.tsx"],"sourcesContent":["'use client';\n\nimport { type InputRef } from 'antd';\nimport { cx, useThemeMode } from 'antd-style';\nimport { isEqual } from 'es-toolkit/compat';\nimport { Undo2Icon, XIcon } from 'lucide-react';\nimport {\n type FocusEvent,\n memo,\n type MouseEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useHotkeys, useRecordHotkeys } from 'react-hotkeys-hook';\nimport useControlledState from 'use-merge-value';\n\nimport ActionIcon from '@/ActionIcon';\nimport { Flexbox } from '@/Flex';\nimport Hotkey from '@/Hotkey';\nimport { checkIsAppleDevice, NORMATIVE_MODIFIER, splitKeysByPlus } from '@/Hotkey/utils';\nimport hotkeyMessages from '@/i18n/resources/en/hotkey';\nimport { useTranslation } from '@/i18n/useTranslation';\n\nimport { styles, variants } from './style';\nimport { type HotkeyInputProps } from './type';\n\nconst HotkeyInput = memo<HotkeyInputProps>(\n ({\n value = '',\n defaultValue = '',\n resetValue = '',\n onChange,\n onClear,\n onConflict,\n placeholder,\n disabled,\n shadow,\n allowClear,\n allowReset = true,\n style,\n className,\n hotkeyConflicts = [],\n variant,\n texts,\n isApple,\n onBlur,\n onReset,\n onFocus,\n }) => {\n const [isFocused, setIsFocused] = useState(false);\n const [hasConflict, setHasConflict] = useState(false);\n const [hasInvalidCombination, setHasInvalidCombination] = useState(false);\n const inputRef = useRef<InputRef>(null);\n const { isDarkMode } = useThemeMode();\n const { t } = useTranslation(hotkeyMessages);\n const isAppleDevice = useMemo(() => checkIsAppleDevice(isApple), [isApple]);\n const [hotkeyValue, setHotkeyValue] = useControlledState(defaultValue, {\n defaultValue,\n onChange,\n value,\n });\n\n // 使用 useRecordHotkeys 处理快捷键录入\n const [recordedKeys, { start, stop, isRecording, resetKeys }] = useRecordHotkeys();\n\n useHotkeys(\n '*',\n () => {\n inputRef.current?.blur();\n },\n {\n enableOnContentEditable: true,\n enableOnFormTags: true,\n enabled: isRecording && !disabled,\n keydown: false,\n keyup: true,\n preventDefault: true,\n },\n );\n\n // 处理按键,保证格式正确:修饰键在前,最多一个非修饰键在后\n const formatKeys = useCallback((keysSet: Set<string>) => {\n const modifiers: string[] = [];\n const normalKeys: string[] = [];\n\n for (const key of keysSet) {\n // 处理不同表示的修饰键\n const normalizedKey: any = key.toLowerCase();\n if (NORMATIVE_MODIFIER.includes(normalizedKey)) {\n // 统一修饰键表示\n if (\n (!isAppleDevice && normalizedKey === 'ctrl') ||\n (isAppleDevice && normalizedKey === 'meta')\n ) {\n if (!modifiers.includes('mod')) modifiers.push('mod');\n } else if (!modifiers.includes(normalizedKey)) {\n modifiers.push(normalizedKey);\n }\n } else {\n normalKeys.push(key);\n }\n }\n\n // 至少需要一个修饰键\n if (modifiers.length === 0 && normalKeys.length > 0) {\n return { isValid: false, keys: [] };\n }\n\n // 只允许一个非修饰键,如果有多个,只保留最后一个\n const finalKey = normalKeys.length > 0 ? [normalKeys.at(-1)] : [];\n const shortcuts = [modifiers, finalKey];\n\n return {\n // 组合必须包含至少一个按键\n isValid: shortcuts.every((k) => k.length > 0),\n keys: shortcuts.flat(),\n };\n }, []);\n\n // 获取格式化后的按键字符串\n const { isValid, keys } = formatKeys(recordedKeys);\n const keysString = keys.join('+');\n\n // 检查快捷键冲突\n const checkHotkeyConflict = useCallback(\n (newHotkey: string): boolean => {\n return hotkeyConflicts\n .filter((conflictKey) => conflictKey !== resetValue)\n .some((conflictKey) => {\n const newKeys = splitKeysByPlus(newHotkey);\n const conflictKeys = splitKeysByPlus(conflictKey);\n return isEqual(newKeys, conflictKeys);\n });\n },\n [hotkeyConflicts],\n );\n\n // 当按键组合完成时处理结果\n useEffect(() => {\n if (recordedKeys.size > 0 && !isRecording) {\n if (!isValid) {\n setHasInvalidCombination(true);\n setHasConflict(false);\n return;\n }\n\n setHasInvalidCombination(false);\n const newKeysString = keysString;\n\n // 检查冲突\n const conflict = checkHotkeyConflict(newKeysString);\n if (conflict) {\n setHasConflict(true);\n onConflict?.(newKeysString);\n } else {\n setHasConflict(false);\n setHotkeyValue?.(newKeysString);\n }\n }\n }, [\n recordedKeys,\n isRecording,\n isValid,\n keysString,\n checkHotkeyConflict,\n setHotkeyValue,\n onConflict,\n ]);\n\n // 处理输入框焦点\n const handleFocus = (e: FocusEvent<HTMLInputElement>) => {\n if (disabled) return;\n setIsFocused(true);\n setHasConflict(false);\n setHasInvalidCombination(false);\n start(); // 开始记录\n onFocus?.(e);\n };\n\n const handleBlur = (e: FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n stop(); // 停止记录\n onBlur?.(e);\n };\n\n const handleClear = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setHotkeyValue?.('');\n resetKeys();\n setHasConflict(false);\n setHasInvalidCombination(false);\n setIsFocused(false);\n stop();\n onClear?.(hotkeyValue);\n };\n\n // 重置功能\n const handleReset = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setHotkeyValue?.(resetValue);\n resetKeys();\n setHasConflict(false);\n setHasInvalidCombination(false);\n setIsFocused(false);\n stop(); // 停止记录\n onReset?.(hotkeyValue, resetValue);\n };\n\n const handleClick = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (disabled || isFocused) return;\n inputRef.current?.focus();\n };\n\n const placeholderText = placeholder ?? t('hotkey.placeholder');\n const resetTitle = texts?.reset ?? t('hotkey.reset');\n const clearTitle = texts?.clear ?? t('hotkey.clear');\n const conflictText = texts?.conflicts ?? t('hotkey.conflict');\n const invalidText = texts?.invalidCombination ?? t('hotkey.invalidCombination');\n\n return (\n <Flexbox\n className={className}\n gap={8}\n style={{\n position: 'relative',\n ...style,\n }}\n >\n <Flexbox\n horizontal\n align={'center'}\n justify={'space-between'}\n className={cx(\n variants({\n disabled,\n error: hasConflict || hasInvalidCombination,\n focused: isFocused,\n shadow,\n variant: variant || (isDarkMode ? 'filled' : 'outlined'),\n }),\n )}\n onClick={handleClick}\n >\n <div style={{ pointerEvents: 'none' }}>\n {isRecording ? (\n <span className={styles.placeholder}>\n {keys.length > 0 ? <Hotkey keys={keysString} /> : placeholderText}\n </span>\n ) : hotkeyValue ? (\n <Hotkey keys={hotkeyValue} />\n ) : (\n <span className={styles.placeholder}>{placeholderText}</span>\n )}\n </div>\n\n {/* 隐藏的输入框,用于接收焦点 */}\n <input\n readOnly\n className={styles.hiddenInput}\n disabled={disabled}\n ref={inputRef as any}\n style={{ pointerEvents: 'none' }}\n onBlur={handleBlur}\n onFocus={handleFocus}\n />\n\n {!isFocused && hotkeyValue && !disabled && (allowReset || allowClear) && (\n <Flexbox horizontal gap={4}>\n {allowReset && hotkeyValue !== resetValue && (\n <ActionIcon\n icon={Undo2Icon}\n size={'small'}\n title={resetTitle}\n variant={'filled'}\n onClick={handleReset}\n />\n )}\n {allowClear && (\n <ActionIcon\n icon={XIcon}\n size={'small'}\n title={clearTitle}\n variant={'filled'}\n onClick={handleClear}\n />\n )}\n </Flexbox>\n )}\n </Flexbox>\n {hasConflict && <div className={styles.errorText}>{conflictText}</div>}\n {hasInvalidCombination && <div className={styles.errorText}>{invalidText}</div>}\n </Flexbox>\n );\n },\n);\n\nHotkeyInput.displayName = 'HotkeyInput';\n\nexport default HotkeyInput;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.mjs","names":["lobeStaticStylish"],"sources":["../../src/HotkeyInput/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\nimport { cva } from 'class-variance-authority';\n\nimport { lobeStaticStylish } from '@/styles';\n\nexport const styles = createStaticStyles(({ css, cssVar }) => {\n return {\n borderless: lobeStaticStylish.variantBorderless,\n disabled: lobeStaticStylish.disabled,\n error: css`\n border: 1px solid ${cssVar.colorError};\n `,\n errorText: css`\n font-size: 12px;\n color: ${cssVar.colorError};\n `,\n filled: lobeStaticStylish.variantFilled,\n focused: css`\n background: ${cssVar.colorFillSecondary} !important;\n `,\n hiddenInput: css`\n cursor: text;\n\n position: absolute;\n z-index: -1;\n inset-block-start: 0;\n inset-inline-start: 0;\n\n width: 100%;\n height: 100%;\n\n opacity: 0;\n `,\n outlined: lobeStaticStylish.variantOutlined,\n placeholder: css`\n color: ${cssVar.colorTextDescription};\n `,\n root: css`\n cursor: pointer;\n\n position: relative;\n\n max-width: 100%;\n height: 36px;\n padding-block: 0;\n padding-inline: 12px;\n border-radius: ${cssVar.borderRadius};\n `,\n shadow: lobeStaticStylish.shadow,\n };\n});\n\nexport const variants = cva(styles.root, {\n defaultVariants: {\n disabled: false,\n error: false,\n shadow: false,\n variant: 'outlined',\n },\n\n variants: {\n variant: {\n filled: styles.filled,\n outlined: styles.outlined,\n borderless: styles.borderless,\n },\n shadow: {\n false: null,\n true: styles.shadow,\n },\n focused: {\n false: null,\n true: styles.focused,\n },\n error: {\n fales: null,\n true: styles.error,\n },\n disabled: {\n false: null,\n true: styles.disabled,\n },\n },\n});\n"],"mappings":";;;;AAKA,MAAa,SAAS,oBAAoB,EAAE,KAAK,aAAa;
|
|
1
|
+
{"version":3,"file":"style.mjs","names":["lobeStaticStylish"],"sources":["../../src/HotkeyInput/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\nimport { cva } from 'class-variance-authority';\n\nimport { lobeStaticStylish } from '@/styles';\n\nexport const styles = createStaticStyles(({ css, cssVar }) => {\n return {\n borderless: lobeStaticStylish.variantBorderless,\n disabled: lobeStaticStylish.disabled,\n error: css`\n border: 1px solid ${cssVar.colorError};\n `,\n errorText: css`\n font-size: 12px;\n color: ${cssVar.colorError};\n `,\n filled: lobeStaticStylish.variantFilled,\n focused: css`\n background: ${cssVar.colorFillSecondary} !important;\n `,\n hiddenInput: css`\n cursor: text;\n\n position: absolute;\n z-index: -1;\n inset-block-start: 0;\n inset-inline-start: 0;\n\n width: 100%;\n height: 100%;\n\n opacity: 0;\n `,\n outlined: lobeStaticStylish.variantOutlined,\n placeholder: css`\n color: ${cssVar.colorTextDescription};\n `,\n root: css`\n cursor: pointer;\n\n position: relative;\n\n max-width: 100%;\n height: 36px;\n padding-block: 0;\n padding-inline: 12px;\n border-radius: ${cssVar.borderRadius};\n `,\n shadow: lobeStaticStylish.shadow,\n };\n});\n\nexport const variants = cva(styles.root, {\n defaultVariants: {\n disabled: false,\n error: false,\n shadow: false,\n variant: 'outlined',\n },\n\n variants: {\n variant: {\n filled: styles.filled,\n outlined: styles.outlined,\n borderless: styles.borderless,\n },\n shadow: {\n false: null,\n true: styles.shadow,\n },\n focused: {\n false: null,\n true: styles.focused,\n },\n error: {\n fales: null,\n true: styles.error,\n },\n disabled: {\n false: null,\n true: styles.disabled,\n },\n },\n});\n"],"mappings":";;;;AAKA,MAAa,SAAS,oBAAoB,EAAE,KAAK,aAAa;CAC5D,OAAO;EACL,YAAYA,cAAkB;EAC9B,UAAUA,cAAkB;EAC5B,OAAO,GAAG;0BACY,OAAO,WAAW;;EAExC,WAAW,GAAG;;eAEH,OAAO,WAAW;;EAE7B,QAAQA,cAAkB;EAC1B,SAAS,GAAG;oBACI,OAAO,mBAAmB;;EAE1C,aAAa,GAAG;;;;;;;;;;;;;EAahB,UAAUA,cAAkB;EAC5B,aAAa,GAAG;eACL,OAAO,qBAAqB;;EAEvC,MAAM,GAAG;;;;;;;;;uBASU,OAAO,aAAa;;EAEvC,QAAQA,cAAkB;CAC5B;AACF,CAAC;AAED,MAAa,WAAW,IAAI,OAAO,MAAM;CACvC,iBAAiB;EACf,UAAU;EACV,OAAO;EACP,QAAQ;EACR,SAAS;CACX;CAEA,UAAU;EACR,SAAS;GACP,QAAQ,OAAO;GACf,UAAU,OAAO;GACjB,YAAY,OAAO;EACrB;EACA,QAAQ;GACN,OAAO;GACP,MAAM,OAAO;EACf;EACA,SAAS;GACP,OAAO;GACP,MAAM,OAAO;EACf;EACA,OAAO;GACL,OAAO;GACP,MAAM,OAAO;EACf;EACA,UAAU;GACR,OAAO;GACP,MAAM,OAAO;EACf;CACF;AACF,CAAC"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { HtmlPreviewProps } from "./type.mjs";
|
|
2
|
-
import * as _$react from "react";
|
|
3
|
-
|
|
4
2
|
//#region src/HtmlPreview/HtmlPreview.d.ts
|
|
5
|
-
declare const HtmlPreview:
|
|
3
|
+
declare const HtmlPreview: import("react").NamedExoticComponent<HtmlPreviewProps>;
|
|
6
4
|
//#endregion
|
|
7
|
-
export { HtmlPreview };
|
|
5
|
+
export { HtmlPreview as default };
|
|
8
6
|
//# sourceMappingURL=HtmlPreview.d.mts.map
|
|
@@ -9,7 +9,7 @@ import { actionsHoverCls, variants } from "../Highlighter/style.mjs";
|
|
|
9
9
|
import { containsScript, isFullHtmlDocument, isHtmlContentClosed } from "./const.mjs";
|
|
10
10
|
import NeuralNetworkLoading from "../NeuralNetworkLoading/NeuralNetworkLoading.mjs";
|
|
11
11
|
import Segmented from "../Segmented/Segmented.mjs";
|
|
12
|
-
import HtmlPreviewIframe from "./Iframe.mjs";
|
|
12
|
+
import { HtmlPreviewIframe } from "./Iframe.mjs";
|
|
13
13
|
import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
14
14
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
15
15
|
import { createStyles, cx, keyframes } from "antd-style";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HtmlPreview.mjs","names":["Flexbox"],"sources":["../../src/HtmlPreview/HtmlPreview.tsx"],"sourcesContent":["'use client';\n\nimport { createStyles, cx, keyframes } from 'antd-style';\nimport { Download, Expand } from 'lucide-react';\nimport { memo, type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport ActionIcon from '@/ActionIcon';\nimport CopyButton from '@/CopyButton';\nimport { Flexbox } from '@/Flex';\nimport { actionsHoverCls, variants } from '@/Highlighter/style';\nimport SyntaxHighlighter from '@/Highlighter/SyntaxHighlighter';\nimport NeuralNetworkLoading from '@/NeuralNetworkLoading';\nimport Segmented from '@/Segmented';\nimport { stopPropagation } from '@/utils/dom';\nimport { downloadBlob } from '@/utils/downloadBlob';\n\nimport { containsScript, DEFAULT_HEIGHT, isFullHtmlDocument, isHtmlContentClosed } from './const';\nimport HtmlPreviewIframe from './Iframe';\nimport type { HtmlPreviewMode, HtmlPreviewProps } from './type';\n\n// Sheen sweep direction: left → right.\n// `background-position` works inversely from \"where the image is drawn\":\n// at `200%` the over-sized gradient starts off to the left of the\n// container, at `-200%` it ends off to the right — so animating\n// 200% → -200% moves the visible bright spot from left to right.\nconst shimmer = keyframes`\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n`;\n\nconst useStyles = createStyles(({ css, cssVar, isDarkMode }) => ({\n loadingBackdrop: css`\n pointer-events: none;\n\n position: absolute;\n z-index: 1;\n inset: 0;\n\n /* Subtle moving sheen so it doesn't look frozen. */\n background: linear-gradient(\n 90deg,\n transparent 0%,\n ${isDarkMode ? 'rgba(255, 255, 255, 0.04)' : 'rgba(0, 0, 0, 0.04)'} 50%,\n transparent 100%\n );\n background-repeat: no-repeat;\n background-size: 200% 100%;\n\n animation: ${shimmer} 1.6s ${cssVar.motionEaseInOut} infinite;\n `,\n loadingBadge: css`\n position: absolute;\n z-index: 2;\n inset-block-start: 12px;\n inset-inline-start: 12px;\n\n display: inline-flex;\n gap: 8px;\n align-items: center;\n\n padding-block: 4px;\n padding-inline: 6px 10px;\n border-radius: 999px;\n\n font-size: 12px;\n color: ${cssVar.colorTextDescription};\n\n background: ${cssVar.colorBgContainer};\n backdrop-filter: blur(8px);\n box-shadow: 0 0 0 1px ${cssVar.colorBorderSecondary};\n `,\n // The streaming source visible during Phase 1 — heavily faded so it\n // reads as \"this is preview-pending content\" rather than the finished\n // article. Auto-follows the tail so the user can see new tokens land\n // even on slow models.\n loadingSource: css`\n pointer-events: none;\n overflow: hidden;\n height: 100%;\n\n /* Faded out so the iframe transition feels like content lighting up,\n not like one document jump-cutting to another. */\n opacity: 0.45;\n\n /* SyntaxHighlighter sets its own background; flatten so the shimmer\n overlay reads cleanly on top. */\n & [data-code-type='highlighter'] {\n background: transparent;\n box-shadow: none;\n }\n\n /* Tail-follow is layout-only — we anchor the scrollable element to\n its scrollHeight via the ref + effect; CSS just keeps the\n overflow hidden. */\n & pre,\n & code {\n background: transparent !important;\n }\n `,\n loadingRoot: css`\n position: relative;\n overflow: hidden;\n background: ${isDarkMode ? '#1f1f1f' : '#fafafa'};\n `,\n // Inline top-right toolbar. Tagged with `actionsHoverCls` so the Highlighter\n // container's `&:hover .${actionsHoverCls} { opacity: 1 }` rule flips it\n // in/out as the user moves over the preview — same UX as the regular code\n // block actions.\n toolbar: cx(\n actionsHoverCls,\n css`\n position: absolute;\n z-index: 2;\n inset-block-start: 8px;\n inset-inline-end: 8px;\n\n padding: 4px;\n border-radius: ${cssVar.borderRadiusLG};\n\n opacity: 0;\n background: ${cssVar.colorBgContainer};\n backdrop-filter: blur(8px);\n box-shadow: 0 0 0 1px ${cssVar.colorBorderSecondary};\n\n transition: opacity 0.2s ${cssVar.motionEaseOut};\n\n &:focus-within {\n opacity: 1;\n }\n `,\n ),\n}));\n\nconst themeBackground = (theme?: 'light' | 'dark') => {\n if (theme === 'dark') return '#1f1f1f';\n if (theme === 'light') return '#ffffff';\n return undefined;\n};\n\nconst downloadHtml = async (content: string, fileName: string) => {\n const blob = new Blob([content], { type: 'text/html;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n try {\n await downloadBlob(url, fileName);\n } finally {\n URL.revokeObjectURL(url);\n }\n};\n\nconst HtmlPreview = memo<HtmlPreviewProps>(\n ({\n actionIconSize,\n actionsRender,\n animated,\n bodyRender,\n children,\n className,\n classNames,\n copyable = true,\n defaultHeight,\n defaultMode = 'preview',\n downloadable = true,\n fileName,\n language = 'html',\n onExpand,\n sandbox,\n shadow,\n streamingMode = 'auto',\n style,\n styles: customStyles,\n theme,\n variant = 'filled',\n // `fullFeatured` / `showLanguage` / `defaultExpand` are accepted for API\n // compatibility with the rest of the Pre family but no longer drive a\n // separate header — the inline toolbar is always rendered.\n fullFeatured: _fullFeatured,\n showLanguage: _showLanguage,\n defaultExpand: _defaultExpand,\n ...rest\n }) => {\n const trimmedChildren = useMemo(() => (children || '').trim(), [children]);\n const isFragment = useMemo(() => !isFullHtmlDocument(trimmedChildren), [trimmedChildren]);\n\n // Per-session tracking. Reset on `animated` edge false → true.\n const [scriptLocked, setScriptLocked] = useState(false);\n const [headClosed, setHeadClosed] = useState(false);\n const [liveCommitted, setLiveCommitted] = useState(false);\n const prevAnimatedRef = useRef(animated);\n const lastCommitRef = useRef(0);\n const pendingTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestContentRef = useRef(trimmedChildren);\n useEffect(() => {\n latestContentRef.current = trimmedChildren;\n }, [trimmedChildren]);\n useEffect(() => {\n if (animated && !prevAnimatedRef.current) {\n setScriptLocked(false);\n setHeadClosed(false);\n setLiveCommitted(false);\n lastCommitRef.current = 0;\n if (pendingTimerRef.current) {\n clearTimeout(pendingTimerRef.current);\n pendingTimerRef.current = null;\n }\n }\n prevAnimatedRef.current = animated;\n }, [animated]);\n\n // Sticky script detection: once a `<script>` appears in this session,\n // auto mode locks into defer.\n useEffect(() => {\n if (animated && !scriptLocked && containsScript(trimmedChildren)) {\n setScriptLocked(true);\n }\n }, [trimmedChildren, animated, scriptLocked]);\n\n // Track whether the head section has closed. Until it does, the iframe\n // would render either nothing or invalid HTML (style tag mid-stream).\n // After `</head>` (or `</style>` as a fallback for documents that skip\n // an explicit head close) we know the visual baseline is locked in.\n useEffect(() => {\n if (animated && !headClosed) {\n const lowered = trimmedChildren.toLowerCase();\n if (lowered.includes('</head>') || lowered.includes('</style>')) {\n setHeadClosed(true);\n }\n }\n }, [trimmedChildren, animated, headClosed]);\n\n // Two-phase streaming commit:\n // Phase 1 (head still streaming) — don't mount iframe at all. There's\n // nothing meaningful to render and styles aren't applied yet.\n // Phase 2 (head closed, body streaming) — commit at most once every\n // ~250ms. Important: this is a TRUE throttle, not a debounce. The\n // pending timer is held in a ref so it survives effect re-runs;\n // when it fires it commits the latest content (via another ref)\n // and clears itself, allowing a fresh schedule. If chunks come in\n // faster than the throttle window (which they do at ~50/sec) we\n // still get a commit every 250ms instead of waiting for streaming\n // to pause.\n // On streaming end → flush immediately, cancel any pending timer.\n const [throttledContent, setThrottledContent] = useState(trimmedChildren);\n useEffect(() => {\n if (!animated) {\n if (pendingTimerRef.current) {\n clearTimeout(pendingTimerRef.current);\n pendingTimerRef.current = null;\n }\n lastCommitRef.current = Date.now();\n setThrottledContent(trimmedChildren);\n return;\n }\n if (!headClosed) return;\n\n const throttleMs = 250;\n const now = Date.now();\n const elapsed = now - lastCommitRef.current;\n\n if (elapsed >= throttleMs) {\n if (pendingTimerRef.current) {\n clearTimeout(pendingTimerRef.current);\n pendingTimerRef.current = null;\n }\n lastCommitRef.current = now;\n setThrottledContent(trimmedChildren);\n return;\n }\n\n // Schedule a future commit, but only if one isn't already pending —\n // every chunk arrival re-runs this effect; we don't want to reset\n // the timer each time (that's debounce, and during continuous\n // streaming it would never fire).\n if (pendingTimerRef.current === null) {\n pendingTimerRef.current = setTimeout(() => {\n lastCommitRef.current = Date.now();\n pendingTimerRef.current = null;\n setThrottledContent(latestContentRef.current);\n }, throttleMs - elapsed);\n }\n }, [trimmedChildren, animated, headClosed]);\n useEffect(\n () => () => {\n if (pendingTimerRef.current) clearTimeout(pendingTimerRef.current);\n },\n [],\n );\n\n // Live-streaming commitment is sticky for the rest of the session. The\n // decision is made the moment the head seals:\n // • `live` → commit unconditionally\n // • `auto` → commit only if no `<script>` has appeared yet (script-\n // bearing docs go down the defer path to avoid running setup() on\n // partial source)\n // • `defer` → never commit; wait for `</html>`\n // Sticky-ness matters for `auto`: if a `<script>` arrives *after* the\n // head has already closed and we've started live-streaming, we keep\n // streaming rather than yanking the rendered content back into a\n // loading state mid-flight. The shell→static swap at end of streaming\n // re-runs the document cleanly anyway.\n useEffect(() => {\n if (!animated || liveCommitted || !headClosed) return;\n if (streamingMode === 'live' || (streamingMode === 'auto' && !scriptLocked)) {\n setLiveCommitted(true);\n }\n }, [animated, headClosed, liveCommitted, scriptLocked, streamingMode]);\n\n // Streaming gate. The iframe can mount in three situations:\n // 1. content is no longer animating\n // 2. `</html>` has arrived\n // 3. live streaming has been committed this session\n const isStable = !animated || isHtmlContentClosed(trimmedChildren) || liveCommitted;\n\n const [mode, setMode] = useState<HtmlPreviewMode>(defaultMode);\n\n // Fragments cannot meaningfully render in preview — force source view.\n // For streaming content that's not yet stable we keep the user's mode\n // choice and substitute a loading placeholder in the body instead, so\n // the toggle UI doesn't flip back and forth as content arrives.\n const effectiveMode: HtmlPreviewMode = isFragment ? 'source' : mode;\n\n const contentRef = useRef(trimmedChildren);\n useEffect(() => {\n contentRef.current = trimmedChildren;\n }, [trimmedChildren]);\n\n // Tail-follow the streaming source visible during Phase 1 — anchor\n // the scroll position to the latest tokens so a slow model's output\n // doesn't sit pinned to the document head while the user waits.\n const loadingSourceRef = useRef<HTMLDivElement | null>(null);\n useEffect(() => {\n if (isStable) return;\n const node = loadingSourceRef.current;\n if (!node) return;\n node.scrollTop = node.scrollHeight;\n }, [trimmedChildren, isStable]);\n\n const getCopyContent = useCallback(() => contentRef.current, []);\n\n const handleDownload = useCallback(() => {\n void downloadHtml(contentRef.current, fileName || 'preview.html');\n }, [fileName]);\n\n const handleExpand = useCallback(() => {\n onExpand?.(contentRef.current);\n }, [onExpand]);\n\n const background = themeBackground(theme);\n\n const sourceBody = useMemo(\n () => (\n <SyntaxHighlighter\n animated={animated}\n className={classNames?.content}\n language={'html'}\n style={{ height: '100%', ...customStyles?.content }}\n variant={variant}\n >\n {trimmedChildren}\n </SyntaxHighlighter>\n ),\n [animated, classNames?.content, customStyles?.content, trimmedChildren, variant],\n );\n\n const { styles } = useStyles();\n\n const iframeBody = useMemo(\n () => (\n <HtmlPreviewIframe\n animated={animated}\n background={background}\n className={classNames?.iframe}\n content={throttledContent}\n defaultHeight={defaultHeight}\n sandbox={sandbox}\n style={customStyles?.iframe}\n />\n ),\n [\n background,\n classNames?.iframe,\n customStyles?.iframe,\n defaultHeight,\n sandbox,\n throttledContent,\n ],\n );\n\n // Shown when the user is on preview mode but the iframe isn't ready\n // yet (Phase 1 of streaming: head still arriving). Holds the eventual\n // iframe height to avoid layout shift on mount.\n //\n // Stream the raw source through `SyntaxHighlighter` at low opacity so\n // the user sees real progress on slow models (a 30-tps DeepSeek\n // pumping a ~5 KB head can otherwise sit on a static spinner for\n // 20+ seconds). A small \"Preparing preview…\" badge keeps the loading\n // state unambiguous. Tail-follow keeps the visible region anchored\n // to the latest tokens — see the `useEffect` below.\n const loadingBody = useMemo(\n () => (\n <div className={styles.loadingRoot} style={{ height: defaultHeight ?? DEFAULT_HEIGHT }}>\n <div className={styles.loadingSource} ref={loadingSourceRef}>\n <SyntaxHighlighter animated={animated} language={'html'} variant={'borderless'}>\n {trimmedChildren}\n </SyntaxHighlighter>\n </div>\n <div className={styles.loadingBackdrop} />\n <div className={styles.loadingBadge}>\n <NeuralNetworkLoading size={16} />\n <span>Preparing preview…</span>\n </div>\n </div>\n ),\n [animated, defaultHeight, styles, trimmedChildren],\n );\n\n const previewBody = isStable ? iframeBody : loadingBody;\n\n const defaultBody = effectiveMode === 'preview' ? previewBody : sourceBody;\n\n const body = useMemo(() => {\n if (!bodyRender) return defaultBody;\n return bodyRender({\n content: trimmedChildren,\n mode: effectiveMode,\n originalNode: defaultBody,\n });\n }, [bodyRender, defaultBody, effectiveMode, trimmedChildren]);\n\n const segmentOptions = useMemo(\n () => [\n { label: 'Preview', value: 'preview' as const },\n { label: 'Source', value: 'source' as const },\n ],\n [],\n );\n\n const iconSize = actionIconSize || 'small';\n\n const originalActions: ReactNode = (\n <>\n {!isFragment && (\n <Segmented\n options={segmentOptions}\n size={'small'}\n value={effectiveMode}\n onChange={(v) => setMode(v as HtmlPreviewMode)}\n />\n )}\n {copyable && <CopyButton content={getCopyContent} size={iconSize} />}\n {downloadable && (\n <ActionIcon\n icon={Download}\n size={iconSize}\n title={'Download HTML'}\n onClick={handleDownload}\n />\n )}\n {onExpand && (\n <ActionIcon\n icon={Expand}\n size={iconSize}\n title={'Open full preview'}\n onClick={handleExpand}\n />\n )}\n </>\n );\n\n const actions = actionsRender\n ? actionsRender({\n actionIconSize: iconSize,\n content: trimmedChildren,\n getContent: getCopyContent,\n mode: effectiveMode,\n originalNode: originalActions,\n setMode,\n })\n : originalActions;\n\n return (\n <div\n className={cx(variants({ shadow, variant }), className)}\n data-code-type=\"html-preview\"\n data-html-preview-language={language}\n style={style}\n {...rest}\n >\n <Flexbox\n horizontal\n align={'center'}\n className={cx(styles.toolbar, classNames?.header)}\n flex={'none'}\n gap={4}\n style={customStyles?.header}\n onClick={stopPropagation}\n >\n {actions}\n </Flexbox>\n {body}\n </div>\n );\n },\n);\n\nHtmlPreview.displayName = 'HtmlPreview';\n\nexport default HtmlPreview;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HtmlPreview.mjs","names":["Flexbox"],"sources":["../../src/HtmlPreview/HtmlPreview.tsx"],"sourcesContent":["'use client';\n\nimport { createStyles, cx, keyframes } from 'antd-style';\nimport { Download, Expand } from 'lucide-react';\nimport { memo, type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport ActionIcon from '@/ActionIcon';\nimport CopyButton from '@/CopyButton';\nimport { Flexbox } from '@/Flex';\nimport { actionsHoverCls, variants } from '@/Highlighter/style';\nimport SyntaxHighlighter from '@/Highlighter/SyntaxHighlighter';\nimport NeuralNetworkLoading from '@/NeuralNetworkLoading';\nimport Segmented from '@/Segmented';\nimport { stopPropagation } from '@/utils/dom';\nimport { downloadBlob } from '@/utils/downloadBlob';\n\nimport { containsScript, DEFAULT_HEIGHT, isFullHtmlDocument, isHtmlContentClosed } from './const';\nimport HtmlPreviewIframe from './Iframe';\nimport type { HtmlPreviewMode, HtmlPreviewProps } from './type';\n\n// Sheen sweep direction: left → right.\n// `background-position` works inversely from \"where the image is drawn\":\n// at `200%` the over-sized gradient starts off to the left of the\n// container, at `-200%` it ends off to the right — so animating\n// 200% → -200% moves the visible bright spot from left to right.\nconst shimmer = keyframes`\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n`;\n\nconst useStyles = createStyles(({ css, cssVar, isDarkMode }) => ({\n loadingBackdrop: css`\n pointer-events: none;\n\n position: absolute;\n z-index: 1;\n inset: 0;\n\n /* Subtle moving sheen so it doesn't look frozen. */\n background: linear-gradient(\n 90deg,\n transparent 0%,\n ${isDarkMode ? 'rgba(255, 255, 255, 0.04)' : 'rgba(0, 0, 0, 0.04)'} 50%,\n transparent 100%\n );\n background-repeat: no-repeat;\n background-size: 200% 100%;\n\n animation: ${shimmer} 1.6s ${cssVar.motionEaseInOut} infinite;\n `,\n loadingBadge: css`\n position: absolute;\n z-index: 2;\n inset-block-start: 12px;\n inset-inline-start: 12px;\n\n display: inline-flex;\n gap: 8px;\n align-items: center;\n\n padding-block: 4px;\n padding-inline: 6px 10px;\n border-radius: 999px;\n\n font-size: 12px;\n color: ${cssVar.colorTextDescription};\n\n background: ${cssVar.colorBgContainer};\n backdrop-filter: blur(8px);\n box-shadow: 0 0 0 1px ${cssVar.colorBorderSecondary};\n `,\n // The streaming source visible during Phase 1 — heavily faded so it\n // reads as \"this is preview-pending content\" rather than the finished\n // article. Auto-follows the tail so the user can see new tokens land\n // even on slow models.\n loadingSource: css`\n pointer-events: none;\n overflow: hidden;\n height: 100%;\n\n /* Faded out so the iframe transition feels like content lighting up,\n not like one document jump-cutting to another. */\n opacity: 0.45;\n\n /* SyntaxHighlighter sets its own background; flatten so the shimmer\n overlay reads cleanly on top. */\n & [data-code-type='highlighter'] {\n background: transparent;\n box-shadow: none;\n }\n\n /* Tail-follow is layout-only — we anchor the scrollable element to\n its scrollHeight via the ref + effect; CSS just keeps the\n overflow hidden. */\n & pre,\n & code {\n background: transparent !important;\n }\n `,\n loadingRoot: css`\n position: relative;\n overflow: hidden;\n background: ${isDarkMode ? '#1f1f1f' : '#fafafa'};\n `,\n // Inline top-right toolbar. Tagged with `actionsHoverCls` so the Highlighter\n // container's `&:hover .${actionsHoverCls} { opacity: 1 }` rule flips it\n // in/out as the user moves over the preview — same UX as the regular code\n // block actions.\n toolbar: cx(\n actionsHoverCls,\n css`\n position: absolute;\n z-index: 2;\n inset-block-start: 8px;\n inset-inline-end: 8px;\n\n padding: 4px;\n border-radius: ${cssVar.borderRadiusLG};\n\n opacity: 0;\n background: ${cssVar.colorBgContainer};\n backdrop-filter: blur(8px);\n box-shadow: 0 0 0 1px ${cssVar.colorBorderSecondary};\n\n transition: opacity 0.2s ${cssVar.motionEaseOut};\n\n &:focus-within {\n opacity: 1;\n }\n `,\n ),\n}));\n\nconst themeBackground = (theme?: 'light' | 'dark') => {\n if (theme === 'dark') return '#1f1f1f';\n if (theme === 'light') return '#ffffff';\n return undefined;\n};\n\nconst downloadHtml = async (content: string, fileName: string) => {\n const blob = new Blob([content], { type: 'text/html;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n try {\n await downloadBlob(url, fileName);\n } finally {\n URL.revokeObjectURL(url);\n }\n};\n\nconst HtmlPreview = memo<HtmlPreviewProps>(\n ({\n actionIconSize,\n actionsRender,\n animated,\n bodyRender,\n children,\n className,\n classNames,\n copyable = true,\n defaultHeight,\n defaultMode = 'preview',\n downloadable = true,\n fileName,\n language = 'html',\n onExpand,\n sandbox,\n shadow,\n streamingMode = 'auto',\n style,\n styles: customStyles,\n theme,\n variant = 'filled',\n // `fullFeatured` / `showLanguage` / `defaultExpand` are accepted for API\n // compatibility with the rest of the Pre family but no longer drive a\n // separate header — the inline toolbar is always rendered.\n fullFeatured: _fullFeatured,\n showLanguage: _showLanguage,\n defaultExpand: _defaultExpand,\n ...rest\n }) => {\n const trimmedChildren = useMemo(() => (children || '').trim(), [children]);\n const isFragment = useMemo(() => !isFullHtmlDocument(trimmedChildren), [trimmedChildren]);\n\n // Per-session tracking. Reset on `animated` edge false → true.\n const [scriptLocked, setScriptLocked] = useState(false);\n const [headClosed, setHeadClosed] = useState(false);\n const [liveCommitted, setLiveCommitted] = useState(false);\n const prevAnimatedRef = useRef(animated);\n const lastCommitRef = useRef(0);\n const pendingTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestContentRef = useRef(trimmedChildren);\n useEffect(() => {\n latestContentRef.current = trimmedChildren;\n }, [trimmedChildren]);\n useEffect(() => {\n if (animated && !prevAnimatedRef.current) {\n setScriptLocked(false);\n setHeadClosed(false);\n setLiveCommitted(false);\n lastCommitRef.current = 0;\n if (pendingTimerRef.current) {\n clearTimeout(pendingTimerRef.current);\n pendingTimerRef.current = null;\n }\n }\n prevAnimatedRef.current = animated;\n }, [animated]);\n\n // Sticky script detection: once a `<script>` appears in this session,\n // auto mode locks into defer.\n useEffect(() => {\n if (animated && !scriptLocked && containsScript(trimmedChildren)) {\n setScriptLocked(true);\n }\n }, [trimmedChildren, animated, scriptLocked]);\n\n // Track whether the head section has closed. Until it does, the iframe\n // would render either nothing or invalid HTML (style tag mid-stream).\n // After `</head>` (or `</style>` as a fallback for documents that skip\n // an explicit head close) we know the visual baseline is locked in.\n useEffect(() => {\n if (animated && !headClosed) {\n const lowered = trimmedChildren.toLowerCase();\n if (lowered.includes('</head>') || lowered.includes('</style>')) {\n setHeadClosed(true);\n }\n }\n }, [trimmedChildren, animated, headClosed]);\n\n // Two-phase streaming commit:\n // Phase 1 (head still streaming) — don't mount iframe at all. There's\n // nothing meaningful to render and styles aren't applied yet.\n // Phase 2 (head closed, body streaming) — commit at most once every\n // ~250ms. Important: this is a TRUE throttle, not a debounce. The\n // pending timer is held in a ref so it survives effect re-runs;\n // when it fires it commits the latest content (via another ref)\n // and clears itself, allowing a fresh schedule. If chunks come in\n // faster than the throttle window (which they do at ~50/sec) we\n // still get a commit every 250ms instead of waiting for streaming\n // to pause.\n // On streaming end → flush immediately, cancel any pending timer.\n const [throttledContent, setThrottledContent] = useState(trimmedChildren);\n useEffect(() => {\n if (!animated) {\n if (pendingTimerRef.current) {\n clearTimeout(pendingTimerRef.current);\n pendingTimerRef.current = null;\n }\n lastCommitRef.current = Date.now();\n setThrottledContent(trimmedChildren);\n return;\n }\n if (!headClosed) return;\n\n const throttleMs = 250;\n const now = Date.now();\n const elapsed = now - lastCommitRef.current;\n\n if (elapsed >= throttleMs) {\n if (pendingTimerRef.current) {\n clearTimeout(pendingTimerRef.current);\n pendingTimerRef.current = null;\n }\n lastCommitRef.current = now;\n setThrottledContent(trimmedChildren);\n return;\n }\n\n // Schedule a future commit, but only if one isn't already pending —\n // every chunk arrival re-runs this effect; we don't want to reset\n // the timer each time (that's debounce, and during continuous\n // streaming it would never fire).\n if (pendingTimerRef.current === null) {\n pendingTimerRef.current = setTimeout(() => {\n lastCommitRef.current = Date.now();\n pendingTimerRef.current = null;\n setThrottledContent(latestContentRef.current);\n }, throttleMs - elapsed);\n }\n }, [trimmedChildren, animated, headClosed]);\n useEffect(\n () => () => {\n if (pendingTimerRef.current) clearTimeout(pendingTimerRef.current);\n },\n [],\n );\n\n // Live-streaming commitment is sticky for the rest of the session. The\n // decision is made the moment the head seals:\n // • `live` → commit unconditionally\n // • `auto` → commit only if no `<script>` has appeared yet (script-\n // bearing docs go down the defer path to avoid running setup() on\n // partial source)\n // • `defer` → never commit; wait for `</html>`\n // Sticky-ness matters for `auto`: if a `<script>` arrives *after* the\n // head has already closed and we've started live-streaming, we keep\n // streaming rather than yanking the rendered content back into a\n // loading state mid-flight. The shell→static swap at end of streaming\n // re-runs the document cleanly anyway.\n useEffect(() => {\n if (!animated || liveCommitted || !headClosed) return;\n if (streamingMode === 'live' || (streamingMode === 'auto' && !scriptLocked)) {\n setLiveCommitted(true);\n }\n }, [animated, headClosed, liveCommitted, scriptLocked, streamingMode]);\n\n // Streaming gate. The iframe can mount in three situations:\n // 1. content is no longer animating\n // 2. `</html>` has arrived\n // 3. live streaming has been committed this session\n const isStable = !animated || isHtmlContentClosed(trimmedChildren) || liveCommitted;\n\n const [mode, setMode] = useState<HtmlPreviewMode>(defaultMode);\n\n // Fragments cannot meaningfully render in preview — force source view.\n // For streaming content that's not yet stable we keep the user's mode\n // choice and substitute a loading placeholder in the body instead, so\n // the toggle UI doesn't flip back and forth as content arrives.\n const effectiveMode: HtmlPreviewMode = isFragment ? 'source' : mode;\n\n const contentRef = useRef(trimmedChildren);\n useEffect(() => {\n contentRef.current = trimmedChildren;\n }, [trimmedChildren]);\n\n // Tail-follow the streaming source visible during Phase 1 — anchor\n // the scroll position to the latest tokens so a slow model's output\n // doesn't sit pinned to the document head while the user waits.\n const loadingSourceRef = useRef<HTMLDivElement | null>(null);\n useEffect(() => {\n if (isStable) return;\n const node = loadingSourceRef.current;\n if (!node) return;\n node.scrollTop = node.scrollHeight;\n }, [trimmedChildren, isStable]);\n\n const getCopyContent = useCallback(() => contentRef.current, []);\n\n const handleDownload = useCallback(() => {\n void downloadHtml(contentRef.current, fileName || 'preview.html');\n }, [fileName]);\n\n const handleExpand = useCallback(() => {\n onExpand?.(contentRef.current);\n }, [onExpand]);\n\n const background = themeBackground(theme);\n\n const sourceBody = useMemo(\n () => (\n <SyntaxHighlighter\n animated={animated}\n className={classNames?.content}\n language={'html'}\n style={{ height: '100%', ...customStyles?.content }}\n variant={variant}\n >\n {trimmedChildren}\n </SyntaxHighlighter>\n ),\n [animated, classNames?.content, customStyles?.content, trimmedChildren, variant],\n );\n\n const { styles } = useStyles();\n\n const iframeBody = useMemo(\n () => (\n <HtmlPreviewIframe\n animated={animated}\n background={background}\n className={classNames?.iframe}\n content={throttledContent}\n defaultHeight={defaultHeight}\n sandbox={sandbox}\n style={customStyles?.iframe}\n />\n ),\n [\n background,\n classNames?.iframe,\n customStyles?.iframe,\n defaultHeight,\n sandbox,\n throttledContent,\n ],\n );\n\n // Shown when the user is on preview mode but the iframe isn't ready\n // yet (Phase 1 of streaming: head still arriving). Holds the eventual\n // iframe height to avoid layout shift on mount.\n //\n // Stream the raw source through `SyntaxHighlighter` at low opacity so\n // the user sees real progress on slow models (a 30-tps DeepSeek\n // pumping a ~5 KB head can otherwise sit on a static spinner for\n // 20+ seconds). A small \"Preparing preview…\" badge keeps the loading\n // state unambiguous. Tail-follow keeps the visible region anchored\n // to the latest tokens — see the `useEffect` below.\n const loadingBody = useMemo(\n () => (\n <div className={styles.loadingRoot} style={{ height: defaultHeight ?? DEFAULT_HEIGHT }}>\n <div className={styles.loadingSource} ref={loadingSourceRef}>\n <SyntaxHighlighter animated={animated} language={'html'} variant={'borderless'}>\n {trimmedChildren}\n </SyntaxHighlighter>\n </div>\n <div className={styles.loadingBackdrop} />\n <div className={styles.loadingBadge}>\n <NeuralNetworkLoading size={16} />\n <span>Preparing preview…</span>\n </div>\n </div>\n ),\n [animated, defaultHeight, styles, trimmedChildren],\n );\n\n const previewBody = isStable ? iframeBody : loadingBody;\n\n const defaultBody = effectiveMode === 'preview' ? previewBody : sourceBody;\n\n const body = useMemo(() => {\n if (!bodyRender) return defaultBody;\n return bodyRender({\n content: trimmedChildren,\n mode: effectiveMode,\n originalNode: defaultBody,\n });\n }, [bodyRender, defaultBody, effectiveMode, trimmedChildren]);\n\n const segmentOptions = useMemo(\n () => [\n { label: 'Preview', value: 'preview' as const },\n { label: 'Source', value: 'source' as const },\n ],\n [],\n );\n\n const iconSize = actionIconSize || 'small';\n\n const originalActions: ReactNode = (\n <>\n {!isFragment && (\n <Segmented\n options={segmentOptions}\n size={'small'}\n value={effectiveMode}\n onChange={(v) => setMode(v as HtmlPreviewMode)}\n />\n )}\n {copyable && <CopyButton content={getCopyContent} size={iconSize} />}\n {downloadable && (\n <ActionIcon\n icon={Download}\n size={iconSize}\n title={'Download HTML'}\n onClick={handleDownload}\n />\n )}\n {onExpand && (\n <ActionIcon\n icon={Expand}\n size={iconSize}\n title={'Open full preview'}\n onClick={handleExpand}\n />\n )}\n </>\n );\n\n const actions = actionsRender\n ? actionsRender({\n actionIconSize: iconSize,\n content: trimmedChildren,\n getContent: getCopyContent,\n mode: effectiveMode,\n originalNode: originalActions,\n setMode,\n })\n : originalActions;\n\n return (\n <div\n className={cx(variants({ shadow, variant }), className)}\n data-code-type=\"html-preview\"\n data-html-preview-language={language}\n style={style}\n {...rest}\n >\n <Flexbox\n horizontal\n align={'center'}\n className={cx(styles.toolbar, classNames?.header)}\n flex={'none'}\n gap={4}\n style={customStyles?.header}\n onClick={stopPropagation}\n >\n {actions}\n </Flexbox>\n {body}\n </div>\n );\n },\n);\n\nHtmlPreview.displayName = 'HtmlPreview';\n\nexport default HtmlPreview;\n"],"mappings":"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"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { HtmlPreviewIframeProps } from "./type.mjs";
|
|
2
|
-
import * as _$react from "react";
|
|
3
|
-
|
|
4
2
|
//#region src/HtmlPreview/Iframe.d.ts
|
|
5
|
-
declare const HtmlPreviewIframe:
|
|
3
|
+
declare const HtmlPreviewIframe: import("react").NamedExoticComponent<HtmlPreviewIframeProps>;
|
|
6
4
|
//#endregion
|
|
7
|
-
export { HtmlPreviewIframe };
|
|
5
|
+
export { HtmlPreviewIframe, HtmlPreviewIframe as default };
|
|
8
6
|
//# sourceMappingURL=Iframe.d.mts.map
|
|
@@ -154,6 +154,6 @@ const HtmlPreviewIframe = memo(({ animated, background, content, className, defa
|
|
|
154
154
|
});
|
|
155
155
|
HtmlPreviewIframe.displayName = "HtmlPreviewIframe";
|
|
156
156
|
//#endregion
|
|
157
|
-
export { HtmlPreviewIframe as default };
|
|
157
|
+
export { HtmlPreviewIframe, HtmlPreviewIframe as default };
|
|
158
158
|
|
|
159
159
|
//# sourceMappingURL=Iframe.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Iframe.mjs","names":[],"sources":["../../src/HtmlPreview/Iframe.tsx"],"sourcesContent":["'use client';\n\nimport { createStyles, cx } from 'antd-style';\nimport { memo, useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\n\nimport { buildShellSrcDoc, SHELL_UPDATE_MESSAGE_TYPE } from './buildShellSrcDoc';\nimport { buildStaticSrcDoc } from './buildStaticSrcDoc';\nimport { DEFAULT_HEIGHT, DEFAULT_SANDBOX, SRCDOC_MAX_LENGTH } from './const';\nimport { AUTO_HEIGHT_MESSAGE_TYPE } from './injectAutoHeightScript';\nimport type { HtmlPreviewIframeProps } from './type';\n\nconst useStyles = createStyles(({ css, cssVar }) => ({\n fallback: css`\n padding: 16px;\n font-size: 13px;\n color: ${cssVar.colorTextDescription};\n `,\n iframe: css`\n display: block;\n width: 100%;\n border: none;\n background: transparent;\n `,\n}));\n\ninterface Payload {\n bodyHtml: string;\n /**\n * Non-inline-style children of `<head>` serialised in document order:\n * `<script src=…>`, `<script>…</script>`, `<link>`, `<meta>`, `<base>`,\n * `<title>` etc. The shell appends/dedupes these into its own head so\n * head-loaded resources (Tailwind CDN, p5.js, fonts, …) work for full\n * documents. Inline `<style>` is intentionally excluded — those flow\n * through `styleContent` so streaming partial CSS grows in place rather\n * than stacking duplicate `<style>` blocks.\n *\n * Empty until the user's `<head>` is *sealed* (a `</head>` close tag has\n * arrived, or `<body>` has opened — browsers auto-close head at that\n * point). Holding off prevents partial `src=\"https://cd\"` URLs from\n * being mounted and 404-ing while the model is still streaming.\n */\n headExtrasHtml: string;\n styleContent: string;\n}\n\n// Head is \"sealed\" as soon as we see a close tag or the body has begun;\n// after that point, additional chunks land in body and head extras won't\n// change.\nconst headSealedPattern = /<\\/head\\s*>|<body[\\s>]/i;\nconst isHeadSealed = (raw: string): boolean => headSealedPattern.test(raw);\n\nconst parseContent = (() => {\n // Lazy-init: only need one parser instance, and only in the browser.\n let parser: DOMParser | null = null;\n return (content: string): Payload | null => {\n if (typeof window === 'undefined') return null;\n if (!content) return { bodyHtml: '', headExtrasHtml: '', styleContent: '' };\n if (!parser) parser = new DOMParser();\n const doc = parser.parseFromString(content, 'text/html');\n\n const styleParts: string[] = [];\n const headExtras: string[] = [];\n\n if (doc.head) {\n for (const child of Array.from(doc.head.children)) {\n if (child.tagName === 'STYLE') {\n styleParts.push(child.textContent || '');\n } else {\n headExtras.push(child.outerHTML);\n }\n }\n }\n\n return {\n bodyHtml: doc.body ? doc.body.innerHTML : '',\n headExtrasHtml: isHeadSealed(content) ? headExtras.join('') : '',\n styleContent: styleParts.join('\\n'),\n };\n };\n})();\n\nexport const HtmlPreviewIframe = memo<HtmlPreviewIframeProps>(\n ({\n animated,\n background,\n content,\n className,\n defaultHeight = DEFAULT_HEIGHT,\n ref,\n sandbox = DEFAULT_SANDBOX,\n style,\n title = 'HTML preview',\n }) => {\n const { styles } = useStyles();\n const innerRef = useRef<HTMLIFrameElement | null>(null);\n const frameId = useId();\n const [height, setHeight] = useState<number>(defaultHeight);\n // Track caller-supplied `defaultHeight` in a ref so the (frameId-keyed)\n // message handler can floor auto-height updates without re-subscribing\n // every render.\n const defaultHeightRef = useRef(defaultHeight);\n useEffect(() => {\n defaultHeightRef.current = defaultHeight;\n }, [defaultHeight]);\n\n const tooLarge = content.length > SRCDOC_MAX_LENGTH;\n\n // ── Static mode ─────────────────────────────────────────────────────\n // When the content isn't being streamed we can hand the iframe the\n // user's HTML directly. The browser's normal HTML parser runs:\n // <script src=…> tags fetch and execute as if on a regular page,\n // inline <script> blocks run in DOM order, MutationObservers (like\n // Tailwind Play CDN's) get the document at its expected lifecycle\n // stage. Anything that a model can produce as a standalone web\n // page works without special handling on our side.\n const staticSrcDoc = useMemo(() => {\n if (animated || tooLarge) return null;\n return buildStaticSrcDoc({ background, content, frameId });\n }, [animated, background, content, frameId, tooLarge]);\n\n // ── Shell mode ─────────────────────────────────────────────────────\n // For streaming we keep one shell iframe loaded for the lifetime of\n // the session and pump content updates through postMessage. The\n // shell's morph script handles in-place DOM diffing + fade-in for\n // new nodes (see buildShellSrcDoc.ts). Tradeoff: external <script\n // src> tags appended this way don't always integrate cleanly with\n // class-engine CDNs, so static content is preferred when possible.\n const shellSrcDoc = useMemo(() => {\n if (!animated || tooLarge) return null;\n return buildShellSrcDoc({ background, frameId });\n }, [animated, background, frameId, tooLarge]);\n\n const [shellReady, setShellReady] = useState(false);\n useEffect(() => {\n // Each time we swap between shell and static modes (or rebuild the\n // shell because the theme changed) we need to wait for a fresh\n // ready ping before posting content.\n setShellReady(false);\n }, [shellSrcDoc]);\n\n const payload = useMemo<Payload | null>(() => {\n if (!animated || tooLarge) return null;\n return parseContent(content);\n }, [animated, content, tooLarge]);\n\n // Push content into the shell iframe whenever it changes — but only\n // after the shell has signalled ready, so its listener exists.\n useEffect(() => {\n if (!animated) return;\n if (!shellReady || !payload) return;\n const win = innerRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n {\n frameId,\n payload,\n type: SHELL_UPDATE_MESSAGE_TYPE,\n },\n '*',\n );\n }, [animated, payload, shellReady, frameId]);\n\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n const data = event.data;\n if (!data || typeof data !== 'object') return;\n if (data.frameId !== frameId) return;\n if (event.source !== innerRef.current?.contentWindow) return;\n\n if (data.type === `${SHELL_UPDATE_MESSAGE_TYPE}:ready`) {\n setShellReady(true);\n return;\n }\n\n if (data.type === AUTO_HEIGHT_MESSAGE_TYPE) {\n const next = Number(data.height);\n if (!Number.isFinite(next) || next <= 0) return;\n // Floor at `defaultHeight`. During streaming the shell body\n // briefly reports a small height between morph commits (empty\n // body just after head closes, then partial body, etc.) and on\n // every iframe remount the auto-height starts at body padding\n // before climbing back to content height. Letting the iframe\n // shrink to that interim height causes a visible up/down jitter\n // that reads as flicker — especially under a Markdown wrapper\n // that re-renders every chunk. Anchoring to the caller's stated\n // minimum height eliminates that without affecting the final\n // size: real content taller than `defaultHeight` grows the\n // iframe; content shorter than it stays at the floor.\n const floored = Math.max(next, defaultHeightRef.current);\n setHeight((prev) => (Math.abs(prev - floored) < 1 ? prev : floored));\n }\n };\n\n window.addEventListener('message', handler);\n return () => window.removeEventListener('message', handler);\n }, [frameId]);\n\n const setRef = useCallback(\n (node: HTMLIFrameElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as { current: HTMLIFrameElement | null }).current = node;\n },\n [ref],\n );\n\n if (tooLarge) {\n return (\n <div className={cx(styles.fallback, className)} style={style}>\n Content too large to preview inline.\n </div>\n );\n }\n\n const srcDoc = staticSrcDoc ?? shellSrcDoc ?? '';\n\n // Key the iframe by mode so React fully unmounts the previous DOM\n // element when we switch from shell (streaming) to static (finalised).\n // Setting iframe.srcdoc on an already-loaded element doesn't reliably\n // re-navigate in Chromium when the previous document was also srcdoc-\n // based — the new srcdoc attribute lands, but the document doesn't\n // reload, so the user sees stale (often empty) shell content. A fresh\n // element forces the browser to parse and load the new srcdoc.\n const iframeKey = animated ? 'shell' : 'static';\n\n return (\n <iframe\n className={cx(styles.iframe, className)}\n key={iframeKey}\n ref={setRef}\n sandbox={sandbox}\n srcDoc={srcDoc}\n style={{ height, ...style }}\n title={title}\n />\n );\n },\n);\n\nHtmlPreviewIframe.displayName = 'HtmlPreviewIframe';\n\nexport default HtmlPreviewIframe;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Iframe.mjs","names":[],"sources":["../../src/HtmlPreview/Iframe.tsx"],"sourcesContent":["'use client';\n\nimport { createStyles, cx } from 'antd-style';\nimport { memo, useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\n\nimport { buildShellSrcDoc, SHELL_UPDATE_MESSAGE_TYPE } from './buildShellSrcDoc';\nimport { buildStaticSrcDoc } from './buildStaticSrcDoc';\nimport { DEFAULT_HEIGHT, DEFAULT_SANDBOX, SRCDOC_MAX_LENGTH } from './const';\nimport { AUTO_HEIGHT_MESSAGE_TYPE } from './injectAutoHeightScript';\nimport type { HtmlPreviewIframeProps } from './type';\n\nconst useStyles = createStyles(({ css, cssVar }) => ({\n fallback: css`\n padding: 16px;\n font-size: 13px;\n color: ${cssVar.colorTextDescription};\n `,\n iframe: css`\n display: block;\n width: 100%;\n border: none;\n background: transparent;\n `,\n}));\n\ninterface Payload {\n bodyHtml: string;\n /**\n * Non-inline-style children of `<head>` serialised in document order:\n * `<script src=…>`, `<script>…</script>`, `<link>`, `<meta>`, `<base>`,\n * `<title>` etc. The shell appends/dedupes these into its own head so\n * head-loaded resources (Tailwind CDN, p5.js, fonts, …) work for full\n * documents. Inline `<style>` is intentionally excluded — those flow\n * through `styleContent` so streaming partial CSS grows in place rather\n * than stacking duplicate `<style>` blocks.\n *\n * Empty until the user's `<head>` is *sealed* (a `</head>` close tag has\n * arrived, or `<body>` has opened — browsers auto-close head at that\n * point). Holding off prevents partial `src=\"https://cd\"` URLs from\n * being mounted and 404-ing while the model is still streaming.\n */\n headExtrasHtml: string;\n styleContent: string;\n}\n\n// Head is \"sealed\" as soon as we see a close tag or the body has begun;\n// after that point, additional chunks land in body and head extras won't\n// change.\nconst headSealedPattern = /<\\/head\\s*>|<body[\\s>]/i;\nconst isHeadSealed = (raw: string): boolean => headSealedPattern.test(raw);\n\nconst parseContent = (() => {\n // Lazy-init: only need one parser instance, and only in the browser.\n let parser: DOMParser | null = null;\n return (content: string): Payload | null => {\n if (typeof window === 'undefined') return null;\n if (!content) return { bodyHtml: '', headExtrasHtml: '', styleContent: '' };\n if (!parser) parser = new DOMParser();\n const doc = parser.parseFromString(content, 'text/html');\n\n const styleParts: string[] = [];\n const headExtras: string[] = [];\n\n if (doc.head) {\n for (const child of Array.from(doc.head.children)) {\n if (child.tagName === 'STYLE') {\n styleParts.push(child.textContent || '');\n } else {\n headExtras.push(child.outerHTML);\n }\n }\n }\n\n return {\n bodyHtml: doc.body ? doc.body.innerHTML : '',\n headExtrasHtml: isHeadSealed(content) ? headExtras.join('') : '',\n styleContent: styleParts.join('\\n'),\n };\n };\n})();\n\nexport const HtmlPreviewIframe = memo<HtmlPreviewIframeProps>(\n ({\n animated,\n background,\n content,\n className,\n defaultHeight = DEFAULT_HEIGHT,\n ref,\n sandbox = DEFAULT_SANDBOX,\n style,\n title = 'HTML preview',\n }) => {\n const { styles } = useStyles();\n const innerRef = useRef<HTMLIFrameElement | null>(null);\n const frameId = useId();\n const [height, setHeight] = useState<number>(defaultHeight);\n // Track caller-supplied `defaultHeight` in a ref so the (frameId-keyed)\n // message handler can floor auto-height updates without re-subscribing\n // every render.\n const defaultHeightRef = useRef(defaultHeight);\n useEffect(() => {\n defaultHeightRef.current = defaultHeight;\n }, [defaultHeight]);\n\n const tooLarge = content.length > SRCDOC_MAX_LENGTH;\n\n // ── Static mode ─────────────────────────────────────────────────────\n // When the content isn't being streamed we can hand the iframe the\n // user's HTML directly. The browser's normal HTML parser runs:\n // <script src=…> tags fetch and execute as if on a regular page,\n // inline <script> blocks run in DOM order, MutationObservers (like\n // Tailwind Play CDN's) get the document at its expected lifecycle\n // stage. Anything that a model can produce as a standalone web\n // page works without special handling on our side.\n const staticSrcDoc = useMemo(() => {\n if (animated || tooLarge) return null;\n return buildStaticSrcDoc({ background, content, frameId });\n }, [animated, background, content, frameId, tooLarge]);\n\n // ── Shell mode ─────────────────────────────────────────────────────\n // For streaming we keep one shell iframe loaded for the lifetime of\n // the session and pump content updates through postMessage. The\n // shell's morph script handles in-place DOM diffing + fade-in for\n // new nodes (see buildShellSrcDoc.ts). Tradeoff: external <script\n // src> tags appended this way don't always integrate cleanly with\n // class-engine CDNs, so static content is preferred when possible.\n const shellSrcDoc = useMemo(() => {\n if (!animated || tooLarge) return null;\n return buildShellSrcDoc({ background, frameId });\n }, [animated, background, frameId, tooLarge]);\n\n const [shellReady, setShellReady] = useState(false);\n useEffect(() => {\n // Each time we swap between shell and static modes (or rebuild the\n // shell because the theme changed) we need to wait for a fresh\n // ready ping before posting content.\n setShellReady(false);\n }, [shellSrcDoc]);\n\n const payload = useMemo<Payload | null>(() => {\n if (!animated || tooLarge) return null;\n return parseContent(content);\n }, [animated, content, tooLarge]);\n\n // Push content into the shell iframe whenever it changes — but only\n // after the shell has signalled ready, so its listener exists.\n useEffect(() => {\n if (!animated) return;\n if (!shellReady || !payload) return;\n const win = innerRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n {\n frameId,\n payload,\n type: SHELL_UPDATE_MESSAGE_TYPE,\n },\n '*',\n );\n }, [animated, payload, shellReady, frameId]);\n\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n const data = event.data;\n if (!data || typeof data !== 'object') return;\n if (data.frameId !== frameId) return;\n if (event.source !== innerRef.current?.contentWindow) return;\n\n if (data.type === `${SHELL_UPDATE_MESSAGE_TYPE}:ready`) {\n setShellReady(true);\n return;\n }\n\n if (data.type === AUTO_HEIGHT_MESSAGE_TYPE) {\n const next = Number(data.height);\n if (!Number.isFinite(next) || next <= 0) return;\n // Floor at `defaultHeight`. During streaming the shell body\n // briefly reports a small height between morph commits (empty\n // body just after head closes, then partial body, etc.) and on\n // every iframe remount the auto-height starts at body padding\n // before climbing back to content height. Letting the iframe\n // shrink to that interim height causes a visible up/down jitter\n // that reads as flicker — especially under a Markdown wrapper\n // that re-renders every chunk. Anchoring to the caller's stated\n // minimum height eliminates that without affecting the final\n // size: real content taller than `defaultHeight` grows the\n // iframe; content shorter than it stays at the floor.\n const floored = Math.max(next, defaultHeightRef.current);\n setHeight((prev) => (Math.abs(prev - floored) < 1 ? prev : floored));\n }\n };\n\n window.addEventListener('message', handler);\n return () => window.removeEventListener('message', handler);\n }, [frameId]);\n\n const setRef = useCallback(\n (node: HTMLIFrameElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as { current: HTMLIFrameElement | null }).current = node;\n },\n [ref],\n );\n\n if (tooLarge) {\n return (\n <div className={cx(styles.fallback, className)} style={style}>\n Content too large to preview inline.\n </div>\n );\n }\n\n const srcDoc = staticSrcDoc ?? shellSrcDoc ?? '';\n\n // Key the iframe by mode so React fully unmounts the previous DOM\n // element when we switch from shell (streaming) to static (finalised).\n // Setting iframe.srcdoc on an already-loaded element doesn't reliably\n // re-navigate in Chromium when the previous document was also srcdoc-\n // based — the new srcdoc attribute lands, but the document doesn't\n // reload, so the user sees stale (often empty) shell content. A fresh\n // element forces the browser to parse and load the new srcdoc.\n const iframeKey = animated ? 'shell' : 'static';\n\n return (\n <iframe\n className={cx(styles.iframe, className)}\n key={iframeKey}\n ref={setRef}\n sandbox={sandbox}\n srcDoc={srcDoc}\n style={{ height, ...style }}\n title={title}\n />\n );\n },\n);\n\nHtmlPreviewIframe.displayName = 'HtmlPreviewIframe';\n\nexport default HtmlPreviewIframe;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildShellSrcDoc.mjs","names":[],"sources":["../../src/HtmlPreview/buildShellSrcDoc.ts"],"sourcesContent":["import { buildAutoHeightScript } from './injectAutoHeightScript';\nimport { STORAGE_SHIM_SCRIPT } from './injectStorageShim';\n\nexport const SHELL_UPDATE_MESSAGE_TYPE = 'lobe-html-shell-update';\n\ninterface BuildShellSrcDocOptions {\n background?: string;\n frameId: string;\n}\n\n/**\n * Build the iframe's one-and-only document.\n *\n * Why a \"shell\" doc:\n * The iframe is loaded *once* and never reloads during a streaming session.\n * All subsequent body updates arrive via `postMessage` from the parent\n * (see `SHELL_UPDATE_MESSAGE_TYPE`). The script in this document morphs the\n * live DOM in place, so already-painted nodes stay untouched — only nodes\n * that are *new* to this commit get a `.lobe-html-new` class and a CSS\n * fade-in. No iframe reload means no white flash, no script reboots, and\n * no jitter from height resets.\n */\nexport const buildShellSrcDoc = ({ background, frameId }: BuildShellSrcDocOptions): string => {\n const baseRules = `html,body{margin:0;padding:0;${background ? `background:${background};` : ''}color-scheme:light dark;}`;\n const fadeRules = `@keyframes lobe-html-fade{from{opacity:0}to{opacity:1}}.lobe-html-new{animation:lobe-html-fade 240ms ease-out both;}`;\n\n const morphScript = `\n(function () {\n var FRAME_ID = ${JSON.stringify(frameId)};\n var UPDATE_TYPE = ${JSON.stringify(SHELL_UPDATE_MESSAGE_TYPE)};\n\n function cloneScript(src) {\n // <script> elements parsed via DOMParser are inert. Rebuild them as\n // proper DOM scripts so the browser executes them.\n //\n // Important: only set .text for inline scripts. Setting it on a\n // src-bearing script (even to an empty string) causes some browser /\n // extension combinations to treat the element as an inline script\n // with empty body and skip the external fetch — so the CDN never\n // loads. We just copy attributes; the browser will fetch the src on\n // append.\n var s = document.createElement('script');\n for (var i = 0; i < src.attributes.length; i++) {\n var a = src.attributes[i];\n s.setAttribute(a.name, a.value);\n }\n if (!src.hasAttribute('src')) {\n var text = src.textContent;\n if (text) s.text = text;\n }\n return s;\n }\n\n function importNode(node) {\n if (node.nodeType === Node.ELEMENT_NODE && node.tagName === 'SCRIPT') {\n return cloneScript(node);\n }\n return document.importNode(node, true);\n }\n\n function markFadeIn(node) {\n if (node.nodeType === Node.ELEMENT_NODE && node.classList) {\n node.classList.add('lobe-html-new');\n }\n }\n\n // Recursive prefix-match morph. For each parent we match leading children\n // that already exist (by outerHTML or recursive morph), then we remove\n // trailing children that no longer exist, and finally append the new\n // tail with a fade-in class.\n function morph(oldEl, newEl) {\n if (oldEl.nodeType !== newEl.nodeType) return false;\n if (oldEl.nodeType !== Node.ELEMENT_NODE) return false;\n if (oldEl.tagName !== newEl.tagName) return false;\n\n // Sync attributes\n var oldAttrs = oldEl.attributes;\n for (var i = oldAttrs.length - 1; i >= 0; i--) {\n var an = oldAttrs[i].name;\n if (!newEl.hasAttribute(an)) oldEl.removeAttribute(an);\n }\n var newAttrs = newEl.attributes;\n for (var j = 0; j < newAttrs.length; j++) {\n var na = newAttrs[j];\n if (oldEl.getAttribute(na.name) !== na.value) {\n oldEl.setAttribute(na.name, na.value);\n }\n }\n\n var oldKids = oldEl.childNodes;\n var newKids = newEl.childNodes;\n var commonLen = 0;\n\n while (commonLen < oldKids.length && commonLen < newKids.length) {\n var o = oldKids[commonLen];\n var n = newKids[commonLen];\n if (o.nodeType !== n.nodeType) break;\n if (o.nodeType === Node.TEXT_NODE) {\n if (o.textContent !== n.textContent) {\n // Update text content in place — no fade for text.\n o.textContent = n.textContent;\n }\n commonLen++;\n } else if (o.nodeType === Node.ELEMENT_NODE) {\n // Cheap identity check before recursing.\n if (o.outerHTML === n.outerHTML) {\n commonLen++;\n } else if (morph(o, n)) {\n commonLen++;\n } else {\n break;\n }\n } else {\n commonLen++;\n }\n }\n\n // Trim old trailing children that no longer exist.\n while (oldEl.childNodes.length > commonLen) {\n oldEl.removeChild(oldEl.lastChild);\n }\n\n // Append the new tail with fade-in markers, batched through a\n // DocumentFragment. A flat sequence of appendChild calls fires one\n // mutation per element — MutationObserver libraries (Tailwind Play\n // CDN, Stimulus, etc.) that batch their work can drop intermediate\n // notifications if they arrive too quickly. Going through a fragment\n // delivers exactly one childList mutation that lists all new nodes\n // at once, which observers handle reliably.\n if (commonLen < newKids.length) {\n var frag = document.createDocumentFragment();\n for (var k = commonLen; k < newKids.length; k++) {\n var imported = importNode(newKids[k]);\n markFadeIn(imported);\n frag.appendChild(imported);\n }\n oldEl.appendChild(frag);\n }\n\n return true;\n }\n\n // Track which head extras (scripts/links/meta/title/base) we've already\n // mounted so re-arriving chunks don't re-execute scripts or duplicate\n // resources. Keyed by outerHTML — for streaming partial URLs each\n // partial-and-then-complete tag is a distinct key, which means a partial\n // CDN URL may briefly 404 before the complete one succeeds. That's\n // acceptable; the alternative (waiting for the closing tag heuristic) is\n // fragile and would defeat the live-CDN use case entirely.\n var headSeen = Object.create(null);\n\n function syncHeadExtras(headExtrasHtml) {\n if (typeof headExtrasHtml !== 'string') return;\n var parser = new DOMParser();\n var doc = parser.parseFromString(\n '<!doctype html><html><head>' + headExtrasHtml + '</head></html>',\n 'text/html',\n );\n var children = doc.head ? doc.head.children : [];\n for (var i = 0; i < children.length; i++) {\n var src = children[i];\n var key = src.outerHTML;\n if (headSeen[key]) continue;\n headSeen[key] = true;\n var clone = importNode(src);\n // Tag for debugging — also keeps these distinguishable from the\n // shell's own head children if anything ever needs to inspect them.\n if (clone.setAttribute) clone.setAttribute('data-lobe-user', '');\n document.head.appendChild(clone);\n }\n }\n\n function applyUpdate(payload) {\n if (!payload) return;\n\n // 1) Inline user styles: merged into a single growing <style> element.\n // Streaming partial CSS just keeps overwriting this text until the\n // rules become complete, so we don't stack half-parsed <style>\n // blocks in the head.\n var styleEl = document.getElementById('lobe-user-style');\n if (styleEl && styleEl.textContent !== payload.styleContent) {\n styleEl.textContent = payload.styleContent || '';\n }\n\n // 2) Everything else in the user's <head> (scripts, links, meta, …):\n // append-with-dedupe so head-loaded resources actually run.\n syncHeadExtras(payload.headExtrasHtml);\n\n // 3) Body: in-place morph with fade-in on new nodes.\n var bodyParser = new DOMParser();\n var newDoc = bodyParser.parseFromString(\n '<!doctype html><html><body>' + (payload.bodyHtml || '') + '</body></html>',\n 'text/html',\n );\n\n // morph() returns false only for type mismatch on the root — body to\n // body always matches, so this is safe.\n morph(document.body, newDoc.body);\n\n // Nudge class-engine CDNs (Tailwind Play CDN, Stimulus, etc.) into\n // re-scanning the document. They watch via MutationObserver but some\n // implementations only consider the directly-mutated nodes from each\n // record and skip recursing into nested descendants, so deeply-styled\n // subtrees can end up with un-generated utility classes. Toggling a\n // throwaway class on body produces an attribute mutation that prompts\n // a fresh full-document scan.\n try {\n document.body.classList.add('_lobe-rescan');\n document.body.classList.remove('_lobe-rescan');\n } catch (_) {}\n }\n\n window.addEventListener('message', function (event) {\n var data = event.data;\n if (!data || data.type !== UPDATE_TYPE || data.frameId !== FRAME_ID) return;\n applyUpdate(data.payload);\n });\n\n // Signal the parent that the listener is wired up so it can flush any\n // pending content that was queued before this script ran.\n try {\n parent.postMessage({ type: UPDATE_TYPE + ':ready', frameId: FRAME_ID }, '*');\n } catch (_) {}\n})();\n`;\n\n return `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<style>${baseRules}${fadeRules}</style>\n<style id=\"lobe-user-style\"></style>\n<script>${STORAGE_SHIM_SCRIPT}</script>\n<script>${buildAutoHeightScript(frameId)}</script>\n<script>${morphScript}</script>\n</head>\n<body></body>\n</html>`;\n};\n"],"mappings":";;;AAGA,MAAa,4BAA4B;;;;;;;;;;;;;AAmBzC,MAAa,oBAAoB,EAAE,YAAY,cAA+C;CAC5F,MAAM,YAAY,gCAAgC,aAAa,cAAc,WAAW,KAAK,GAAG;CAChG,MAAM,YAAY;CAElB,MAAM,cAAc;;mBAEH,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"buildShellSrcDoc.mjs","names":[],"sources":["../../src/HtmlPreview/buildShellSrcDoc.ts"],"sourcesContent":["import { buildAutoHeightScript } from './injectAutoHeightScript';\nimport { STORAGE_SHIM_SCRIPT } from './injectStorageShim';\n\nexport const SHELL_UPDATE_MESSAGE_TYPE = 'lobe-html-shell-update';\n\ninterface BuildShellSrcDocOptions {\n background?: string;\n frameId: string;\n}\n\n/**\n * Build the iframe's one-and-only document.\n *\n * Why a \"shell\" doc:\n * The iframe is loaded *once* and never reloads during a streaming session.\n * All subsequent body updates arrive via `postMessage` from the parent\n * (see `SHELL_UPDATE_MESSAGE_TYPE`). The script in this document morphs the\n * live DOM in place, so already-painted nodes stay untouched — only nodes\n * that are *new* to this commit get a `.lobe-html-new` class and a CSS\n * fade-in. No iframe reload means no white flash, no script reboots, and\n * no jitter from height resets.\n */\nexport const buildShellSrcDoc = ({ background, frameId }: BuildShellSrcDocOptions): string => {\n const baseRules = `html,body{margin:0;padding:0;${background ? `background:${background};` : ''}color-scheme:light dark;}`;\n const fadeRules = `@keyframes lobe-html-fade{from{opacity:0}to{opacity:1}}.lobe-html-new{animation:lobe-html-fade 240ms ease-out both;}`;\n\n const morphScript = `\n(function () {\n var FRAME_ID = ${JSON.stringify(frameId)};\n var UPDATE_TYPE = ${JSON.stringify(SHELL_UPDATE_MESSAGE_TYPE)};\n\n function cloneScript(src) {\n // <script> elements parsed via DOMParser are inert. Rebuild them as\n // proper DOM scripts so the browser executes them.\n //\n // Important: only set .text for inline scripts. Setting it on a\n // src-bearing script (even to an empty string) causes some browser /\n // extension combinations to treat the element as an inline script\n // with empty body and skip the external fetch — so the CDN never\n // loads. We just copy attributes; the browser will fetch the src on\n // append.\n var s = document.createElement('script');\n for (var i = 0; i < src.attributes.length; i++) {\n var a = src.attributes[i];\n s.setAttribute(a.name, a.value);\n }\n if (!src.hasAttribute('src')) {\n var text = src.textContent;\n if (text) s.text = text;\n }\n return s;\n }\n\n function importNode(node) {\n if (node.nodeType === Node.ELEMENT_NODE && node.tagName === 'SCRIPT') {\n return cloneScript(node);\n }\n return document.importNode(node, true);\n }\n\n function markFadeIn(node) {\n if (node.nodeType === Node.ELEMENT_NODE && node.classList) {\n node.classList.add('lobe-html-new');\n }\n }\n\n // Recursive prefix-match morph. For each parent we match leading children\n // that already exist (by outerHTML or recursive morph), then we remove\n // trailing children that no longer exist, and finally append the new\n // tail with a fade-in class.\n function morph(oldEl, newEl) {\n if (oldEl.nodeType !== newEl.nodeType) return false;\n if (oldEl.nodeType !== Node.ELEMENT_NODE) return false;\n if (oldEl.tagName !== newEl.tagName) return false;\n\n // Sync attributes\n var oldAttrs = oldEl.attributes;\n for (var i = oldAttrs.length - 1; i >= 0; i--) {\n var an = oldAttrs[i].name;\n if (!newEl.hasAttribute(an)) oldEl.removeAttribute(an);\n }\n var newAttrs = newEl.attributes;\n for (var j = 0; j < newAttrs.length; j++) {\n var na = newAttrs[j];\n if (oldEl.getAttribute(na.name) !== na.value) {\n oldEl.setAttribute(na.name, na.value);\n }\n }\n\n var oldKids = oldEl.childNodes;\n var newKids = newEl.childNodes;\n var commonLen = 0;\n\n while (commonLen < oldKids.length && commonLen < newKids.length) {\n var o = oldKids[commonLen];\n var n = newKids[commonLen];\n if (o.nodeType !== n.nodeType) break;\n if (o.nodeType === Node.TEXT_NODE) {\n if (o.textContent !== n.textContent) {\n // Update text content in place — no fade for text.\n o.textContent = n.textContent;\n }\n commonLen++;\n } else if (o.nodeType === Node.ELEMENT_NODE) {\n // Cheap identity check before recursing.\n if (o.outerHTML === n.outerHTML) {\n commonLen++;\n } else if (morph(o, n)) {\n commonLen++;\n } else {\n break;\n }\n } else {\n commonLen++;\n }\n }\n\n // Trim old trailing children that no longer exist.\n while (oldEl.childNodes.length > commonLen) {\n oldEl.removeChild(oldEl.lastChild);\n }\n\n // Append the new tail with fade-in markers, batched through a\n // DocumentFragment. A flat sequence of appendChild calls fires one\n // mutation per element — MutationObserver libraries (Tailwind Play\n // CDN, Stimulus, etc.) that batch their work can drop intermediate\n // notifications if they arrive too quickly. Going through a fragment\n // delivers exactly one childList mutation that lists all new nodes\n // at once, which observers handle reliably.\n if (commonLen < newKids.length) {\n var frag = document.createDocumentFragment();\n for (var k = commonLen; k < newKids.length; k++) {\n var imported = importNode(newKids[k]);\n markFadeIn(imported);\n frag.appendChild(imported);\n }\n oldEl.appendChild(frag);\n }\n\n return true;\n }\n\n // Track which head extras (scripts/links/meta/title/base) we've already\n // mounted so re-arriving chunks don't re-execute scripts or duplicate\n // resources. Keyed by outerHTML — for streaming partial URLs each\n // partial-and-then-complete tag is a distinct key, which means a partial\n // CDN URL may briefly 404 before the complete one succeeds. That's\n // acceptable; the alternative (waiting for the closing tag heuristic) is\n // fragile and would defeat the live-CDN use case entirely.\n var headSeen = Object.create(null);\n\n function syncHeadExtras(headExtrasHtml) {\n if (typeof headExtrasHtml !== 'string') return;\n var parser = new DOMParser();\n var doc = parser.parseFromString(\n '<!doctype html><html><head>' + headExtrasHtml + '</head></html>',\n 'text/html',\n );\n var children = doc.head ? doc.head.children : [];\n for (var i = 0; i < children.length; i++) {\n var src = children[i];\n var key = src.outerHTML;\n if (headSeen[key]) continue;\n headSeen[key] = true;\n var clone = importNode(src);\n // Tag for debugging — also keeps these distinguishable from the\n // shell's own head children if anything ever needs to inspect them.\n if (clone.setAttribute) clone.setAttribute('data-lobe-user', '');\n document.head.appendChild(clone);\n }\n }\n\n function applyUpdate(payload) {\n if (!payload) return;\n\n // 1) Inline user styles: merged into a single growing <style> element.\n // Streaming partial CSS just keeps overwriting this text until the\n // rules become complete, so we don't stack half-parsed <style>\n // blocks in the head.\n var styleEl = document.getElementById('lobe-user-style');\n if (styleEl && styleEl.textContent !== payload.styleContent) {\n styleEl.textContent = payload.styleContent || '';\n }\n\n // 2) Everything else in the user's <head> (scripts, links, meta, …):\n // append-with-dedupe so head-loaded resources actually run.\n syncHeadExtras(payload.headExtrasHtml);\n\n // 3) Body: in-place morph with fade-in on new nodes.\n var bodyParser = new DOMParser();\n var newDoc = bodyParser.parseFromString(\n '<!doctype html><html><body>' + (payload.bodyHtml || '') + '</body></html>',\n 'text/html',\n );\n\n // morph() returns false only for type mismatch on the root — body to\n // body always matches, so this is safe.\n morph(document.body, newDoc.body);\n\n // Nudge class-engine CDNs (Tailwind Play CDN, Stimulus, etc.) into\n // re-scanning the document. They watch via MutationObserver but some\n // implementations only consider the directly-mutated nodes from each\n // record and skip recursing into nested descendants, so deeply-styled\n // subtrees can end up with un-generated utility classes. Toggling a\n // throwaway class on body produces an attribute mutation that prompts\n // a fresh full-document scan.\n try {\n document.body.classList.add('_lobe-rescan');\n document.body.classList.remove('_lobe-rescan');\n } catch (_) {}\n }\n\n window.addEventListener('message', function (event) {\n var data = event.data;\n if (!data || data.type !== UPDATE_TYPE || data.frameId !== FRAME_ID) return;\n applyUpdate(data.payload);\n });\n\n // Signal the parent that the listener is wired up so it can flush any\n // pending content that was queued before this script ran.\n try {\n parent.postMessage({ type: UPDATE_TYPE + ':ready', frameId: FRAME_ID }, '*');\n } catch (_) {}\n})();\n`;\n\n return `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<style>${baseRules}${fadeRules}</style>\n<style id=\"lobe-user-style\"></style>\n<script>${STORAGE_SHIM_SCRIPT}</script>\n<script>${buildAutoHeightScript(frameId)}</script>\n<script>${morphScript}</script>\n</head>\n<body></body>\n</html>`;\n};\n"],"mappings":";;;AAGA,MAAa,4BAA4B;;;;;;;;;;;;;AAmBzC,MAAa,oBAAoB,EAAE,YAAY,cAA+C;CAC5F,MAAM,YAAY,gCAAgC,aAAa,cAAc,WAAW,KAAK,GAAG;CAChG,MAAM,YAAY;CAElB,MAAM,cAAc;;mBAEH,KAAK,UAAU,OAAO,EAAE;sBACrB,KAAK,UAAU,yBAAyB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqM9D,OAAO;;;;SAIA,YAAY,UAAU;;UAErB,oBAAoB;UACpB,sBAAsB,OAAO,EAAE;UAC/B,YAAY;;;;AAItB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildStaticSrcDoc.mjs","names":[],"sources":["../../src/HtmlPreview/buildStaticSrcDoc.ts"],"sourcesContent":["import { buildAutoHeightScript } from './injectAutoHeightScript';\nimport { STORAGE_SHIM_SCRIPT } from './injectStorageShim';\n\ninterface BuildStaticSrcDocOptions {\n background?: string;\n content: string;\n frameId: string;\n}\n\nconst shimsBlock = (frameId: string) =>\n `<script>${STORAGE_SHIM_SCRIPT}</script><script>${buildAutoHeightScript(frameId)}</script>`;\n\nconst baseStyle = (background?: string) =>\n `<style>html,body{margin:0;padding:0;${background ? `background:${background};` : ''}color-scheme:light dark;}</style>`;\n\n/**\n * Wrap a user's HTML document with our shims so the iframe can load it as\n * a single self-contained srcDoc. This path is used when the content is\n * *static* (not streaming) — the browser parses it via the normal HTML\n * pipeline, so external `<script src=…>` tags load and execute exactly\n * like they would on a regular page. Tailwind CDN, Chart.js, p5.js — all\n * the things a Play CDN expects to see at parse time — work naturally.\n *\n * For *streaming* content we instead use `buildShellSrcDoc` + postMessage\n * morph, which trades reliable script execution for the ability to fade\n * in new nodes without reloading the iframe.\n *\n * Strategy: inject our shims (storage shim, auto-height) as early in the\n * resulting `<head>` as possible so they run before any user script. If\n * the user supplied a `<head>` open tag we slot the shims in right after\n * it; otherwise we wrap a minimal document around fragments.\n */\nexport const buildStaticSrcDoc = ({\n background,\n content,\n frameId,\n}: BuildStaticSrcDocOptions): string => {\n const head = `${baseStyle(background)}${shimsBlock(frameId)}`;\n const lower = content.toLowerCase();\n const hasHtmlTag = lower.includes('<html');\n\n if (!hasHtmlTag) {\n return `<!DOCTYPE html><html><head><meta charset=\"utf-8\">${head}</head><body>${content}</body></html>`;\n }\n\n const headOpenMatch = content.match(/<head\\b[^>]*>/i);\n if (headOpenMatch) {\n const idx = headOpenMatch.index! + headOpenMatch[0].length;\n return content.slice(0, idx) + head + content.slice(idx);\n }\n\n const headCloseIdx = lower.indexOf('</head>');\n if (headCloseIdx !== -1) {\n return content.slice(0, headCloseIdx) + head + content.slice(headCloseIdx);\n }\n\n const htmlOpenMatch = content.match(/<html\\b[^>]*>/i);\n if (htmlOpenMatch) {\n const idx = htmlOpenMatch.index! + htmlOpenMatch[0].length;\n return content.slice(0, idx) + `<head>${head}</head>` + content.slice(idx);\n }\n\n return `<!DOCTYPE html><html><head>${head}</head><body>${content}</body></html>`;\n};\n"],"mappings":";;;AASA,MAAM,cAAc,YAClB,WAAW,oBAAoB,oBAAmB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"buildStaticSrcDoc.mjs","names":[],"sources":["../../src/HtmlPreview/buildStaticSrcDoc.ts"],"sourcesContent":["import { buildAutoHeightScript } from './injectAutoHeightScript';\nimport { STORAGE_SHIM_SCRIPT } from './injectStorageShim';\n\ninterface BuildStaticSrcDocOptions {\n background?: string;\n content: string;\n frameId: string;\n}\n\nconst shimsBlock = (frameId: string) =>\n `<script>${STORAGE_SHIM_SCRIPT}</script><script>${buildAutoHeightScript(frameId)}</script>`;\n\nconst baseStyle = (background?: string) =>\n `<style>html,body{margin:0;padding:0;${background ? `background:${background};` : ''}color-scheme:light dark;}</style>`;\n\n/**\n * Wrap a user's HTML document with our shims so the iframe can load it as\n * a single self-contained srcDoc. This path is used when the content is\n * *static* (not streaming) — the browser parses it via the normal HTML\n * pipeline, so external `<script src=…>` tags load and execute exactly\n * like they would on a regular page. Tailwind CDN, Chart.js, p5.js — all\n * the things a Play CDN expects to see at parse time — work naturally.\n *\n * For *streaming* content we instead use `buildShellSrcDoc` + postMessage\n * morph, which trades reliable script execution for the ability to fade\n * in new nodes without reloading the iframe.\n *\n * Strategy: inject our shims (storage shim, auto-height) as early in the\n * resulting `<head>` as possible so they run before any user script. If\n * the user supplied a `<head>` open tag we slot the shims in right after\n * it; otherwise we wrap a minimal document around fragments.\n */\nexport const buildStaticSrcDoc = ({\n background,\n content,\n frameId,\n}: BuildStaticSrcDocOptions): string => {\n const head = `${baseStyle(background)}${shimsBlock(frameId)}`;\n const lower = content.toLowerCase();\n const hasHtmlTag = lower.includes('<html');\n\n if (!hasHtmlTag) {\n return `<!DOCTYPE html><html><head><meta charset=\"utf-8\">${head}</head><body>${content}</body></html>`;\n }\n\n const headOpenMatch = content.match(/<head\\b[^>]*>/i);\n if (headOpenMatch) {\n const idx = headOpenMatch.index! + headOpenMatch[0].length;\n return content.slice(0, idx) + head + content.slice(idx);\n }\n\n const headCloseIdx = lower.indexOf('</head>');\n if (headCloseIdx !== -1) {\n return content.slice(0, headCloseIdx) + head + content.slice(headCloseIdx);\n }\n\n const htmlOpenMatch = content.match(/<html\\b[^>]*>/i);\n if (htmlOpenMatch) {\n const idx = htmlOpenMatch.index! + htmlOpenMatch[0].length;\n return content.slice(0, idx) + `<head>${head}</head>` + content.slice(idx);\n }\n\n return `<!DOCTYPE html><html><head>${head}</head><body>${content}</body></html>`;\n};\n"],"mappings":";;;AASA,MAAM,cAAc,YAClB,WAAW,oBAAoB,oBAAmB,sBAAsB,OAAO,EAAE;AAEnF,MAAM,aAAa,eACjB,uCAAuC,aAAa,cAAc,WAAW,KAAK,GAAG;;;;;;;;;;;;;;;;;;AAmBvF,MAAa,qBAAqB,EAChC,YACA,SACA,cACsC;CACtC,MAAM,OAAO,GAAG,UAAU,UAAU,IAAI,WAAW,OAAO;CAC1D,MAAM,QAAQ,QAAQ,YAAY;CAGlC,IAAI,CAFe,MAAM,SAAS,OAEpB,GACZ,OAAO,oDAAoD,KAAK,eAAe,QAAQ;CAGzF,MAAM,gBAAgB,QAAQ,MAAM,gBAAgB;CACpD,IAAI,eAAe;EACjB,MAAM,MAAM,cAAc,QAAS,cAAc,EAAE,CAAC;EACpD,OAAO,QAAQ,MAAM,GAAG,GAAG,IAAI,OAAO,QAAQ,MAAM,GAAG;CACzD;CAEA,MAAM,eAAe,MAAM,QAAQ,SAAS;CAC5C,IAAI,iBAAiB,IACnB,OAAO,QAAQ,MAAM,GAAG,YAAY,IAAI,OAAO,QAAQ,MAAM,YAAY;CAG3E,MAAM,gBAAgB,QAAQ,MAAM,gBAAgB;CACpD,IAAI,eAAe;EACjB,MAAM,MAAM,cAAc,QAAS,cAAc,EAAE,CAAC;EACpD,OAAO,QAAQ,MAAM,GAAG,GAAG,IAAI,SAAS,KAAK,WAAW,QAAQ,MAAM,GAAG;CAC3E;CAEA,OAAO,8BAA8B,KAAK,eAAe,QAAQ;AACnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.mjs","names":[],"sources":["../../src/HtmlPreview/const.ts"],"sourcesContent":["/**\n * Default sandbox attribute for HTML preview iframes.\n *\n * Why this exact set:\n * - `allow-scripts` — required by the use case (three.js / p5.js / Tailwind\n * CDN style demos). Without it inline preview degrades to source view.\n * - `allow-forms` — lets demos handle `<form>` submissions in-frame.\n * - `allow-modals` — `alert`/`confirm`/`prompt` are common in toy demos.\n *\n * Deliberately omitted:\n * - `allow-same-origin` — would let scripts read parent cookies / localStorage\n * under cloud deployments, and bridge the IPC boundary on desktop builds.\n * - `allow-popups`, `allow-top-navigation` — phishing surface.\n *\n * Override at your own risk via `sandbox` prop.\n */\nexport const DEFAULT_SANDBOX = 'allow-scripts allow-forms allow-modals';\n\nexport const DEFAULT_HEIGHT = 400;\n\n/**\n * Cap for srcDoc length. Beyond a few MB browsers start misbehaving;\n * we fall back to source-only above this threshold.\n */\nexport const SRCDOC_MAX_LENGTH = 5 * 1024 * 1024;\n\nconst FULL_HTML_MARKERS = ['<!doctype html', '<html', '<HTML'];\n\n/**\n * Is the content a \"full\" HTML document (has `<html>` or `<!DOCTYPE html>`)?\n * Fragments without these markers render poorly inline and should not auto-mount.\n */\nexport const isFullHtmlDocument = (content: string): boolean => {\n if (!content) return false;\n const head = content.slice(0, 1024).toLowerCase();\n return FULL_HTML_MARKERS.some((marker) => head.includes(marker.toLowerCase()));\n};\n\n/**\n * Heuristic for whether streaming HTML is \"stable enough to mount the iframe\".\n * Re-mounting srcDoc on every token reboots scripts (p5.js setup runs each\n * time), so we wait for a clear closing signal.\n */\nexport const isHtmlContentClosed = (content: string): boolean => {\n if (!content) return false;\n const tail = content.slice(-1024).toLowerCase();\n return tail.includes('</html>');\n};\n\n/**\n * Does the content contain a `<script>` tag?\n *\n * Used by `streamingMode: 'auto'` to decide whether live-streaming the\n * iframe is safe. Script-bearing content gets deferred until stable so we\n * don't re-run `setup()` on every token; script-less content (pure\n * markup + styles) streams live for a more responsive feel.\n */\nexport const containsScript = (content: string): boolean => {\n if (!content) return false;\n return /<script\\b/i.test(content);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAgBA,MAAa,kBAAkB;AAE/B,MAAa,iBAAiB;;;;;AAM9B,MAAa,oBAAoB,IAAI,OAAO;AAE5C,MAAM,oBAAoB;CAAC;CAAkB;CAAS;
|
|
1
|
+
{"version":3,"file":"const.mjs","names":[],"sources":["../../src/HtmlPreview/const.ts"],"sourcesContent":["/**\n * Default sandbox attribute for HTML preview iframes.\n *\n * Why this exact set:\n * - `allow-scripts` — required by the use case (three.js / p5.js / Tailwind\n * CDN style demos). Without it inline preview degrades to source view.\n * - `allow-forms` — lets demos handle `<form>` submissions in-frame.\n * - `allow-modals` — `alert`/`confirm`/`prompt` are common in toy demos.\n *\n * Deliberately omitted:\n * - `allow-same-origin` — would let scripts read parent cookies / localStorage\n * under cloud deployments, and bridge the IPC boundary on desktop builds.\n * - `allow-popups`, `allow-top-navigation` — phishing surface.\n *\n * Override at your own risk via `sandbox` prop.\n */\nexport const DEFAULT_SANDBOX = 'allow-scripts allow-forms allow-modals';\n\nexport const DEFAULT_HEIGHT = 400;\n\n/**\n * Cap for srcDoc length. Beyond a few MB browsers start misbehaving;\n * we fall back to source-only above this threshold.\n */\nexport const SRCDOC_MAX_LENGTH = 5 * 1024 * 1024;\n\nconst FULL_HTML_MARKERS = ['<!doctype html', '<html', '<HTML'];\n\n/**\n * Is the content a \"full\" HTML document (has `<html>` or `<!DOCTYPE html>`)?\n * Fragments without these markers render poorly inline and should not auto-mount.\n */\nexport const isFullHtmlDocument = (content: string): boolean => {\n if (!content) return false;\n const head = content.slice(0, 1024).toLowerCase();\n return FULL_HTML_MARKERS.some((marker) => head.includes(marker.toLowerCase()));\n};\n\n/**\n * Heuristic for whether streaming HTML is \"stable enough to mount the iframe\".\n * Re-mounting srcDoc on every token reboots scripts (p5.js setup runs each\n * time), so we wait for a clear closing signal.\n */\nexport const isHtmlContentClosed = (content: string): boolean => {\n if (!content) return false;\n const tail = content.slice(-1024).toLowerCase();\n return tail.includes('</html>');\n};\n\n/**\n * Does the content contain a `<script>` tag?\n *\n * Used by `streamingMode: 'auto'` to decide whether live-streaming the\n * iframe is safe. Script-bearing content gets deferred until stable so we\n * don't re-run `setup()` on every token; script-less content (pure\n * markup + styles) streams live for a more responsive feel.\n */\nexport const containsScript = (content: string): boolean => {\n if (!content) return false;\n return /<script\\b/i.test(content);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAgBA,MAAa,kBAAkB;AAE/B,MAAa,iBAAiB;;;;;AAM9B,MAAa,oBAAoB,IAAI,OAAO;AAE5C,MAAM,oBAAoB;CAAC;CAAkB;CAAS;AAAO;;;;;AAM7D,MAAa,sBAAsB,YAA6B;CAC9D,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,OAAO,QAAQ,MAAM,GAAG,IAAI,CAAC,CAAC,YAAY;CAChD,OAAO,kBAAkB,MAAM,WAAW,KAAK,SAAS,OAAO,YAAY,CAAC,CAAC;AAC/E;;;;;;AAOA,MAAa,uBAAuB,YAA6B;CAC/D,IAAI,CAAC,SAAS,OAAO;CAErB,OADa,QAAQ,MAAM,KAAK,CAAC,CAAC,YACxB,CAAC,CAAC,SAAS,SAAS;AAChC;;;;;;;;;AAUA,MAAa,kBAAkB,YAA6B;CAC1D,IAAI,CAAC,SAAS,OAAO;CACrB,OAAO,aAAa,KAAK,OAAO;AAClC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DEFAULT_HEIGHT, DEFAULT_SANDBOX, containsScript, isFullHtmlDocument, isHtmlContentClosed } from "./const.mjs";
|
|
2
2
|
import { HtmlPreviewIframeProps, HtmlPreviewMode, HtmlPreviewProps, HtmlPreviewStreamingMode } from "./type.mjs";
|
|
3
|
-
import
|
|
3
|
+
import HtmlPreview from "./HtmlPreview.mjs";
|
|
4
4
|
import { HtmlPreviewIframe } from "./Iframe.mjs";
|
|
5
5
|
import { AUTO_HEIGHT_MESSAGE_TYPE } from "./injectAutoHeightScript.mjs";
|
|
6
|
-
export { DEFAULT_HEIGHT as HTML_PREVIEW_DEFAULT_HEIGHT, DEFAULT_SANDBOX as HTML_PREVIEW_DEFAULT_SANDBOX, AUTO_HEIGHT_MESSAGE_TYPE as HTML_PREVIEW_RESIZE_MESSAGE, HtmlPreviewIframe, HtmlPreviewIframeProps, HtmlPreviewMode, HtmlPreviewProps, HtmlPreviewStreamingMode, HtmlPreview as default, containsScript as htmlPreviewContainsScript, isFullHtmlDocument, isHtmlContentClosed };
|
|
6
|
+
export { DEFAULT_HEIGHT as HTML_PREVIEW_DEFAULT_HEIGHT, DEFAULT_SANDBOX as HTML_PREVIEW_DEFAULT_SANDBOX, AUTO_HEIGHT_MESSAGE_TYPE as HTML_PREVIEW_RESIZE_MESSAGE, HtmlPreviewIframe, type HtmlPreviewIframeProps, type HtmlPreviewMode, type HtmlPreviewProps, type HtmlPreviewStreamingMode, HtmlPreview as default, containsScript as htmlPreviewContainsScript, isFullHtmlDocument, isHtmlContentClosed };
|
package/es/HtmlPreview/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DEFAULT_HEIGHT, DEFAULT_SANDBOX, containsScript, isFullHtmlDocument, isHtmlContentClosed } from "./const.mjs";
|
|
2
2
|
import { AUTO_HEIGHT_MESSAGE_TYPE } from "./injectAutoHeightScript.mjs";
|
|
3
|
-
import HtmlPreviewIframe from "./Iframe.mjs";
|
|
3
|
+
import { HtmlPreviewIframe } from "./Iframe.mjs";
|
|
4
4
|
import HtmlPreview from "./HtmlPreview.mjs";
|
|
5
5
|
export { DEFAULT_HEIGHT as HTML_PREVIEW_DEFAULT_HEIGHT, DEFAULT_SANDBOX as HTML_PREVIEW_DEFAULT_SANDBOX, AUTO_HEIGHT_MESSAGE_TYPE as HTML_PREVIEW_RESIZE_MESSAGE, HtmlPreviewIframe, HtmlPreview as default, containsScript as htmlPreviewContainsScript, isFullHtmlDocument, isHtmlContentClosed };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"injectAutoHeightScript.mjs","names":[],"sources":["../../src/HtmlPreview/injectAutoHeightScript.ts"],"sourcesContent":["export const AUTO_HEIGHT_MESSAGE_TYPE = 'lobe-html-resize';\n\nexport const buildAutoHeightScript = (frameId: string) => `\n(function () {\n var frameId = ${JSON.stringify(frameId)};\n function post() {\n try {\n var h = Math.max(\n document.documentElement.scrollHeight,\n document.body ? document.body.scrollHeight : 0,\n );\n parent.postMessage({ type: ${JSON.stringify(AUTO_HEIGHT_MESSAGE_TYPE)}, frameId: frameId, height: h }, '*');\n } catch (_) {}\n }\n\n function attach() {\n post();\n try {\n var ro = new ResizeObserver(post);\n if (document.body) ro.observe(document.body);\n if (document.documentElement) ro.observe(document.documentElement);\n } catch (_) {}\n window.addEventListener('load', post);\n window.addEventListener('resize', post);\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', attach);\n } else {\n attach();\n }\n})();\n`;\n"],"mappings":";AAAA,MAAa,2BAA2B;AAExC,MAAa,yBAAyB,YAAoB;;kBAExC,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"injectAutoHeightScript.mjs","names":[],"sources":["../../src/HtmlPreview/injectAutoHeightScript.ts"],"sourcesContent":["export const AUTO_HEIGHT_MESSAGE_TYPE = 'lobe-html-resize';\n\nexport const buildAutoHeightScript = (frameId: string) => `\n(function () {\n var frameId = ${JSON.stringify(frameId)};\n function post() {\n try {\n var h = Math.max(\n document.documentElement.scrollHeight,\n document.body ? document.body.scrollHeight : 0,\n );\n parent.postMessage({ type: ${JSON.stringify(AUTO_HEIGHT_MESSAGE_TYPE)}, frameId: frameId, height: h }, '*');\n } catch (_) {}\n }\n\n function attach() {\n post();\n try {\n var ro = new ResizeObserver(post);\n if (document.body) ro.observe(document.body);\n if (document.documentElement) ro.observe(document.documentElement);\n } catch (_) {}\n window.addEventListener('load', post);\n window.addEventListener('resize', post);\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', attach);\n } else {\n attach();\n }\n})();\n`;\n"],"mappings":";AAAA,MAAa,2BAA2B;AAExC,MAAa,yBAAyB,YAAoB;;kBAExC,KAAK,UAAU,OAAO,EAAE;;;;;;;mCAOP,KAAK,UAAU,wBAAwB,EAAE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DivProps } from "../types/index.mjs";
|
|
2
2
|
import { ActionIconProps } from "../ActionIcon/type.mjs";
|
|
3
|
+
import "../ActionIcon/index.mjs";
|
|
3
4
|
import { CSSProperties, ReactNode, Ref } from "react";
|
|
4
|
-
|
|
5
5
|
//#region src/HtmlPreview/type.d.ts
|
|
6
6
|
type HtmlPreviewMode = 'preview' | 'source';
|
|
7
7
|
/**
|
package/es/Icon/Icon.d.mts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { IconProps } from "./type.mjs";
|
|
2
|
-
import * as _$react from "react";
|
|
3
|
-
|
|
4
2
|
//#region src/Icon/Icon.d.ts
|
|
5
|
-
declare const Icon:
|
|
3
|
+
declare const Icon: import("react").NamedExoticComponent<IconProps>;
|
|
6
4
|
//#endregion
|
|
7
|
-
export { Icon };
|
|
5
|
+
export { Icon as default };
|
|
8
6
|
//# sourceMappingURL=Icon.d.mts.map
|
package/es/Icon/Icon.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Icon.mjs","names":[],"sources":["../../src/Icon/Icon.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport type { LucideIcon } from 'lucide-react';\nimport { isValidElement, memo, useMemo } from 'react';\n\nimport { useIconContext } from './components/IconProvider';\nimport { calcSize } from './components/utils';\nimport { variants } from './style';\nimport type { IconProps } from './type';\n\nconst Icon = memo<IconProps>(\n ({\n icon,\n size: iconSize,\n color,\n fill = 'transparent',\n className,\n focusable,\n spin,\n fillRule,\n fillOpacity,\n ref,\n ...rest\n }) => {\n const {\n color: colorConfig,\n fill: fillConfig,\n fillOpacity: fillOpacityConfig,\n fillRule: fillRuleConfig,\n focusable: focusableConfig,\n className: classNameConfig,\n size: sizeConfig,\n ...restConfig\n } = useIconContext();\n\n const { size, strokeWidth } = useMemo(\n () => calcSize(iconSize || sizeConfig),\n [iconSize, sizeConfig],\n );\n\n const SvgIcon = icon as LucideIcon;\n\n return (\n <span\n className={cx(variants({ spin }), classNameConfig, className)}\n role=\"img\"\n {...restConfig}\n {...rest}\n >\n {icon &&\n (isValidElement(icon) ? (\n icon\n ) : (\n <SvgIcon\n color={color || colorConfig}\n fill={fill || fillConfig}\n fillOpacity={fillOpacity || fillOpacityConfig}\n fillRule={fillRule || fillRuleConfig}\n focusable={focusable || focusableConfig}\n height={size}\n ref={ref}\n size={size}\n strokeWidth={strokeWidth}\n width={size}\n />\n ))}\n </span>\n );\n },\n);\n\nIcon.displayName = 'Icon';\n\nexport default Icon;\n"],"mappings":";;;;;;;;AAWA,MAAM,OAAO,MACV,EACC,MACA,MAAM,UACN,OACA,OAAO,eACP,WACA,WACA,MACA,UACA,aACA,KACA,GAAG,WACC;CACJ,MAAM,EACJ,OAAO,aACP,MAAM,YACN,aAAa,mBACb,UAAU,gBACV,WAAW,iBACX,WAAW,iBACX,MAAM,YACN,GAAG,eACD,
|
|
1
|
+
{"version":3,"file":"Icon.mjs","names":[],"sources":["../../src/Icon/Icon.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport type { LucideIcon } from 'lucide-react';\nimport { isValidElement, memo, useMemo } from 'react';\n\nimport { useIconContext } from './components/IconProvider';\nimport { calcSize } from './components/utils';\nimport { variants } from './style';\nimport type { IconProps } from './type';\n\nconst Icon = memo<IconProps>(\n ({\n icon,\n size: iconSize,\n color,\n fill = 'transparent',\n className,\n focusable,\n spin,\n fillRule,\n fillOpacity,\n ref,\n ...rest\n }) => {\n const {\n color: colorConfig,\n fill: fillConfig,\n fillOpacity: fillOpacityConfig,\n fillRule: fillRuleConfig,\n focusable: focusableConfig,\n className: classNameConfig,\n size: sizeConfig,\n ...restConfig\n } = useIconContext();\n\n const { size, strokeWidth } = useMemo(\n () => calcSize(iconSize || sizeConfig),\n [iconSize, sizeConfig],\n );\n\n const SvgIcon = icon as LucideIcon;\n\n return (\n <span\n className={cx(variants({ spin }), classNameConfig, className)}\n role=\"img\"\n {...restConfig}\n {...rest}\n >\n {icon &&\n (isValidElement(icon) ? (\n icon\n ) : (\n <SvgIcon\n color={color || colorConfig}\n fill={fill || fillConfig}\n fillOpacity={fillOpacity || fillOpacityConfig}\n fillRule={fillRule || fillRuleConfig}\n focusable={focusable || focusableConfig}\n height={size}\n ref={ref}\n size={size}\n strokeWidth={strokeWidth}\n width={size}\n />\n ))}\n </span>\n );\n },\n);\n\nIcon.displayName = 'Icon';\n\nexport default Icon;\n"],"mappings":";;;;;;;;AAWA,MAAM,OAAO,MACV,EACC,MACA,MAAM,UACN,OACA,OAAO,eACP,WACA,WACA,MACA,UACA,aACA,KACA,GAAG,WACC;CACJ,MAAM,EACJ,OAAO,aACP,MAAM,YACN,aAAa,mBACb,UAAU,gBACV,WAAW,iBACX,WAAW,iBACX,MAAM,YACN,GAAG,eACD,eAAe;CAEnB,MAAM,EAAE,MAAM,gBAAgB,cACtB,SAAS,YAAY,UAAU,GACrC,CAAC,UAAU,UAAU,CACvB;CAEA,MAAM,UAAU;CAEhB,OACE,oBAAC,QAAD;EACE,WAAW,GAAG,SAAS,EAAE,KAAK,CAAC,GAAG,iBAAiB,SAAS;EAC5D,MAAK;EACL,GAAI;EACJ,GAAI;YAEH,SACE,eAAe,IAAI,IAClB,OAEA,oBAAC,SAAD;GACE,OAAO,SAAS;GAChB,MAAM,QAAQ;GACd,aAAa,eAAe;GAC5B,UAAU,YAAY;GACtB,WAAW,aAAa;GACxB,QAAQ;GACH;GACC;GACO;GACb,OAAO;EACR,CAAA;CAED,CAAA;AAEV,CACF;AAEA,KAAK,cAAc"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { IconProps } from "../type.mjs";
|
|
2
|
-
import * as _$react from "react";
|
|
3
2
|
import { ReactNode } from "react";
|
|
4
|
-
|
|
5
3
|
//#region src/Icon/components/IconProvider.d.ts
|
|
6
4
|
type IconContentConfig = Omit<IconProps, 'icon' | 'ref'>;
|
|
7
|
-
declare const IconContext:
|
|
8
|
-
declare const IconProvider:
|
|
5
|
+
declare const IconContext: import("react").Context<IconContentConfig>;
|
|
6
|
+
declare const IconProvider: import("react").NamedExoticComponent<{
|
|
9
7
|
children: ReactNode;
|
|
10
8
|
config?: IconContentConfig;
|
|
11
9
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IconProvider.mjs","names":[],"sources":["../../../src/Icon/components/IconProvider.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, memo, type ReactNode, use } from 'react';\n\nimport { type IconProps } from '../type';\n\nexport type IconContentConfig = Omit<IconProps, 'icon' | 'ref'>;\n\nexport const IconContext = createContext<IconContentConfig>({});\n\nexport const IconProvider = memo<{ children: ReactNode; config?: IconContentConfig }>(\n ({ children, config = {} }) => {\n return <IconContext value={config}>{children}</IconContext>;\n },\n);\n\nexport const useIconContext = () => {\n return use(IconContext);\n};\n"],"mappings":";;;;AAQA,MAAa,cAAc,cAAiC,
|
|
1
|
+
{"version":3,"file":"IconProvider.mjs","names":[],"sources":["../../../src/Icon/components/IconProvider.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, memo, type ReactNode, use } from 'react';\n\nimport { type IconProps } from '../type';\n\nexport type IconContentConfig = Omit<IconProps, 'icon' | 'ref'>;\n\nexport const IconContext = createContext<IconContentConfig>({});\n\nexport const IconProvider = memo<{ children: ReactNode; config?: IconContentConfig }>(\n ({ children, config = {} }) => {\n return <IconContext value={config}>{children}</IconContext>;\n },\n);\n\nexport const useIconContext = () => {\n return use(IconContext);\n};\n"],"mappings":";;;;AAQA,MAAa,cAAc,cAAiC,CAAC,CAAC;AAE9D,MAAa,eAAe,MACzB,EAAE,UAAU,SAAS,CAAC,QAAQ;CAC7B,OAAO,oBAAC,aAAD;EAAa,OAAO;EAAS;CAAsB,CAAA;AAC5D,CACF;AAEA,MAAa,uBAAuB;CAClC,OAAO,IAAI,WAAW;AACxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","names":[],"sources":["../../../src/Icon/components/utils.ts"],"sourcesContent":["import { isNumber } from 'es-toolkit/compat';\n\nimport type { IconSize } from '../type';\n\nexport const calcSize = (iconSize?: IconSize) => {\n if (isNumber(iconSize)) {\n return { size: iconSize };\n }\n\n let size: number | string;\n let strokeWidth: number | string;\n\n switch (iconSize) {\n case 'large': {\n size = 24;\n strokeWidth = 2;\n break;\n }\n case 'middle': {\n size = 20;\n strokeWidth = 2;\n break;\n }\n case 'small': {\n size = 14;\n strokeWidth = 2;\n break;\n }\n default: {\n if (iconSize) {\n size = iconSize?.size || 24;\n strokeWidth = iconSize?.strokeWidth || 2;\n } else {\n size = '1em';\n strokeWidth = 2;\n }\n break;\n }\n }\n return { size, strokeWidth };\n};\n"],"mappings":";;AAIA,MAAa,YAAY,aAAwB;
|
|
1
|
+
{"version":3,"file":"utils.mjs","names":[],"sources":["../../../src/Icon/components/utils.ts"],"sourcesContent":["import { isNumber } from 'es-toolkit/compat';\n\nimport type { IconSize } from '../type';\n\nexport const calcSize = (iconSize?: IconSize) => {\n if (isNumber(iconSize)) {\n return { size: iconSize };\n }\n\n let size: number | string;\n let strokeWidth: number | string;\n\n switch (iconSize) {\n case 'large': {\n size = 24;\n strokeWidth = 2;\n break;\n }\n case 'middle': {\n size = 20;\n strokeWidth = 2;\n break;\n }\n case 'small': {\n size = 14;\n strokeWidth = 2;\n break;\n }\n default: {\n if (iconSize) {\n size = iconSize?.size || 24;\n strokeWidth = iconSize?.strokeWidth || 2;\n } else {\n size = '1em';\n strokeWidth = 2;\n }\n break;\n }\n }\n return { size, strokeWidth };\n};\n"],"mappings":";;AAIA,MAAa,YAAY,aAAwB;CAC/C,IAAI,SAAS,QAAQ,GACnB,OAAO,EAAE,MAAM,SAAS;CAG1B,IAAI;CACJ,IAAI;CAEJ,QAAQ,UAAR;EACE,KAAK;GACH,OAAO;GACP,cAAc;GACd;EAEF,KAAK;GACH,OAAO;GACP,cAAc;GACd;EAEF,KAAK;GACH,OAAO;GACP,cAAc;GACd;EAEF;GACE,IAAI,UAAU;IACZ,OAAO,UAAU,QAAQ;IACzB,cAAc,UAAU,eAAe;GACzC,OAAO;IACL,OAAO;IACP,cAAc;GAChB;GACA;CAEJ;CACA,OAAO;EAAE;EAAM;CAAY;AAC7B"}
|
package/es/Icon/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { IconProps, IconSize, IconSizeConfig, IconSizeType, LucideIconProps } from "./type.mjs";
|
|
2
2
|
import { IconContentConfig, IconContext, IconProvider, useIconContext } from "./components/IconProvider.mjs";
|
|
3
|
-
import
|
|
4
|
-
export { IconContentConfig, IconContext, IconProps, IconProvider, IconSize, IconSizeConfig, IconSizeType, LucideIconProps, Icon as default, useIconContext };
|
|
3
|
+
import Icon from "./Icon.mjs";
|
|
4
|
+
export { IconContentConfig, IconContext, type IconProps, IconProvider, type IconSize, type IconSizeConfig, type IconSizeType, type LucideIconProps, Icon as default, useIconContext };
|
package/es/Icon/style.mjs
CHANGED
|
@@ -9,18 +9,19 @@ const spin = keyframes`
|
|
|
9
9
|
rotate: 360deg;
|
|
10
10
|
}
|
|
11
11
|
`;
|
|
12
|
+
const styles = createStaticStyles(({ css }) => {
|
|
13
|
+
return { spin: css`
|
|
14
|
+
animation: ${spin} 1s linear infinite;
|
|
15
|
+
` };
|
|
16
|
+
});
|
|
12
17
|
const variants = cva("anticon", {
|
|
13
18
|
defaultVariants: { spin: false },
|
|
14
19
|
variants: { spin: {
|
|
15
20
|
false: null,
|
|
16
|
-
true:
|
|
17
|
-
return { spin: css`
|
|
18
|
-
animation: ${spin} 1s linear infinite;
|
|
19
|
-
` };
|
|
20
|
-
}).spin
|
|
21
|
+
true: styles.spin
|
|
21
22
|
} }
|
|
22
23
|
});
|
|
23
24
|
//#endregion
|
|
24
|
-
export { variants };
|
|
25
|
+
export { styles, variants };
|
|
25
26
|
|
|
26
27
|
//# sourceMappingURL=style.mjs.map
|