@trycourier/react-designer 0.0.0-canary-20250424162557
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +402 -0
- package/dist/cjs/index.css +2 -0
- package/dist/cjs/index.css.map +7 -0
- package/dist/cjs/index.js +187 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/styles.css +3151 -0
- package/dist/components/BrandEditor/BrandEditor.d.ts +6 -0
- package/dist/components/BrandEditor/BrandEditor.types.d.ts +46 -0
- package/dist/components/BrandEditor/Editor/BrandFooter/BrandFooter.d.ts +13 -0
- package/dist/components/BrandEditor/Editor/BrandFooter/index.d.ts +1 -0
- package/dist/components/BrandEditor/Editor/Editor.d.ts +48 -0
- package/dist/components/BrandEditor/Editor/LogoUploader/LogoUploader.d.ts +4 -0
- package/dist/components/BrandEditor/Editor/LogoUploader/index.d.ts +1 -0
- package/dist/components/BrandEditor/Editor/SideBar/SideBar.d.ts +7 -0
- package/dist/components/BrandEditor/Editor/SideBar/index.d.ts +1 -0
- package/dist/components/BrandEditor/Editor/index.d.ts +1 -0
- package/dist/components/BrandEditor/Editor/useBlockEditor.d.ts +23 -0
- package/dist/components/BrandEditor/index.d.ts +1 -0
- package/dist/components/BrandEditor/store.d.ts +34 -0
- package/dist/components/ElementalValue/ElementalValue.d.ts +8 -0
- package/dist/components/ElementalValue/index.d.ts +1 -0
- package/dist/components/Providers/BrandProvider.d.ts +14 -0
- package/dist/components/Providers/Providers.types.d.ts +8 -0
- package/dist/components/Providers/TemplateProvider.d.ts +18 -0
- package/dist/components/Providers/api/brand.d.ts +6 -0
- package/dist/components/Providers/api/common.d.ts +5 -0
- package/dist/components/Providers/api/index.d.ts +3 -0
- package/dist/components/Providers/api/template.d.ts +6 -0
- package/dist/components/Providers/index.d.ts +3 -0
- package/dist/components/Providers/store.d.ts +116 -0
- package/dist/components/TemplateEditor/Editor/Editor.d.ts +11 -0
- package/dist/components/TemplateEditor/Editor/SideBar/SideBar.d.ts +7 -0
- package/dist/components/TemplateEditor/Editor/SideBar/SideBarItem/SideBarItem.d.ts +12 -0
- package/dist/components/TemplateEditor/Editor/SideBar/SideBarItem/index.d.ts +1 -0
- package/dist/components/TemplateEditor/Editor/SideBar/SideBarItemDetails/SideBarItemDetails.d.ts +8 -0
- package/dist/components/TemplateEditor/Editor/SideBar/SideBarItemDetails/index.d.ts +1 -0
- package/dist/components/TemplateEditor/Editor/SideBar/SideBarSortableItemWrapper/SideBarSortableItemWrapper.d.ts +30 -0
- package/dist/components/TemplateEditor/Editor/SideBar/SideBarSortableItemWrapper/index.d.ts +1 -0
- package/dist/components/TemplateEditor/Editor/SideBar/index.d.ts +1 -0
- package/dist/components/TemplateEditor/Editor/index.d.ts +1 -0
- package/dist/components/TemplateEditor/Editor/useBlockEditor.d.ts +23 -0
- package/dist/components/TemplateEditor/TemplateEditor.d.ts +15 -0
- package/dist/components/TemplateEditor/index.d.ts +1 -0
- package/dist/components/TemplateEditor/store.d.ts +7 -0
- package/dist/components/extensions/Blockquote/Blockquote.d.ts +4 -0
- package/dist/components/extensions/Blockquote/Blockquote.types.d.ts +24 -0
- package/dist/components/extensions/Blockquote/BlockquoteComponent.d.ts +5 -0
- package/dist/components/extensions/Blockquote/BlockquoteForm.d.ts +8 -0
- package/dist/components/extensions/Blockquote/index.d.ts +3 -0
- package/dist/components/extensions/Button/Button.d.ts +14 -0
- package/dist/components/extensions/Button/Button.types.d.ts +63 -0
- package/dist/components/extensions/Button/ButtonComponent.d.ts +11 -0
- package/dist/components/extensions/Button/ButtonForm.d.ts +8 -0
- package/dist/components/extensions/Button/ButtonIcon.d.ts +6 -0
- package/dist/components/extensions/Button/index.d.ts +3 -0
- package/dist/components/extensions/Divider/Divider.d.ts +12 -0
- package/dist/components/extensions/Divider/Divider.types.d.ts +27 -0
- package/dist/components/extensions/Divider/DividerComponent.d.ts +9 -0
- package/dist/components/extensions/Divider/DividerForm.d.ts +8 -0
- package/dist/components/extensions/Divider/index.d.ts +4 -0
- package/dist/components/extensions/Document/Document.d.ts +2 -0
- package/dist/components/extensions/Document/index.d.ts +1 -0
- package/dist/components/extensions/DragPlaceholder/DragPlaceholder.d.ts +17 -0
- package/dist/components/extensions/DragPlaceholder/DragPlaceholderComponent.d.ts +3 -0
- package/dist/components/extensions/DragPlaceholder/index.d.ts +2 -0
- package/dist/components/extensions/FileHandler/FileHandler.d.ts +11 -0
- package/dist/components/extensions/FileHandler/index.d.ts +1 -0
- package/dist/components/extensions/Heading/Heading.d.ts +19 -0
- package/dist/components/extensions/Heading/index.d.ts +1 -0
- package/dist/components/extensions/Image/Image.d.ts +2 -0
- package/dist/components/extensions/Image/index.d.ts +1 -0
- package/dist/components/extensions/ImageBlock/ImageBlock.d.ts +17 -0
- package/dist/components/extensions/ImageBlock/ImageBlock.types.d.ts +47 -0
- package/dist/components/extensions/ImageBlock/components/ImageBlockForm.d.ts +7 -0
- package/dist/components/extensions/ImageBlock/components/ImageBlockMenu.d.ts +8 -0
- package/dist/components/extensions/ImageBlock/components/ImageBlockView.d.ts +13 -0
- package/dist/components/extensions/ImageBlock/components/ImageBlockWidth.d.ts +5 -0
- package/dist/components/extensions/ImageBlock/index.d.ts +4 -0
- package/dist/components/extensions/Link/Link.d.ts +2 -0
- package/dist/components/extensions/Link/LinkForm.d.ts +12 -0
- package/dist/components/extensions/Link/index.d.ts +2 -0
- package/dist/components/extensions/Paragraph/Paragraph.d.ts +13 -0
- package/dist/components/extensions/Paragraph/index.d.ts +1 -0
- package/dist/components/extensions/Selection/Selection.d.ts +16 -0
- package/dist/components/extensions/Selection/index.d.ts +1 -0
- package/dist/components/extensions/SlashMenu/MenuList.d.ts +2 -0
- package/dist/components/extensions/SlashMenu/SlashMenu.d.ts +2 -0
- package/dist/components/extensions/SlashMenu/SlashMenu.types.d.ts +19 -0
- package/dist/components/extensions/SlashMenu/commands.d.ts +2 -0
- package/dist/components/extensions/SlashMenu/index.d.ts +2 -0
- package/dist/components/extensions/TextBlock/TextBlock.types.d.ts +48 -0
- package/dist/components/extensions/TextBlock/TextBlockComponent.d.ts +10 -0
- package/dist/components/extensions/TextBlock/TextBlockForm.d.ts +8 -0
- package/dist/components/extensions/TextBlock/index.d.ts +3 -0
- package/dist/components/extensions/UniqueId/UniqueId.d.ts +14 -0
- package/dist/components/extensions/UniqueId/index.d.ts +1 -0
- package/dist/components/extensions/Variable/Variable.d.ts +4 -0
- package/dist/components/extensions/Variable/Variable.types.d.ts +40 -0
- package/dist/components/extensions/Variable/VariableSuggestions.d.ts +7 -0
- package/dist/components/extensions/Variable/VariableView.d.ts +3 -0
- package/dist/components/extensions/Variable/index.d.ts +2 -0
- package/dist/components/extensions/Variable/suggestion.d.ts +2 -0
- package/dist/components/extensions/extension-kit.d.ts +9 -0
- package/dist/components/extensions/index.d.ts +23 -0
- package/dist/components/hooks/index.d.ts +1 -0
- package/dist/components/hooks/useNodeAttributes.d.ts +13 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/ui/Blocks/Block.d.ts +7 -0
- package/dist/components/ui/Blocks/BlockquoteBlock/BlockquoteBlock.d.ts +2 -0
- package/dist/components/ui/Blocks/BlockquoteBlock/index.d.ts +1 -0
- package/dist/components/ui/Blocks/ButtonBlock/ButtonBlock.d.ts +3 -0
- package/dist/components/ui/Blocks/ButtonBlock/index.d.ts +1 -0
- package/dist/components/ui/Blocks/DividerBlock/DividerBlock.d.ts +3 -0
- package/dist/components/ui/Blocks/DividerBlock/index.d.ts +1 -0
- package/dist/components/ui/Blocks/HeadingBlock/Heading.d.ts +3 -0
- package/dist/components/ui/Blocks/HeadingBlock/index.d.ts +1 -0
- package/dist/components/ui/Blocks/ImageBlock/ImageBlock.d.ts +3 -0
- package/dist/components/ui/Blocks/ImageBlock/index.d.ts +1 -0
- package/dist/components/ui/Blocks/SpacerBlock/SpacerBlock.d.ts +2 -0
- package/dist/components/ui/Blocks/SpacerBlock/index.d.ts +1 -0
- package/dist/components/ui/Blocks/TextBlock/TextBlock.d.ts +3 -0
- package/dist/components/ui/Blocks/TextBlock/index.d.ts +1 -0
- package/dist/components/ui/Blocks/index.d.ts +8 -0
- package/dist/components/ui/ContentIcon/ContentIcon.d.ts +7 -0
- package/dist/components/ui/ContentIcon/index.d.ts +1 -0
- package/dist/components/ui/ContentItemMenu/ContentItemMenu.d.ts +5 -0
- package/dist/components/ui/ContentItemMenu/hooks/useContentItemActions.d.ts +10 -0
- package/dist/components/ui/ContentItemMenu/hooks/useData.d.ts +13 -0
- package/dist/components/ui/ContentItemMenu/index.d.ts +1 -0
- package/dist/components/ui/Dropdown/Dropdown.d.ts +11 -0
- package/dist/components/ui/Dropdown/index.d.ts +1 -0
- package/dist/components/ui/EditorLayout/EditorLayout.d.ts +6 -0
- package/dist/components/ui/EditorLayout/index.d.ts +1 -0
- package/dist/components/ui/FormHeader/FormHeader.d.ts +5 -0
- package/dist/components/ui/FormHeader/index.d.ts +1 -0
- package/dist/components/ui/Handle/Handle.d.ts +1 -0
- package/dist/components/ui/Handle/index.d.ts +1 -0
- package/dist/components/ui/Header/Header.d.ts +5 -0
- package/dist/components/ui/Header/index.d.ts +1 -0
- package/dist/components/ui/Loader/Loader.d.ts +3 -0
- package/dist/components/ui/Loader/index.d.ts +1 -0
- package/dist/components/ui/Panel/index.d.ts +25 -0
- package/dist/components/ui/PreviewPanel/PreviewPanel.d.ts +6 -0
- package/dist/components/ui/PreviewPanel/index.d.ts +1 -0
- package/dist/components/ui/SortableItemWrapper/SortableItemWrapper.d.ts +26 -0
- package/dist/components/ui/SortableItemWrapper/index.d.ts +1 -0
- package/dist/components/ui/Spinner/Spinner.d.ts +2 -0
- package/dist/components/ui/Spinner/index.d.ts +1 -0
- package/dist/components/ui/Status/Status.d.ts +7 -0
- package/dist/components/ui/Status/index.d.ts +1 -0
- package/dist/components/ui/Surface.d.ts +6 -0
- package/dist/components/ui/TextInput/TextInput.d.ts +9 -0
- package/dist/components/ui/TextInput/index.d.ts +2 -0
- package/dist/components/ui/TextMenu/TextMenu.d.ts +5 -0
- package/dist/components/ui/TextMenu/components/ContentTypePicker.d.ts +22 -0
- package/dist/components/ui/TextMenu/components/index.d.ts +1 -0
- package/dist/components/ui/TextMenu/config.d.ts +20 -0
- package/dist/components/ui/TextMenu/hooks/useTextmenuCommands.d.ts +14 -0
- package/dist/components/ui/TextMenu/hooks/useTextmenuContentTypes.d.ts +3 -0
- package/dist/components/ui/TextMenu/hooks/useTextmenuStates.d.ts +18 -0
- package/dist/components/ui/TextMenu/index.d.ts +1 -0
- package/dist/components/ui/TextMenu/store.d.ts +89 -0
- package/dist/components/ui/Toggle/Toggle.d.ts +6 -0
- package/dist/components/ui/Toggle/index.d.ts +1 -0
- package/dist/components/ui/Toolbar.d.ts +27 -0
- package/dist/components/ui/Tooltip/index.d.ts +3 -0
- package/dist/components/ui/Tooltip/types.d.ts +15 -0
- package/dist/components/ui/index.d.ts +6 -0
- package/dist/components/ui-kit/Button/Button.d.ts +19 -0
- package/dist/components/ui-kit/Button/index.d.ts +1 -0
- package/dist/components/ui-kit/Divider/Divider.d.ts +2 -0
- package/dist/components/ui-kit/Divider/index.d.ts +1 -0
- package/dist/components/ui-kit/DropdownMenu/DropdownMenu.d.ts +29 -0
- package/dist/components/ui-kit/DropdownMenu/index.d.ts +1 -0
- package/dist/components/ui-kit/Form/Form.d.ts +23 -0
- package/dist/components/ui-kit/Form/index.d.ts +1 -0
- package/dist/components/ui-kit/Icon/ArrowUpIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/BinIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/BoldIcon.d.ts +2 -0
- package/dist/components/ui-kit/Icon/BorderRadiusIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/BorderWidthIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/BulletListIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/CenterAlignIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/CloseIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/ColorIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/CopyIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/DesktopIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/DistributeIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/DownIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/DuplicateIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/FacebookIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/FontSizeIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/H1Icon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/H2Icon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/H3Icon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/Icon.d.ts +9 -0
- package/dist/components/ui-kit/Icon/InstagramIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/ItalicIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/LeftAlignIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/LetterSpacingIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/LineHeightIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/LinkIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/LinkedinIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/MediumIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/MobileIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/NumberedListIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/PaddingHorizontalIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/PaddingVerticalIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/ParagraphIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/QuoteIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/RemoveFormattingIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/RightAlignIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/RightArrowIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/StrikethroughIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/UnderlineIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/UpIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/VariableIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/XIcon.d.ts +3 -0
- package/dist/components/ui-kit/Icon/index.d.ts +42 -0
- package/dist/components/ui-kit/Input/Input.d.ts +6 -0
- package/dist/components/ui-kit/Input/index.d.ts +1 -0
- package/dist/components/ui-kit/InputColor/ColorPicker.d.ts +9 -0
- package/dist/components/ui-kit/InputColor/InputColor.d.ts +12 -0
- package/dist/components/ui-kit/InputColor/index.d.ts +1 -0
- package/dist/components/ui-kit/Label/Label.d.ts +6 -0
- package/dist/components/ui-kit/Label/index.d.ts +1 -0
- package/dist/components/ui-kit/Popover/Popover.d.ts +9 -0
- package/dist/components/ui-kit/Popover/index.d.ts +1 -0
- package/dist/components/ui-kit/Slider/Slider.d.ts +4 -0
- package/dist/components/ui-kit/Slider/index.d.ts +1 -0
- package/dist/components/ui-kit/Switch/Switch.d.ts +4 -0
- package/dist/components/ui-kit/Switch/index.d.ts +1 -0
- package/dist/components/ui-kit/Tabs/Tabs.d.ts +7 -0
- package/dist/components/ui-kit/Tabs/index.d.ts +1 -0
- package/dist/components/ui-kit/Textarea/Textarea.d.ts +5 -0
- package/dist/components/ui-kit/Textarea/index.d.ts +1 -0
- package/dist/components/ui-kit/ThemeProvider/ThemeContext.d.ts +2 -0
- package/dist/components/ui-kit/ThemeProvider/ThemeProvider.d.ts +9 -0
- package/dist/components/ui-kit/ThemeProvider/ThemeProvider.types.d.ts +23 -0
- package/dist/components/ui-kit/ThemeProvider/index.d.ts +1 -0
- package/dist/components/ui-kit/Toaster/Toaster.d.ts +4 -0
- package/dist/components/ui-kit/Toaster/index.d.ts +1 -0
- package/dist/components/ui-kit/Toggle/Toggle.d.ts +12 -0
- package/dist/components/ui-kit/Toggle/index.d.ts +1 -0
- package/dist/components/ui-kit/ToggleGroup/ToggleGroup.d.ts +12 -0
- package/dist/components/ui-kit/ToggleGroup/index.d.ts +1 -0
- package/dist/components/ui-kit/index.d.ts +16 -0
- package/dist/components/utils/createOrDuplicateNode.d.ts +3 -0
- package/dist/components/utils/generateNodeIds.d.ts +8 -0
- package/dist/components/utils/getFlattenedVariables.d.ts +14 -0
- package/dist/components/utils/index.d.ts +6 -0
- package/dist/components/utils/isCustomNodeSelected.d.ts +4 -0
- package/dist/components/utils/isTextSelected.d.ts +5 -0
- package/dist/components/utils/multipleContainersKeyboardCoordinates.d.ts +2 -0
- package/dist/esm/index.css +2 -0
- package/dist/esm/index.css.map +7 -0
- package/dist/esm/index.js +187 -0
- package/dist/esm/index.js.map +7 -0
- package/dist/esm/styles.css +3151 -0
- package/dist/hooks/useAutoSave.d.ts +12 -0
- package/dist/index.d.ts +4 -0
- package/dist/lib/api/UploadImageAPI.d.ts +4 -0
- package/dist/lib/api/uploadImage.d.ts +6 -0
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/utils/convertElementalToTiptap/convertElementalToTiptap.d.ts +3 -0
- package/dist/lib/utils/convertElementalToTiptap/index.d.ts +1 -0
- package/dist/lib/utils/convertMarkdownToTiptap/convertMarkdownToTiptap.d.ts +2 -0
- package/dist/lib/utils/convertMarkdownToTiptap/index.d.ts +1 -0
- package/dist/lib/utils/convertTiptapToElemental/convertTiptapToElemental.d.ts +17 -0
- package/dist/lib/utils/convertTiptapToElemental/index.d.ts +1 -0
- package/dist/lib/utils/convertTiptapToMarkdown/convertTiptapToMarkdown.d.ts +2 -0
- package/dist/lib/utils/getRenderContainer/getRenderContainer.d.ts +3 -0
- package/dist/lib/utils/getRenderContainer/index.d.ts +1 -0
- package/dist/lib/utils/image.d.ts +7 -0
- package/dist/lib/utils/index.d.ts +7 -0
- package/dist/lib/utils/useForwardedRefCallback/index.d.ts +1 -0
- package/dist/lib/utils/useForwardedRefCallback/useForwardedRefCallback.d.ts +21 -0
- package/dist/lib/utils/useForwardedRefCallback/useForwardedRefCallback.test.d.ts +1 -0
- package/dist/store.d.ts +3 -0
- package/dist/styles.css +3151 -0
- package/dist/types/elemental.schema.d.ts +25 -0
- package/dist/types/elemental.types.d.ts +195 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/tiptap.types.d.ts +15 -0
- package/package.json +150 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/index.ts", "../../src/hooks/useAutoSave.ts", "../../src/lib/utils/index.ts", "../../src/lib/utils/convertElementalToTiptap/convertElementalToTiptap.ts", "../../src/lib/utils/convertTiptapToElemental/convertTiptapToElemental.ts", "../../src/lib/utils/convertMarkdownToTiptap/convertMarkdownToTiptap.ts", "../../src/components/TemplateEditor/TemplateEditor.tsx", "../../src/store.ts", "../../src/components/Providers/TemplateProvider.tsx", "../../src/components/Providers/api/brand.ts", "../../src/components/Providers/store.ts", "../../src/components/Providers/api/common.ts", "../../src/components/Providers/api/template.ts", "../../src/components/TemplateEditor/store.ts", "../../src/components/Providers/BrandProvider.tsx", "../../src/components/extensions/Blockquote/Blockquote.ts", "../../node_modules/@tiptap/extension-blockquote/src/blockquote.ts", "../../src/components/utils/generateNodeIds.ts", "../../src/components/ui-kit/Button/Button.tsx", "../../src/components/ui-kit/Divider/Divider.tsx", "../../src/components/ui-kit/DropdownMenu/DropdownMenu.tsx", "../../src/components/ui-kit/Form/Form.tsx", "../../src/components/ui-kit/Label/Label.tsx", "../../src/components/ui-kit/Input/Input.tsx", "../../src/components/ui-kit/InputColor/InputColor.tsx", "../../src/components/ui-kit/InputColor/ColorPicker.tsx", "../../src/components/ui-kit/Popover/Popover.tsx", "../../src/components/ui-kit/Slider/Slider.tsx", "../../src/components/ui-kit/Switch/Switch.tsx", "../../src/components/ui-kit/Tabs/Tabs.tsx", "../../src/components/ui-kit/Textarea/Textarea.tsx", "../../src/components/ui-kit/ThemeProvider/ThemeProvider.tsx", "../../src/components/ui-kit/ThemeProvider/ThemeContext.ts", "../../src/components/ui-kit/ThemeProvider/ThemeProvider.types.ts", "../../src/components/ui-kit/Toggle/Toggle.tsx", "../../src/components/ui-kit/ToggleGroup/ToggleGroup.tsx", "../../src/components/ui-kit/Icon/Icon.tsx", "../../src/components/ui-kit/Icon/BinIcon.tsx", "../../src/components/ui-kit/Icon/BorderRadiusIcon.tsx", "../../src/components/ui-kit/Icon/BorderWidthIcon.tsx", "../../src/components/ui-kit/Icon/DesktopIcon.tsx", "../../src/components/ui-kit/Icon/DuplicateIcon.tsx", "../../src/components/ui-kit/Icon/FacebookIcon.tsx", "../../src/components/ui-kit/Icon/InstagramIcon.tsx", "../../src/components/ui-kit/Icon/LinkedinIcon.tsx", "../../src/components/ui-kit/Icon/MediumIcon.tsx", "../../src/components/ui-kit/Icon/MobileIcon.tsx", "../../src/components/ui-kit/Icon/PaddingHorizontalIcon.tsx", "../../src/components/ui-kit/Icon/PaddingVerticalIcon.tsx", "../../src/components/ui-kit/Icon/RemoveFormattingIcon.tsx", "../../src/components/ui-kit/Icon/XIcon.tsx", "../../src/components/ui/SortableItemWrapper/SortableItemWrapper.tsx", "../../src/components/extensions/index.ts", "../../node_modules/@tiptap/extension-dropcursor/src/dropcursor.ts", "../../node_modules/@tiptap/extension-history/src/history.ts", "../../src/components/extensions/Button/Button.ts", "../../src/components/extensions/Button/ButtonComponent.tsx", "../../src/components/ui/TextMenu/store.ts", "../../src/components/ui/TextMenu/config.ts", "../../src/components/extensions/Button/Button.types.ts", "../../src/components/extensions/Button/ButtonForm.tsx", "../../src/components/hooks/useNodeAttributes.ts", "../../src/components/ui/FormHeader/FormHeader.tsx", "../../src/components/ui/Blocks/Block.tsx", "../../src/components/ui/Blocks/BlockquoteBlock/BlockquoteBlock.tsx", "../../src/components/ui/Blocks/ButtonBlock/ButtonBlock.tsx", "../../src/components/ui/Blocks/DividerBlock/DividerBlock.tsx", "../../src/components/ui/Blocks/HeadingBlock/Heading.tsx", "../../src/components/ui/Blocks/ImageBlock/ImageBlock.tsx", "../../src/components/ui/Blocks/SpacerBlock/SpacerBlock.tsx", "../../src/components/ui/Blocks/TextBlock/TextBlock.tsx", "../../src/components/ui/TextInput/TextInput.tsx", "../../src/components/extensions/Variable/VariableSuggestions.tsx", "../../src/components/utils/getFlattenedVariables.ts", "../../src/components/extensions/Button/ButtonIcon.tsx", "../../src/components/extensions/Divider/Divider.ts", "../../node_modules/@tiptap/extension-horizontal-rule/src/horizontal-rule.ts", "../../src/components/extensions/Divider/DividerComponent.tsx", "../../src/components/extensions/Divider/Divider.types.ts", "../../src/components/extensions/Divider/DividerForm.tsx", "../../node_modules/@tiptap/extension-document/src/document.ts", "../../src/components/extensions/Document/Document.ts", "../../src/components/extensions/DragPlaceholder/DragPlaceholder.ts", "../../src/components/extensions/DragPlaceholder/DragPlaceholderComponent.tsx", "../../src/components/extensions/FileHandler/FileHandler.ts", "../../src/components/extensions/Heading/Heading.ts", "../../node_modules/@tiptap/extension-heading/src/heading.ts", "../../src/components/extensions/TextBlock/TextBlock.types.ts", "../../src/components/extensions/TextBlock/TextBlockComponent.tsx", "../../src/components/extensions/TextBlock/TextBlockForm.tsx", "../../src/components/extensions/ImageBlock/ImageBlock.ts", "../../src/lib/api/uploadImage.ts", "../../src/components/extensions/ImageBlock/components/ImageBlockView.tsx", "../../src/components/ui/Loader/Loader.tsx", "../../src/components/extensions/ImageBlock/ImageBlock.types.ts", "../../src/components/extensions/ImageBlock/components/ImageBlockForm.tsx", "../../src/components/extensions/Link/Link.ts", "../../src/components/extensions/Link/LinkForm.tsx", "../../node_modules/@tiptap/extension-paragraph/src/paragraph.ts", "../../src/components/extensions/Paragraph/Paragraph.ts", "../../node_modules/w3c-keyname/index.js", "../../node_modules/prosemirror-keymap/dist/index.js", "../../src/components/extensions/Selection/Selection.ts", "../../node_modules/@popperjs/core/lib/enums.js", "../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js", "../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js", "../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js", "../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js", "../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js", "../../node_modules/@popperjs/core/lib/utils/math.js", "../../node_modules/@popperjs/core/lib/utils/userAgent.js", "../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js", "../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js", "../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js", "../../node_modules/@popperjs/core/lib/dom-utils/contains.js", "../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js", "../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js", "../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js", "../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js", "../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js", "../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js", "../../node_modules/@popperjs/core/lib/utils/within.js", "../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js", "../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js", "../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js", "../../node_modules/@popperjs/core/lib/modifiers/arrow.js", "../../node_modules/@popperjs/core/lib/utils/getVariation.js", "../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js", "../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js", "../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js", "../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js", "../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js", "../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js", "../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js", "../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js", "../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js", "../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js", "../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js", "../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js", "../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js", "../../node_modules/@popperjs/core/lib/utils/computeOffsets.js", "../../node_modules/@popperjs/core/lib/utils/detectOverflow.js", "../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js", "../../node_modules/@popperjs/core/lib/modifiers/flip.js", "../../node_modules/@popperjs/core/lib/modifiers/hide.js", "../../node_modules/@popperjs/core/lib/modifiers/offset.js", "../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js", "../../node_modules/@popperjs/core/lib/utils/getAltAxis.js", "../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js", "../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js", "../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js", "../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js", "../../node_modules/@popperjs/core/lib/utils/orderModifiers.js", "../../node_modules/@popperjs/core/lib/utils/debounce.js", "../../node_modules/@popperjs/core/lib/utils/mergeByName.js", "../../node_modules/@popperjs/core/lib/createPopper.js", "../../node_modules/@popperjs/core/lib/popper.js", "../../node_modules/tippy.js/src/constants.ts", "../../node_modules/tippy.js/src/utils.ts", "../../node_modules/tippy.js/src/dom-utils.ts", "../../node_modules/tippy.js/src/bindGlobalEventListeners.ts", "../../node_modules/tippy.js/src/browser.ts", "../../node_modules/tippy.js/src/validation.ts", "../../node_modules/tippy.js/src/props.ts", "../../node_modules/tippy.js/src/template.ts", "../../node_modules/tippy.js/src/createTippy.ts", "../../node_modules/tippy.js/src/index.ts", "../../node_modules/tippy.js/src/addons/createSingleton.ts", "../../node_modules/tippy.js/src/addons/delegate.ts", "../../node_modules/tippy.js/src/plugins/animateFill.ts", "../../node_modules/tippy.js/src/plugins/followCursor.ts", "../../node_modules/tippy.js/src/plugins/inlinePositioning.ts", "../../node_modules/tippy.js/src/plugins/sticky.ts", "../../node_modules/tippy.js/build/base.js", "../../src/components/ui/Surface.tsx", "../../src/components/extensions/Variable/Variable.ts", "../../src/components/extensions/Variable/suggestion.ts", "../../src/components/extensions/Variable/VariableView.tsx", "../../src/components/utils/isCustomNodeSelected.ts", "../../src/components/utils/isTextSelected.ts", "../../src/components/utils/createOrDuplicateNode.ts", "../../src/components/utils/multipleContainersKeyboardCoordinates.ts", "../../src/components/ui/Handle/Handle.tsx", "../../src/components/ui/TextMenu/hooks/useTextmenuCommands.ts", "../../src/components/extensions/Blockquote/BlockquoteComponent.tsx", "../../src/components/extensions/Blockquote/BlockquoteForm.tsx", "../../src/components/extensions/Blockquote/Blockquote.types.ts", "../../src/components/TemplateEditor/Editor/SideBar/SideBarItemDetails/SideBarItemDetails.tsx", "../../src/components/ui/TextMenu/TextMenu.tsx", "../../src/components/ui/Toolbar.tsx", "../../src/components/ui/Tooltip/index.tsx", "../../src/components/ui/TextMenu/components/ContentTypePicker.tsx", "../../src/components/ui/TextMenu/hooks/useTextmenuContentTypes.ts", "../../src/components/ui/TextMenu/hooks/useTextmenuStates.ts", "../../src/components/BrandEditor/Editor/Editor.tsx", "../../src/components/ui/Header/Header.tsx", "../../src/components/ui/Status/Status.tsx", "../../src/components/BrandEditor/BrandEditor.types.ts", "../../src/components/BrandEditor/store.ts", "../../src/components/BrandEditor/Editor/BrandFooter/BrandFooter.tsx", "../../src/lib/api/UploadImageAPI.ts", "../../src/components/extensions/extension-kit.ts", "../../src/lib/utils/convertTiptapToMarkdown/convertTiptapToMarkdown.ts", "../../src/components/BrandEditor/Editor/useBlockEditor.ts", "../../src/lib/utils/image.ts", "../../src/components/BrandEditor/Editor/LogoUploader/LogoUploader.tsx", "../../src/components/BrandEditor/Editor/SideBar/SideBar.tsx", "../../src/types/elemental.schema.ts", "../../src/components/ElementalValue/ElementalValue.tsx", "../../src/components/ui/EditorLayout/EditorLayout.tsx", "../../src/components/ui/PreviewPanel/PreviewPanel.tsx", "../../src/components/TemplateEditor/Editor/Editor.tsx", "../../src/components/TemplateEditor/Editor/SideBar/SideBar.tsx", "../../src/components/TemplateEditor/Editor/SideBar/SideBarSortableItemWrapper/SideBarSortableItemWrapper.tsx", "../../src/components/TemplateEditor/Editor/useBlockEditor.ts", "../../src/components/BrandEditor/BrandEditor.tsx"],
|
|
4
|
+
"sourcesContent": ["import \"./styles.css\";\n\nexport * from \"./components/TemplateEditor\";\nexport * from \"./components/BrandEditor\";\nexport * from \"./components/Providers\";\n// export * from \"./components/EditorProvider\";\n", "import { useCallback, useEffect, useRef, useState } from \"react\";\n\ninterface UseAutoSaveOptions<T> {\n onSave: (content: T) => Promise<void>;\n debounceMs?: number;\n enabled?: boolean;\n onError?: (error: unknown) => void;\n initialContent?: T;\n}\n\nexport function useAutoSave<T>({\n onSave,\n debounceMs = 200,\n enabled = true,\n onError,\n initialContent,\n}: UseAutoSaveOptions<T>) {\n const [isSaving, setIsSaving] = useState(false);\n const pendingChangesRef = useRef<T | null>(null);\n const previousContentRef = useRef<string>();\n const lastSaveTimestampRef = useRef<number>(0);\n const debounceTimeoutRef = useRef<NodeJS.Timeout>();\n\n // Initialize previousContentRef with initialContent if provided\n useEffect(() => {\n if (initialContent) {\n previousContentRef.current = JSON.stringify(initialContent);\n }\n }, [initialContent]);\n\n const handleAutoSave = useCallback(\n async (content: T) => {\n if (!enabled) return;\n\n // Store or update the pending content immediately\n pendingChangesRef.current = content;\n\n // Clear any existing timeout to prevent multiple saves\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n debounceTimeoutRef.current = undefined;\n }\n\n const processPendingContent = async () => {\n // Get and clear pending content\n const contentToSave = pendingChangesRef.current;\n pendingChangesRef.current = null;\n\n if (!contentToSave) return;\n\n try {\n const contentString = JSON.stringify(contentToSave);\n // Don't save if content hasn't changed\n if (contentString === previousContentRef.current) {\n return;\n }\n\n setIsSaving(true);\n previousContentRef.current = contentString;\n lastSaveTimestampRef.current = Date.now();\n await onSave(contentToSave);\n } catch (error) {\n onError?.(error);\n // Reset saving state even if there's an error\n setIsSaving(false);\n return;\n }\n\n setIsSaving(false);\n\n // After save completes, if we have new pending changes, start a new debounce cycle\n if (pendingChangesRef.current) {\n handleAutoSave(pendingChangesRef.current);\n }\n };\n\n // If a save is in progress, wait for it to complete\n if (isSaving) {\n return;\n }\n\n // Calculate appropriate debounce delay\n const now = Date.now();\n const timeSinceLastSave = now - lastSaveTimestampRef.current;\n const delay = Math.max(0, debounceMs - timeSinceLastSave);\n\n // Set up new debounce timeout\n debounceTimeoutRef.current = setTimeout(() => {\n debounceTimeoutRef.current = undefined;\n processPendingContent();\n }, delay);\n },\n [debounceMs, enabled, isSaving, onError, onSave]\n );\n\n return {\n handleAutoSave,\n isSaving,\n };\n}\n", "import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport * from \"./convertElementalToTiptap\";\nexport * from \"./convertTiptapToElemental\";\nexport * from \"./getRenderContainer\";\nexport * from \"./useForwardedRefCallback\";\nexport * from \"./convertMarkdownToTiptap\";\n", "import type { TiptapNode, ElementalNode, ElementalContent, TiptapDoc } from \"../../../types\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport function parseMDContent(content: string): TiptapNode[] {\n const nodes: TiptapNode[] = [];\n const textNodes = content.replace(/\\n$/, \"\").split(\"\\n\");\n\n for (let i = 0; i < textNodes.length; i++) {\n parseTextLine(textNodes[i], nodes);\n\n // Add hardBreak if not the last node\n if (i < textNodes.length - 1) {\n nodes.push({ type: \"hardBreak\" });\n }\n }\n\n return nodes;\n}\n\n// Helper function to parse text line with variables\nfunction parseTextLine(line: string, nodes: TiptapNode[]): void {\n // Process markdown formatting\n processMarkdownFormatting(line, nodes);\n}\n\n// Apply marks helper function\nfunction applyMarks(\n targetNodes: TiptapNode[],\n openMarkers: Array<{ type: string; text: string; start: number; href?: string }>\n): void {\n if (openMarkers.length === 0) return;\n\n targetNodes.forEach((node) => {\n node.marks = node.marks || []; // Ensure marks array exists\n openMarkers.forEach((marker) => {\n if (!node.marks?.some((m) => m.type === marker.type)) {\n node.marks?.push({\n type: marker.type,\n ...(marker.href && { attrs: { href: marker.href } }),\n });\n }\n });\n if (node.marks.length === 0) {\n delete node.marks; // Clean up empty marks array\n }\n });\n}\n\n// Process markdown formatting with proper nesting using regex identification\nfunction processMarkdownFormatting(text: string, nodes: TiptapNode[]): void {\n if (!text) return;\n\n // Basic tokenization with position tracking\n const tokens: Array<{\n type: string;\n text: string;\n start: number;\n end: number;\n attrs?: {\n id?: string;\n href?: string;\n hasVariables?: boolean;\n originalHref?: string;\n };\n }> = [];\n\n // First pass: Find all links and text segments\n const linkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n let match;\n let lastEnd = 0;\n\n while ((match = linkRegex.exec(text)) !== null) {\n // Add text before the link if any\n if (match.index > lastEnd) {\n tokens.push({\n type: \"text\",\n text: text.substring(lastEnd, match.index),\n start: lastEnd,\n end: match.index,\n });\n }\n\n // Add the link token\n tokens.push({\n type: \"link\",\n text: match[1], // Link text\n start: match.index,\n end: match.index + match[1].length,\n attrs: {\n href: match[2], // URL\n },\n });\n\n lastEnd = match.index + match[0].length;\n }\n\n // Add remaining text if any\n if (lastEnd < text.length) {\n tokens.push({\n type: \"text\",\n text: text.substring(lastEnd),\n start: lastEnd,\n end: text.length,\n });\n }\n\n // Second pass: Process markdown markers in text segments\n const processedTokens: typeof tokens = [];\n\n for (const token of tokens) {\n if (token.type === \"link\") {\n processedTokens.push(token);\n continue;\n }\n\n let currentPos = 0;\n const markdownRegex = /(\\*\\*|\\*|__|_|~|\\+|\\{\\{[^}]+\\}\\}|\\{\\}[^{}]+\\{\\})/g;\n const segment = token.text;\n let segmentMatch;\n\n while ((segmentMatch = markdownRegex.exec(segment)) !== null) {\n const matchStart = segmentMatch.index;\n const matchText = segmentMatch[0];\n const matchEnd = matchStart + matchText.length;\n\n // Add text before the match if any\n if (matchStart > currentPos) {\n processedTokens.push({\n type: \"text\",\n text: segment.substring(currentPos, matchStart),\n start: token.start + currentPos,\n end: token.start + matchStart,\n });\n }\n\n // Add the marker token\n if (matchText.startsWith(\"{{\") || matchText.startsWith(\"{}\")) {\n const variableName = matchText.startsWith(\"{{\")\n ? matchText.slice(2, -2)\n : matchText.substring(2, matchText.length - 2);\n processedTokens.push({\n type: \"variable\",\n text: matchText,\n start: token.start + matchStart,\n end: token.start + matchEnd,\n attrs: { id: variableName },\n });\n } else {\n processedTokens.push({\n type: \"marker\",\n text: matchText,\n start: token.start + matchStart,\n end: token.start + matchEnd,\n });\n }\n\n currentPos = matchEnd;\n }\n\n // Add remaining text if any\n if (currentPos < segment.length) {\n processedTokens.push({\n type: \"text\",\n text: segment.substring(currentPos),\n start: token.start + currentPos,\n end: token.start + segment.length,\n });\n }\n }\n\n // Sort tokens by start position\n processedTokens.sort((a, b) => a.start - b.start);\n\n // Process tokens and build nodes\n const openMarkers: Array<{ type: string; text: string; start: number; href?: string }> = [];\n const finalNodes: TiptapNode[] = [];\n\n for (const token of processedTokens) {\n if (token.type === \"text\") {\n const textNodesSegment: TiptapNode[] = [];\n parseTextWithVariables(token.text, [], textNodesSegment);\n applyMarks(textNodesSegment, openMarkers);\n finalNodes.push(...textNodesSegment);\n } else if (token.type === \"variable\") {\n const variableNode: TiptapNode = {\n type: \"variable\",\n attrs: token.attrs,\n };\n applyMarks([variableNode], openMarkers);\n finalNodes.push(variableNode);\n } else if (token.type === \"link\") {\n const linkNodes: TiptapNode[] = [];\n parseTextWithVariables(token.text, [], linkNodes);\n linkNodes.forEach((node) => {\n node.marks = node.marks || [];\n node.marks.push({\n type: \"link\",\n attrs: { href: token.attrs?.href },\n });\n });\n finalNodes.push(...linkNodes);\n } else if (token.type === \"marker\") {\n const markerText = token.text;\n if ([\"**\", \"*\", \"__\", \"_\", \"~\", \"+\"].includes(markerText)) {\n const markerType =\n markerText === \"**\" || markerText === \"__\"\n ? \"bold\"\n : markerText === \"*\" || markerText === \"_\"\n ? \"italic\"\n : markerText === \"~\"\n ? \"strike\"\n : \"underline\";\n\n const existingIndex = openMarkers.findLastIndex((m) => m.text === markerText);\n if (existingIndex !== -1) {\n openMarkers.splice(existingIndex, 1);\n } else {\n openMarkers.push({ type: markerType, text: markerText, start: token.start });\n }\n }\n }\n }\n\n // Replace original nodes array content\n nodes.length = 0;\n nodes.push(...finalNodes);\n}\n\n// Helper function to parse text with variables and handle marks\nfunction parseTextWithVariables(\n text: string,\n marks: { text: string; href?: string; type: string }[],\n nodes: TiptapNode[]\n): void {\n if (!text) return; // Skip empty text\n\n const variableRegex = /(\\{\\{[^}]+\\}\\}\\|\\{\\}[^{}]+\\{\\})/g; // Keep the global flag\n let match;\n let lastIndex = 0;\n\n while ((match = variableRegex.exec(text)) !== null) {\n // Add text before the variable if it exists\n if (match.index > lastIndex) {\n const beforeText = text.substring(lastIndex, match.index);\n nodes.push({\n type: \"text\",\n text: beforeText,\n ...(marks.length > 0 && { marks }),\n });\n }\n\n // Extract variable name\n const variableName = match[0].startsWith(\"{{\")\n ? match[0].slice(2, -2)\n : match[0].substring(2, match[0].length - 2);\n\n // Check if this variable is inside a link\n const hasLinkMark = marks.some((mark) => mark.type === \"link\");\n\n // Add the variable node\n nodes.push({\n type: \"variable\",\n attrs: {\n id: variableName,\n ...(hasLinkMark && { inUrlContext: true }),\n },\n ...(marks.length > 0 && { marks }),\n });\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add any remaining text after the last variable (or the entire text if no variables were found)\n if (lastIndex < text.length) {\n const remainingText = text.substring(lastIndex);\n nodes.push({\n type: \"text\",\n text: remainingText,\n ...(marks.length > 0 && { marks }),\n });\n }\n}\n\nexport function convertElementalToTiptap(elemental: ElementalContent): TiptapDoc {\n const convertNode = (node: ElementalNode): TiptapNode[] => {\n // Skip meta nodes as they are just for storing the subject\n if (node.type === \"meta\") {\n return [];\n }\n\n switch (node.type) {\n case \"text\":\n if (\"content\" in node) {\n const headingLevel = node.text_style === \"h1\" ? 1 : node.text_style === \"h2\" ? 2 : null;\n\n // Parse padding values if present\n let paddingAttrs = {};\n if (node.padding) {\n const [verticalStr, horizontalStr] = node.padding.replace(/px/g, \"\").split(\" \");\n const vertical = parseInt(verticalStr);\n const horizontal = parseInt(horizontalStr);\n if (!isNaN(vertical) && !isNaN(horizontal)) {\n paddingAttrs = {\n paddingVertical: vertical,\n paddingHorizontal: horizontal,\n };\n }\n }\n\n // Parse border values if present\n let borderAttrs = {};\n if (node.border?.enabled) {\n borderAttrs = {\n ...(node.border.color && { borderColor: node.border.color }),\n ...(node.border.size && { borderWidth: parseInt(node.border.size) }),\n ...(node.border.radius && { borderRadius: node.border.radius }),\n };\n }\n\n // Handle empty content - avoid empty nodes\n const contentNodes = node.content.trim()\n ? parseMDContent(node.content)\n : [{ type: \"text\", text: \" \" }];\n\n return [\n {\n type: headingLevel ? \"heading\" : \"paragraph\",\n attrs: {\n textAlign: node.align || \"left\",\n level: headingLevel,\n id: `node-${uuidv4()}`,\n ...paddingAttrs,\n ...(node.color && { textColor: node.color }),\n ...(node.background_color && { backgroundColor: node.background_color }),\n ...borderAttrs,\n },\n content: contentNodes,\n },\n ];\n }\n return [];\n\n case \"action\":\n return [\n {\n type: \"button\",\n attrs: {\n label: node.content,\n link: node.href,\n alignment: node.align === \"full\" ? \"center\" : node.align || \"center\",\n size: node.align === \"full\" ? \"full\" : \"default\",\n style: node.style,\n id: `node-${uuidv4()}`,\n ...(node.background_color && { backgroundColor: node.background_color }),\n ...(node.color && { textColor: node.color }),\n ...(node.padding && { padding: parseInt(node.padding) }),\n ...(node.border?.enabled && {\n ...(node.border.color && { borderColor: node.border.color }),\n ...(node.border.size && { borderWidth: parseInt(node.border.size) }),\n ...(node.border.radius && { borderRadius: node.border.radius }),\n }),\n },\n },\n ];\n\n case \"quote\":\n return [\n {\n type: \"blockquote\",\n attrs: {\n textAlign: node.align || \"left\",\n id: `node-${uuidv4()}`,\n ...(node.border_color && { borderColor: node.border_color }),\n },\n content: [\n {\n type: \"paragraph\",\n attrs: {\n textAlign: node.align || \"left\",\n id: `node-${uuidv4()}`,\n },\n content: parseMDContent(node.content),\n },\n ],\n },\n ];\n\n case \"image\":\n return [\n {\n type: \"imageBlock\",\n attrs: {\n sourcePath: node.src,\n id: `node-${uuidv4()}`,\n ...(node.href && { link: node.href }),\n ...(node.align && { alignment: node.align }),\n ...(node.alt_text && { alt: node.alt_text }),\n ...(node.width && {\n width: parseInt(node.width.replace(/%|px/, \"\")),\n }),\n ...(node.border?.enabled && {\n ...(node.border.color && { borderColor: node.border.color }),\n ...(node.border.size && { borderWidth: parseInt(node.border.size) }),\n ...(node.border.radius && { borderRadius: parseInt(node.border.radius) }),\n }),\n },\n },\n ];\n\n case \"divider\":\n return [\n {\n type: \"divider\",\n attrs: {\n id: `node-${uuidv4()}`,\n ...(node.dividerColor && { color: node.dividerColor }),\n ...(node.borderWidth && { size: parseInt(node.borderWidth) }),\n ...(node.padding && { padding: parseInt(node.padding) }),\n variant: node.dividerColor === \"transparent\" ? \"spacer\" : \"divider\",\n },\n },\n ];\n\n default:\n return [];\n }\n };\n\n // Find the email channel node\n const channelNode = elemental?.elements\n ? elemental.elements.find(\n (el: ElementalNode) => el.type === \"channel\" && el.channel === \"email\"\n )\n : undefined;\n if (!channelNode || !(\"elements\" in channelNode) || !Array.isArray(channelNode.elements)) {\n // If no email channel node found or invalid structure, convert all elements directly\n return {\n type: \"doc\",\n content: elemental?.elements?.flatMap(convertNode),\n };\n }\n\n // Convert only the elements inside the channel node\n return {\n type: \"doc\",\n content: channelNode?.elements?.flatMap(convertNode),\n };\n}\n", "import type {\n ElementalContent,\n ElementalNode,\n ElementalTextNode,\n ElementalQuoteNode,\n ElementalImageNode,\n ElementalDividerNode,\n ElementalActionNode,\n Align,\n} from \"@/types/elemental.types\";\n\nexport interface TiptapNode {\n type: string;\n attrs?: Record<string, unknown>;\n content?: TiptapNode[];\n marks?: TiptapMark[];\n text?: string;\n}\n\nexport interface TiptapMark {\n type: string;\n attrs?: Record<string, unknown>;\n}\n\nexport interface TiptapDoc {\n type: \"doc\";\n content: TiptapNode[];\n}\n\nconst markToMD = (mark: TiptapMark): string => {\n switch (mark.type) {\n case \"bold\":\n return \"**\";\n case \"italic\":\n return \"*\";\n case \"strike\":\n return \"~\";\n case \"underline\":\n return \"+\";\n default:\n return \"\";\n }\n};\n\nconst convertTextToMarkdown = (node: TiptapNode): string => {\n if (node.type === \"variable\") {\n return `{{${node.attrs?.id}}}`;\n }\n\n let text = node.text || \"\";\n\n if (node.marks?.length) {\n const markSymbols = node.marks.map(markToMD).filter(Boolean);\n text = markSymbols.join(\"\") + text + markSymbols.reverse().join(\"\");\n }\n\n const linkMark = node.marks?.find((m) => m.type === \"link\");\n if (linkMark) {\n text = `[${text}](${linkMark.attrs?.href})`;\n }\n\n return text;\n};\n\nexport function convertTiptapToElemental(tiptap: TiptapDoc, subject?: string): ElementalContent {\n const convertNode = (node: TiptapNode): ElementalNode[] => {\n switch (node.type) {\n case \"paragraph\": {\n let content = \"\";\n const nodes = node.content || [];\n\n for (let i = 0; i < nodes.length; i++) {\n if (nodes[i].type === \"hardBreak\") {\n content += \"\\n\";\n } else {\n content += convertTextToMarkdown(nodes[i]);\n }\n }\n content += \"\\n\";\n\n const textNode: ElementalTextNode = {\n type: \"text\",\n align: (node.attrs?.textAlign as Align) || \"left\",\n content,\n };\n\n if (\n node.attrs?.paddingVertical !== undefined &&\n node.attrs?.paddingHorizontal !== undefined\n ) {\n textNode.padding = `${node.attrs.paddingVertical}px ${node.attrs.paddingHorizontal}px`;\n }\n\n if (node.attrs?.textColor) {\n textNode.color = node.attrs.textColor as string;\n }\n\n if (node.attrs?.backgroundColor) {\n textNode.background_color = node.attrs.backgroundColor as string;\n }\n\n if (node.attrs?.borderWidth || node.attrs?.borderColor || node.attrs?.borderRadius) {\n textNode.border = {\n enabled: true,\n };\n\n if (node.attrs?.borderColor) {\n textNode.border.color = node.attrs.borderColor as string;\n }\n\n if (node.attrs?.borderWidth) {\n textNode.border.size = `${node.attrs.borderWidth}px`;\n }\n\n if (node.attrs?.borderRadius) {\n textNode.border.radius = node.attrs.borderRadius as number;\n }\n }\n\n return [textNode];\n }\n\n case \"heading\": {\n let content = \"\";\n const nodes = node.content || [];\n\n for (let i = 0; i < nodes.length; i++) {\n if (nodes[i].type === \"hardBreak\") {\n content += \"\\n\";\n } else {\n content += convertTextToMarkdown(nodes[i]);\n }\n }\n content += \"\\n\";\n\n const textNode: ElementalTextNode = {\n type: \"text\",\n align: (node.attrs?.textAlign as Align) || \"left\",\n content,\n text_style: node.attrs?.level === 1 ? \"h1\" : \"h2\",\n };\n\n if (\n node.attrs?.paddingVertical !== undefined &&\n node.attrs?.paddingHorizontal !== undefined\n ) {\n textNode.padding = `${node.attrs.paddingVertical}px ${node.attrs.paddingHorizontal}px`;\n }\n\n if (node.attrs?.textColor) {\n textNode.color = node.attrs.textColor as string;\n }\n\n if (node.attrs?.backgroundColor) {\n textNode.background_color = node.attrs.backgroundColor as string;\n }\n\n if (node.attrs?.borderWidth || node.attrs?.borderColor || node.attrs?.borderRadius) {\n textNode.border = {\n enabled: true,\n };\n\n if (node.attrs?.borderColor) {\n textNode.border.color = node.attrs.borderColor as string;\n }\n\n if (node.attrs?.borderWidth) {\n textNode.border.size = `${node.attrs.borderWidth}px`;\n }\n\n if (node.attrs?.borderRadius) {\n textNode.border.radius = node.attrs.borderRadius as number;\n }\n }\n\n return [textNode];\n }\n\n case \"blockquote\": {\n let content = \"\";\n if (node.content) {\n for (const childNode of node.content) {\n if (childNode.content) {\n content += childNode.content.map(convertTextToMarkdown).join(\"\");\n }\n content += \"\\n\";\n }\n }\n content = content.trim();\n\n const quoteNode: ElementalQuoteNode = {\n type: \"quote\",\n content,\n };\n\n if (node.attrs?.textAlign !== \"left\") {\n quoteNode.align = node.attrs?.textAlign as \"center\" | \"right\" | \"full\";\n }\n\n if (node.attrs?.borderColor) {\n quoteNode.border_color = node.attrs.borderColor as string;\n }\n\n return [quoteNode];\n }\n\n case \"imageBlock\": {\n const imageNode: ElementalImageNode = {\n type: \"image\",\n src: (node.attrs?.sourcePath as string) || \"\",\n };\n\n if (node.attrs?.link) {\n imageNode.href = node.attrs.link as string;\n }\n\n if (node.attrs?.alignment) {\n imageNode.align = node.attrs.alignment as \"left\" | \"center\" | \"right\" | \"full\";\n }\n\n if (node.attrs?.alt) {\n imageNode.alt_text = node.attrs.alt as string;\n }\n\n if (node.attrs?.width) {\n imageNode.width = `${node.attrs.width}%`;\n }\n\n if (node.attrs?.borderWidth || node.attrs?.borderColor || node.attrs?.borderRadius) {\n imageNode.border = {\n enabled: true,\n };\n\n if (node.attrs?.borderColor) {\n imageNode.border.color = node.attrs.borderColor as string;\n }\n\n if (node.attrs?.borderWidth) {\n imageNode.border.size = `${node.attrs.borderWidth}px`;\n }\n\n if (node.attrs?.borderRadius) {\n imageNode.border.radius = `${node.attrs.borderRadius}px`;\n }\n }\n\n return [imageNode];\n }\n\n case \"divider\": {\n const dividerNode: ElementalDividerNode = {\n type: \"divider\",\n };\n\n if (node.attrs?.color) {\n dividerNode.dividerColor = node.attrs.color as string;\n }\n\n if (node.attrs?.size) {\n dividerNode.borderWidth = `${node.attrs.size}px`;\n }\n\n if (node.attrs?.padding) {\n dividerNode.padding = `${node.attrs.padding}px`;\n }\n\n return [dividerNode];\n }\n\n case \"button\": {\n const actionNode: ElementalActionNode = {\n type: \"action\",\n content: (node.attrs?.label as string) ?? \"\",\n href: (node.attrs?.link as string) ?? \"#\",\n };\n\n if (node.attrs?.style) {\n actionNode.style = node.attrs.style as \"button\" | \"link\";\n }\n\n actionNode.align =\n node.attrs?.size === \"full\"\n ? \"full\"\n : (node.attrs?.alignment as \"left\" | \"center\" | \"right\" | \"full\") || \"center\";\n\n if (node.attrs?.backgroundColor) {\n actionNode.background_color = node.attrs.backgroundColor as string;\n }\n\n if (node.attrs?.textColor) {\n actionNode.color = node.attrs.textColor as string;\n }\n\n if (node.attrs?.padding) {\n actionNode.padding = `${node.attrs.padding}px`;\n }\n\n if (node.attrs?.borderWidth || node.attrs?.borderColor || node.attrs?.borderRadius) {\n actionNode.border = {\n enabled: true,\n };\n\n if (node.attrs?.borderColor) {\n actionNode.border.color = node.attrs.borderColor as string;\n }\n\n if (node.attrs?.borderWidth) {\n actionNode.border.size = `${node.attrs.borderWidth}px`;\n }\n\n if (node.attrs?.borderRadius) {\n actionNode.border.radius = node.attrs.borderRadius as number;\n }\n }\n\n return [actionNode];\n }\n\n default:\n return node.content ? node.content.flatMap(convertNode) : [];\n }\n };\n\n // Create the channel node with all content nested inside its elements array\n const channelNode: ElementalNode = {\n type: \"channel\",\n channel: \"email\",\n elements: [],\n };\n\n // Add meta element with subject if it exists\n if (subject?.trim()) {\n channelNode.elements!.push({\n type: \"meta\",\n title: subject,\n });\n }\n\n // Add the rest of the content under the channel's elements\n channelNode.elements!.push(...tiptap.content.flatMap(convertNode));\n\n return {\n version: \"2022-01-01\",\n elements: [channelNode],\n };\n}\n", "import type { TiptapDoc, TiptapNode } from \"../convertTiptapToElemental/convertTiptapToElemental\";\n\n// Helper function to apply marks to nodes\nfunction applyMarks(\n targetNodes: TiptapNode[],\n openMarkers: Array<{ type: string; text: string; start: number; href?: string }>\n): void {\n if (openMarkers.length === 0) return;\n\n targetNodes.forEach((node) => {\n node.marks = node.marks || []; // Ensure marks array exists\n openMarkers.forEach((marker) => {\n if (!node.marks?.some((m) => m.type === marker.type)) {\n node.marks?.push({\n type: marker.type,\n ...(marker.href && { attrs: { href: marker.href } }),\n });\n }\n });\n if (node.marks.length === 0) {\n delete node.marks; // Clean up empty marks array\n }\n });\n}\n\n// Helper function to parse text with variables\nfunction parseTextWithVariables(\n text: string,\n marks: { text: string; href?: string; type: string }[],\n nodes: TiptapNode[]\n): void {\n if (!text) return;\n\n const variableRegex = /{{([^}]+)}}/g;\n let match;\n let lastIndex = 0;\n\n while ((match = variableRegex.exec(text)) !== null) {\n // Add text before the variable if it exists\n if (match.index > lastIndex) {\n const beforeText = text.substring(lastIndex, match.index);\n nodes.push({\n type: \"text\",\n text: beforeText,\n ...(marks.length > 0 && { marks }),\n });\n }\n\n // Add the variable node\n nodes.push({\n type: \"variable\",\n attrs: {\n id: match[1],\n },\n ...(marks.length > 0 && { marks }),\n });\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add any remaining text after the last variable\n if (lastIndex < text.length) {\n const remainingText = text.substring(lastIndex);\n nodes.push({\n type: \"text\",\n text: remainingText,\n ...(marks.length > 0 && { marks }),\n });\n }\n}\n\nfunction processMarkdownFormatting(text: string): TiptapNode[] {\n if (!text) return [];\n\n // First pass: Find all links and text segments\n const tokens: Array<{\n type: string;\n text: string;\n start: number;\n end: number;\n attrs?: {\n href?: string;\n id?: string;\n };\n }> = [];\n\n // Find all links first\n const linkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n let match;\n let lastEnd = 0;\n\n while ((match = linkRegex.exec(text)) !== null) {\n // Add text before the link if any\n if (match.index > lastEnd) {\n tokens.push({\n type: \"text\",\n text: text.substring(lastEnd, match.index),\n start: lastEnd,\n end: match.index,\n });\n }\n\n // Add the link token\n tokens.push({\n type: \"link\",\n text: match[1], // Link text\n start: match.index,\n end: match.index + match[1].length,\n attrs: {\n href: match[2], // URL\n },\n });\n\n lastEnd = match.index + match[0].length;\n }\n\n // Add remaining text if any\n if (lastEnd < text.length) {\n tokens.push({\n type: \"text\",\n text: text.substring(lastEnd),\n start: lastEnd,\n end: text.length,\n });\n }\n\n // Second pass: Process markdown markers in text segments\n const processedTokens: typeof tokens = [];\n\n for (const token of tokens) {\n if (token.type === \"link\") {\n processedTokens.push(token);\n continue;\n }\n\n let currentPos = 0;\n const markdownRegex = /(\\*\\*|\\*|__|_|~|\\+|{{[^}]+}})/g;\n const segment = token.text;\n let segmentMatch;\n\n while ((segmentMatch = markdownRegex.exec(segment)) !== null) {\n const matchStart = segmentMatch.index;\n const matchText = segmentMatch[0];\n const matchEnd = matchStart + matchText.length;\n\n // Add text before the match if any\n if (matchStart > currentPos) {\n processedTokens.push({\n type: \"text\",\n text: segment.substring(currentPos, matchStart),\n start: token.start + currentPos,\n end: token.start + matchStart,\n });\n }\n\n // Add the marker token\n if (matchText.startsWith(\"{{\")) {\n const variableName = matchText.slice(2, -2);\n processedTokens.push({\n type: \"variable\",\n text: matchText,\n start: token.start + matchStart,\n end: token.start + matchEnd,\n attrs: { id: variableName },\n });\n } else {\n processedTokens.push({\n type: \"marker\",\n text: matchText,\n start: token.start + matchStart,\n end: token.start + matchEnd,\n });\n }\n\n currentPos = matchEnd;\n }\n\n // Add remaining text if any\n if (currentPos < segment.length) {\n processedTokens.push({\n type: \"text\",\n text: segment.substring(currentPos),\n start: token.start + currentPos,\n end: token.start + segment.length,\n });\n }\n }\n\n // Sort tokens by start position\n processedTokens.sort((a, b) => a.start - b.start);\n\n // Process tokens and build nodes\n const openMarkers: Array<{ type: string; text: string; start: number; href?: string }> = [];\n const finalNodes: TiptapNode[] = [];\n\n for (const token of processedTokens) {\n if (token.type === \"text\") {\n const textNodesSegment: TiptapNode[] = [];\n parseTextWithVariables(token.text, [], textNodesSegment);\n applyMarks(textNodesSegment, openMarkers);\n finalNodes.push(...textNodesSegment);\n } else if (token.type === \"variable\") {\n const variableNode: TiptapNode = {\n type: \"variable\",\n attrs: token.attrs,\n };\n applyMarks([variableNode], openMarkers);\n finalNodes.push(variableNode);\n } else if (token.type === \"link\") {\n const linkNodes: TiptapNode[] = [];\n parseTextWithVariables(token.text, [], linkNodes);\n linkNodes.forEach((node) => {\n node.marks = node.marks || [];\n node.marks.push({\n type: \"link\",\n attrs: { href: token.attrs?.href },\n });\n });\n finalNodes.push(...linkNodes);\n } else if (token.type === \"marker\") {\n const markerText = token.text;\n if ([\"**\", \"*\", \"__\", \"_\", \"~\", \"+\"].includes(markerText)) {\n const markerType =\n markerText === \"**\" || markerText === \"__\"\n ? \"bold\"\n : markerText === \"*\" || markerText === \"_\"\n ? \"italic\"\n : markerText === \"~\"\n ? \"strike\"\n : \"underline\";\n\n const existingIndex = openMarkers.findLastIndex((m) => m.text === markerText);\n if (existingIndex !== -1) {\n openMarkers.splice(existingIndex, 1);\n } else {\n openMarkers.push({ type: markerType, text: markerText, start: token.start });\n }\n }\n }\n }\n\n return finalNodes;\n}\n\nfunction parseBlockContent(markdown: string): TiptapNode[] {\n const nodes: TiptapNode[] = [];\n const paragraphs = markdown.split(/\\n/);\n\n for (const paragraph of paragraphs) {\n if (!paragraph.trim()) continue;\n\n // Handle headings\n const headingMatch = paragraph.match(/^(#{1,6})\\s+(.*)$/);\n if (headingMatch) {\n nodes.push({\n type: \"heading\",\n attrs: {\n level: headingMatch[1].length,\n textAlign: \"left\",\n },\n content: processMarkdownFormatting(headingMatch[2]),\n });\n continue;\n }\n\n // Handle blockquotes\n if (paragraph.startsWith(\">\")) {\n const quoteContent = paragraph.slice(1).trim();\n nodes.push({\n type: \"blockquote\",\n attrs: { textAlign: \"left\" },\n content: [\n {\n type: \"paragraph\",\n attrs: { textAlign: \"left\" },\n content: processMarkdownFormatting(quoteContent),\n },\n ],\n });\n continue;\n }\n\n // Handle dividers\n if (paragraph.match(/^-{3,}$/)) {\n nodes.push({\n type: \"divider\",\n });\n continue;\n }\n\n // Handle images\n const imageMatch = paragraph.match(/^!\\[(.*?)\\]\\((.*?)(?:\\s+\"(.*?)\")?\\)$/);\n if (imageMatch) {\n nodes.push({\n type: \"imageBlock\",\n attrs: {\n sourcePath: imageMatch[2],\n alt: imageMatch[1] || \"\",\n ...(imageMatch[3] && { title: imageMatch[3] }),\n },\n });\n continue;\n }\n\n // Handle regular paragraphs\n nodes.push({\n type: \"paragraph\",\n attrs: { textAlign: \"left\" },\n content: processMarkdownFormatting(paragraph),\n });\n }\n\n return nodes;\n}\n\nexport function convertMarkdownToTiptap(markdown: string): TiptapDoc {\n return {\n type: \"doc\",\n content: parseBlockContent(markdown),\n };\n}\n", "import { useAutoSave } from \"@/hooks/useAutoSave\";\nimport type { TiptapDoc } from \"@/lib\";\nimport { convertElementalToTiptap, convertTiptapToElemental } from \"@/lib\";\nimport type { ElementalContent } from \"@/types/elemental.types\";\nimport { useAtom, useAtomValue, useSetAtom } from \"jotai\";\nimport { memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { Doc as YDoc } from \"yjs\";\nimport { pageAtom } from \"../../store\";\nimport type { BrandEditorProps } from \"../BrandEditor\";\nimport { Editor as BrandEditorInternal } from \"../BrandEditor/Editor\";\nimport { BrandEditorContentAtom } from \"../BrandEditor/store\";\nimport { ElementalValue } from \"../ElementalValue/ElementalValue\";\nimport { useTemplateActions } from \"../Providers\";\nimport {\n isTenantLoadingAtom,\n templateIdAtom,\n tenantDataAtom,\n tenantEditorAtom,\n tenantIdAtom,\n} from \"../Providers/store\";\nimport type { Theme } from \"../ui-kit/ThemeProvider/ThemeProvider.types\";\nimport { EditorLayout } from \"../ui/EditorLayout\";\nimport { Loader } from \"../ui/Loader\";\nimport { getTextMenuConfigForNode } from \"../ui/TextMenu/config\";\nimport { selectedNodeAtom, setNodeConfigAtom } from \"../ui/TextMenu/store\";\nimport { Editor } from \"./Editor\";\nimport { useBlockEditor } from \"./Editor/useBlockEditor\";\nimport { subjectAtom, templateEditorContentAtom } from \"./store\";\n\nexport interface TemplateEditorProps {\n theme?: Theme | string;\n value?: ElementalContent;\n onChange?: (value: ElementalContent) => void;\n variables?: Record<string, unknown>;\n hidePublish?: boolean;\n autoSave?: boolean;\n autoSaveDebounce?: number;\n brandEditor?: boolean;\n brandProps?: BrandEditorProps;\n}\n\n// Track the current tenant and pending fetches globally\nlet currentTemplateId: string | null = null;\nlet currentTenantId: string | null = null;\nlet pendingFetch = false;\n\nconst getSubject = (content: ElementalContent) => {\n const channelNode = content.elements.find(\n (el) => el.type === \"channel\" && el.channel === \"email\"\n );\n\n if (channelNode && \"elements\" in channelNode && channelNode.elements) {\n const subjectNode = channelNode.elements.find((el) => el.type === \"meta\");\n\n if (subjectNode && \"title\" in subjectNode && typeof subjectNode.title === \"string\") {\n return subjectNode.title;\n }\n }\n return null;\n};\n\nconst TemplateEditorComponent: React.FC<TemplateEditorProps> = ({\n theme,\n value,\n onChange,\n variables,\n hidePublish = false,\n autoSave = true,\n autoSaveDebounce = 200,\n brandEditor = false,\n brandProps,\n}) => {\n const [elementalValue, setElementalValue] = useState<ElementalContent | undefined>(value);\n const isTenantLoading = useAtomValue(isTenantLoadingAtom);\n const selectedNode = useAtomValue(selectedNodeAtom);\n const setSelectedNode = useSetAtom(selectedNodeAtom);\n const setNodeConfig = useSetAtom(setNodeConfigAtom);\n const [tenantData, setTenantData] = useAtom(tenantDataAtom);\n const templateId = useAtomValue(templateIdAtom);\n const tenantId = useAtomValue(tenantIdAtom);\n const setEditor = useSetAtom(tenantEditorAtom);\n const [subject, setSubject] = useAtom(subjectAtom);\n const { getTenant, saveTemplate } = useTemplateActions();\n const ydoc = useMemo(() => new YDoc(), []);\n const page = useAtomValue(pageAtom);\n const mountedRef = useRef(false);\n const isResponseSetRef = useRef(false);\n const [templateEditorContent, setTemplateEditorContent] = useAtom(templateEditorContentAtom);\n const setBrandEditorContent = useSetAtom(BrandEditorContentAtom);\n const currentTabIndexRef = useRef<number>(-1);\n\n useEffect(() => {\n if (tenantData && (templateId !== currentTemplateId || tenantId !== currentTenantId)) {\n setTenantData(null);\n setTemplateEditorContent(null);\n setBrandEditorContent(null);\n setSubject(null);\n isResponseSetRef.current = false;\n setElementalValue(undefined);\n }\n }, [\n templateId,\n isResponseSetRef,\n tenantData,\n tenantId,\n setTemplateEditorContent,\n setSubject,\n setTenantData,\n setBrandEditorContent,\n ]);\n\n const { handleAutoSave } = useAutoSave({\n onSave: saveTemplate,\n debounceMs: autoSaveDebounce,\n enabled: isTenantLoading !== null && autoSave,\n onError: () => toast.error(\"Error saving template\"),\n });\n\n // Simple effect with only the essential logic\n useEffect(() => {\n // Skip if no tenant or already loading\n if (!templateId || !tenantId || isTenantLoading || pendingFetch) {\n return;\n }\n\n // Skip if tenant hasn't changed\n if (templateId === currentTemplateId && tenantId === currentTenantId) {\n return;\n }\n\n // Tenant has changed - update and fetch\n currentTemplateId = templateId;\n currentTenantId = tenantId;\n pendingFetch = true;\n\n // Make the API call\n getTenant({ includeBrand: brandEditor }).finally(() => {\n pendingFetch = false;\n });\n }, [templateId, tenantId, brandEditor, getTenant, isTenantLoading]);\n\n // Update TextMenu configuration when selected node changes\n useEffect(() => {\n if (selectedNode) {\n const nodeName = selectedNode.type.name;\n const config = getTextMenuConfigForNode(nodeName);\n setNodeConfig({ nodeName, config });\n }\n }, [selectedNode, setNodeConfig]);\n\n // Memoize the editor to prevent unnecessary re-renders\n const { editor } = useBlockEditor({\n initialContent: useMemo(() => elementalValue, []), // eslint-disable-line react-hooks/exhaustive-deps\n ydoc,\n variables,\n setSelectedNode,\n subject,\n // onDestroy: () => {\n // // currentTemplateId = null;\n // // setIsTemplateEditorSet(false);\n // // setSubject(\"\");\n // },\n });\n\n useEffect(() => {\n const content = tenantData?.data?.tenant?.notification?.data?.content;\n\n if (isTenantLoading === false && !content) {\n isResponseSetRef.current = true;\n }\n\n if (!content || !editor) {\n return;\n }\n\n const subject = getSubject(content);\n setSubject(subject ?? \"\");\n\n setTimeout(() => {\n editor.commands.setContent(convertElementalToTiptap(content));\n }, 0);\n\n setTimeout(() => {\n isResponseSetRef.current = true;\n }, 100);\n }, [\n tenantData,\n isTenantLoading,\n editor,\n setSubject,\n setElementalValue,\n setTemplateEditorContent,\n ]);\n\n useEffect(() => {\n if (\n !isResponseSetRef.current ||\n !templateEditorContent ||\n JSON.stringify(elementalValue) === JSON.stringify(templateEditorContent)\n ) {\n return;\n }\n\n setTimeout(() => {\n setElementalValue(templateEditorContent);\n }, 0);\n\n if (!elementalValue) {\n return;\n }\n\n if (onChange) {\n onChange(templateEditorContent);\n }\n\n if (templateEditorContent !== null) {\n handleAutoSave(templateEditorContent);\n }\n }, [elementalValue, templateEditorContent, handleAutoSave, onChange]);\n\n useEffect(() => {\n if (subject === null || !isResponseSetRef.current) {\n return;\n }\n\n const newContent = convertTiptapToElemental(editor.getJSON() as TiptapDoc, subject ?? \"\");\n if (JSON.stringify(templateEditorContent) !== JSON.stringify(newContent)) {\n setTemplateEditorContent(newContent);\n }\n }, [templateEditorContent, editor, subject, setTemplateEditorContent]);\n\n useEffect(() => {\n if (editor) {\n setEditor(editor);\n }\n }, [editor, setEditor]);\n\n useEffect(() => {\n if (editor && mountedRef.current) {\n editor.commands.updateSelectionState(selectedNode);\n }\n }, [editor, selectedNode]);\n\n useEffect(() => {\n const handleKeyPress = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setSelectedNode(null);\n editor?.commands.blur();\n currentTabIndexRef.current = -1;\n }\n\n // Handle Tab navigation between blocks\n if (event.key === \"Tab\" && editor) {\n event.preventDefault();\n\n let currentIndex = -1;\n if (selectedNode) {\n // Use your logic to find the index by ID\n editor.state.doc.content.forEach((node, _offset, index) => {\n if (selectedNode.attrs.id === node.attrs.id) {\n currentIndex = index;\n }\n });\n }\n\n // If no node was selected or the selected node couldn't be found by ID,\n // default to the first node (or perhaps use cursor position as a fallback?)\n if (currentIndex === -1) {\n currentIndex = 0;\n }\n\n const doc = editor.state.doc;\n\n // Determine target index based on Tab or Shift+Tab\n let targetIndex;\n if (!event.shiftKey) {\n // Tab: move to next node\n targetIndex = (currentIndex + 1) % doc.childCount;\n } else {\n // Shift+Tab: move to previous node\n targetIndex = (currentIndex - 1 + doc.childCount) % doc.childCount;\n }\n\n // Select the new node\n if (targetIndex !== currentIndex || selectedNode === null) {\n const targetNode = doc.child(targetIndex);\n\n // Update the selected node state\n setSelectedNode(targetNode);\n\n // Blur the editor to remove the text cursor\n editor.commands.blur();\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyPress);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyPress);\n };\n }, [editor, selectedNode, setSelectedNode]);\n\n const handleEditorClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (!editor || !mountedRef.current || !editor.isEditable) {\n return;\n }\n\n const target = event.target as HTMLElement;\n const targetPos = editor.view.posAtDOM(target, 0);\n const targetNode = editor.state.doc.resolve(targetPos).node();\n\n if (targetNode.type.name === \"paragraph\") {\n setSelectedNode(targetNode);\n }\n },\n [editor, setSelectedNode]\n );\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n return (\n <>\n <EditorLayout theme={theme}>\n {isTenantLoading && (\n <div className=\"courier-editor-loading\">\n <Loader />\n </div>\n )}\n {editor && (\n <>\n <Editor\n editor={editor}\n variables={variables}\n handleEditorClick={handleEditorClick}\n isLoading={Boolean(isTenantLoading)}\n isVisible={page === \"template\"}\n hidePublish={hidePublish}\n brandEditor={brandEditor}\n />\n {brandEditor && (\n <BrandEditorInternal\n hidePublish={hidePublish}\n autoSave={autoSave}\n isVisible={page === \"brand\"}\n templateEditor\n variables={variables}\n {...brandProps}\n />\n )}\n </>\n )}\n </EditorLayout>\n <div className=\"courier-mt-12 courier-w-full\">\n Ver: 0.0.20\n <div className=\"courier-flex courier-gap-4 courier-w-full courier-h-[300px]\">\n <textarea\n className=\"courier-flex-1 courier-rounded-lg courier-border courier-border-border courier-shadow-sm courier-p-4 courier-h-full\"\n readOnly\n value={elementalValue ? JSON.stringify(elementalValue, null, 2) : \"\"}\n />\n <div className=\"courier-flex courier-flex-col courier-w-1/2\">\n <ElementalValue\n value={elementalValue}\n onChange={(value, isValid) => {\n if (isValid) {\n try {\n const parsedValue = JSON.parse(value);\n setElementalValue(parsedValue);\n if (editor) {\n editor.commands.setContent(convertElementalToTiptap(parsedValue));\n }\n } catch (e) {\n console.error(\"Invalid JSON format\", e);\n }\n }\n }}\n />\n </div>\n </div>\n </div>\n </>\n );\n};\n\nexport const TemplateEditor = memo(TemplateEditorComponent);\n", "import { atom } from \"jotai\";\n\nexport const pageAtom = atom<\"template\" | \"brand\">(\"template\");\n", "import { Provider, useAtom, useAtomValue } from \"jotai\";\nimport { useEffect, memo } from \"react\";\nimport { getTenantAtom, publishTemplateAtom, saveTemplateAtom } from \"./api\";\nimport type { BasicProviderProps } from \"./Providers.types\";\nimport {\n apiUrlAtom,\n clientKeyAtom,\n editorStore,\n isTenantLoadingAtom,\n isTenantPublishingAtom,\n isTenantSavingAtom,\n tenantDataAtom,\n tenantErrorAtom,\n templateIdAtom,\n tenantIdAtom,\n tokenAtom,\n} from \"./store\";\n\n// Custom hooks\nexport function useTemplateActions() {\n const [, getTenant] = useAtom(getTenantAtom);\n const [, saveTemplate] = useAtom(saveTemplateAtom);\n const [, publishTemplate] = useAtom(publishTemplateAtom);\n const isTenantLoading = useAtomValue(isTenantLoadingAtom);\n const isTenantSaving = useAtomValue(isTenantSavingAtom);\n const isTenantPublishing = useAtomValue(isTenantPublishingAtom);\n const tenantError = useAtomValue(tenantErrorAtom);\n const tenantData = useAtomValue(tenantDataAtom);\n\n return {\n getTenant,\n saveTemplate,\n publishTemplate,\n isTenantLoading,\n isTenantSaving,\n isTenantPublishing,\n tenantError,\n tenantData,\n };\n}\n\n// Configuration provider component\ntype TemplateProviderProps = BasicProviderProps & {\n templateId: string;\n};\n\n// Internal component that uses atoms\nconst TemplateProviderContext: React.FC<TemplateProviderProps> = ({\n children,\n templateId,\n tenantId,\n token,\n clientKey,\n apiUrl,\n}) => {\n const [, setApiUrl] = useAtom(apiUrlAtom);\n const [, setToken] = useAtom(tokenAtom);\n const [, setTenantId] = useAtom(tenantIdAtom);\n const [, setId] = useAtom(templateIdAtom);\n const [, setClientKey] = useAtom(clientKeyAtom);\n\n // Set configuration on mount\n useEffect(() => {\n setToken(token);\n setTenantId(tenantId);\n setId(templateId);\n setClientKey(clientKey);\n if (apiUrl) {\n setApiUrl(apiUrl);\n }\n }, [\n token,\n tenantId,\n templateId,\n clientKey,\n apiUrl,\n setApiUrl,\n setToken,\n setTenantId,\n setId,\n setClientKey,\n ]);\n\n return <>{children}</>;\n};\n\nconst TemplateProviderComponent: React.FC<TemplateProviderProps> = (props) => {\n return (\n <Provider store={editorStore}>\n <TemplateProviderContext {...props} />\n </Provider>\n );\n};\n\nexport const TemplateProvider = memo(TemplateProviderComponent);\n", "import { atom } from \"jotai\";\nimport { toast } from \"sonner\";\nimport {\n isTenantPublishingAtom,\n isTenantSavingAtom,\n apiUrlAtom,\n // tenantDataAtom,\n tenantErrorAtom,\n tenantIdAtom,\n tokenAtom,\n} from \"../store\";\n\n// API response error type\ninterface ApiError {\n message: string;\n}\n\nexport const saveBrandAtom = atom(null, async (get, set, settings?: Record<string, unknown>) => {\n const apiUrl = get(apiUrlAtom);\n const token = get(tokenAtom);\n const tenantId = get(tenantIdAtom);\n\n if (!apiUrl) {\n set(tenantErrorAtom, \"Missing API URL\");\n toast.error(\"Missing API URL\");\n return;\n }\n\n set(isTenantSavingAtom, true);\n set(tenantErrorAtom, null);\n\n try {\n const response = await fetch(apiUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"x-courier-client-key\": `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query: `\n mutation SaveTenantBrand($input: SaveBrandSettingsInput!) {\n tenant {\n brand {\n updateSettings(input: $input) {\n success\n }\n }\n }\n }\n `,\n variables: {\n input: {\n tenantId,\n settings,\n },\n },\n }),\n });\n\n const responseData = await response.json();\n if (responseData.data) {\n // toast.success(\"Brand settings saved\");\n } else if (responseData.errors) {\n toast.error(responseData.errors?.map((error: ApiError) => error.message).join(\"\\n\"));\n } else {\n toast.error(\"Error saving brand settings\");\n }\n return responseData;\n } catch (error) {\n toast.error(\"Error saving brand settings\");\n set(tenantErrorAtom, error instanceof Error ? error.message : \"Unknown error\");\n throw error;\n } finally {\n set(isTenantSavingAtom, false);\n }\n});\n\nexport const publishBrandAtom = atom(null, async (get, set) => {\n const apiUrl = get(apiUrlAtom);\n const token = get(tokenAtom);\n const tenantId = get(tenantIdAtom);\n\n if (!apiUrl) {\n set(tenantErrorAtom, \"Missing API URL\");\n toast.error(\"Missing API URL\");\n return;\n }\n\n set(isTenantPublishingAtom, true);\n set(tenantErrorAtom, null);\n\n try {\n const response = await fetch(apiUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"x-courier-client-key\": `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query: `\n mutation PublishNotification($input: PublishBrandInput!) {\n tenant {\n brand {\n publish(input: $input) {\n success\n }\n }\n }\n }\n `,\n variables: {\n input: {\n tenantId,\n },\n },\n }),\n });\n\n const data = await response.json();\n const status = response.status;\n if (status === 200) {\n toast.success(\"Brand published\");\n } else {\n toast.error(\"Error publishing brand\");\n }\n return data;\n } catch (error) {\n toast.error(\"Error publishing brand\");\n set(tenantErrorAtom, error instanceof Error ? error.message : \"Unknown error\");\n throw error;\n } finally {\n set(isTenantPublishingAtom, false);\n }\n});\n", "import type { Editor } from \"@tiptap/react\";\nimport { atom, createStore } from \"jotai\";\nimport type { ElementalContent } from \"@/types/elemental.types\";\n\n// Define proper interfaces for our data types\n\nexport interface TenantData {\n data?: {\n tenant?: {\n tenantId?: string;\n name?: string;\n notification?: {\n createdAt?: string;\n notificationId?: string;\n version?: string;\n data?: {\n content?: ElementalContent;\n routing?: {\n method?: string;\n channels?: string[];\n [key: string]: unknown;\n };\n [key: string]: unknown;\n };\n [key: string]: unknown;\n };\n brand?: {\n brandId?: string;\n name?: string;\n settings?: {\n colors?: {\n primary?: string;\n secondary?: string;\n tertiary?: string;\n };\n email?: {\n header?: {\n barColor?: string;\n logo?: {\n href?: string;\n image?: string;\n };\n };\n footer?: {\n content?: string;\n markdown?: string | null;\n social?: {\n facebook?: { url?: string };\n instagram?: { url?: string };\n linkedin?: { url?: string };\n medium?: { url?: string };\n twitter?: { url?: string };\n };\n };\n };\n [key: string]: unknown;\n };\n [key: string]: unknown;\n };\n [key: string]: unknown;\n };\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\nexport const editorStore = createStore();\n\n// Configuration atoms\n// Environment variables are replaced at build time\nexport const apiUrlAtom = atom<string>(process.env.API_URL || \"\");\nexport const tokenAtom = atom<string>(\"\");\nexport const tenantIdAtom = atom<string>(\"\");\nexport const templateIdAtom = atom<string>(\"\");\nexport const clientKeyAtom = atom<string>(\"\");\n\n// Tenant status and data atoms\nexport const tenantDataAtom = atom<TenantData | null>(null);\nexport const isTenantLoadingAtom = atom<boolean | null>(null);\nexport const isTenantSavingAtom = atom<boolean | null>(null);\nexport const isTenantPublishingAtom = atom<boolean | null>(null);\nexport const tenantErrorAtom = atom<string | null>(null);\n// export const brandApplyAtom = atom<boolean>(false);\nexport const brandApplyAtom = atom<boolean>(true);\n\nexport const tenantEditorAtom = atom<Editor | null>(null);\n", "import { atom } from \"jotai\";\nimport { toast } from \"sonner\";\nimport {\n isTenantLoadingAtom,\n apiUrlAtom,\n tenantDataAtom,\n tenantErrorAtom,\n tenantIdAtom,\n tokenAtom,\n templateIdAtom,\n} from \"../store\";\n\nexport const getTenantAtom = atom(null, async (get, set, options?: { includeBrand?: boolean }) => {\n const apiUrl = get(apiUrlAtom);\n const token = get(tokenAtom);\n const tenantId = get(tenantIdAtom);\n const templateId = get(templateIdAtom);\n const includeBrand = options?.includeBrand ?? true; // Default to true for backward compatibility\n\n if (!apiUrl || !token || !tenantId) {\n set(tenantErrorAtom, \"Missing configuration\");\n toast.error(\"Missing configuration: \" + JSON.stringify({ apiUrl, token, tenantId }));\n return;\n }\n\n set(isTenantLoadingAtom, true);\n set(tenantErrorAtom, null);\n\n try {\n const response = await fetch(apiUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n \"x-courier-client-key\": `Bearer ${token}`,\n },\n body: JSON.stringify({\n query: `\n query GetTenant($tenantId: String!, $input: GetNotificationInput!, $brandInput: GetTenantBrandInput!, $includeBrand: Boolean!) {\n tenant(tenantId: $tenantId) {\n tenantId\n name\n notification(input: $input) {\n createdAt\n notificationId\n data {\n content\n routing\n }\n version\n }\n\n brand(input: $brandInput) @include(if: $includeBrand) {\n brandId\n name\n settings {\n colors {\n primary\n secondary\n tertiary\n }\n email {\n header {\n barColor\n logo {\n href\n image\n }\n }\n footer {\n markdown\n social {\n facebook {\n url\n }\n instagram {\n url\n }\n linkedin {\n url\n }\n medium {\n url\n }\n twitter {\n url\n }\n }\n }\n }\n }\n }\n }\n }\n `,\n variables: {\n tenantId,\n input: {\n notificationId: templateId,\n version: \"latest\",\n },\n brandInput: {\n version: \"latest\",\n },\n includeBrand,\n },\n }),\n });\n\n const data = await response.json();\n const status = response.status;\n\n if (data.data?.tenant) {\n set(tenantDataAtom, data);\n } else if (data.errors) {\n toast.error(data.errors?.map((error: { message: string }) => error.message).join(\"\\n\"));\n } else if (status === 401) {\n toast.error(\"Unauthorized\");\n } else {\n toast.error(\"Error fetching template\");\n }\n } catch (error) {\n toast.error(\"Error fetching template\");\n set(tenantErrorAtom, error instanceof Error ? error.message : \"Unknown error\");\n } finally {\n set(isTenantLoadingAtom, false);\n }\n});\n", "import type { TiptapDoc } from \"@/types\";\nimport { atom } from \"jotai\";\nimport { toast } from \"sonner\";\nimport { convertTiptapToElemental } from \"../../../lib/utils\";\nimport {\n isTenantPublishingAtom,\n isTenantSavingAtom,\n apiUrlAtom,\n tenantDataAtom,\n tenantEditorAtom,\n tenantErrorAtom,\n tenantIdAtom,\n tokenAtom,\n templateIdAtom,\n} from \"../store\";\nimport { subjectAtom } from \"@/components/TemplateEditor/store\";\n\n// Function atoms\nexport const saveTemplateAtom = atom(null, async (get, set) => {\n const apiUrl = get(apiUrlAtom);\n const token = get(tokenAtom);\n const tenantId = get(tenantIdAtom);\n const templateId = get(templateIdAtom);\n const tenantEditor = get(tenantEditorAtom);\n const subject = get(subjectAtom);\n\n if (!apiUrl) {\n set(tenantErrorAtom, \"Missing API URL\");\n toast.error(\"Missing API URL\");\n return;\n }\n\n set(isTenantSavingAtom, true);\n set(tenantErrorAtom, null);\n\n const data = {\n content: convertTiptapToElemental(tenantEditor?.getJSON() as TiptapDoc, subject ?? undefined),\n routing: {\n method: \"single\",\n channels: [\"email\"],\n },\n };\n\n try {\n const response = await fetch(apiUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"x-courier-client-key\": `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query: `\n mutation SaveNotification($input: SaveNotificationInput!) {\n tenant {\n notification {\n save(input: $input) {\n success\n }\n }\n }\n }\n `,\n variables: {\n input: {\n tenantId,\n notificationId: templateId,\n name: templateId,\n data,\n },\n },\n }),\n });\n\n const responseData = await response.json();\n // const status = response.status;\n if (responseData.data) {\n // @TODO: improve this\n // set(templateDataAtom, { data: { tenant: { notification: { data } } } });\n // toast.success(\"Template saved\");\n } else if (responseData.errors) {\n toast.error(\n responseData.errors?.map((error: { message: string }) => error.message).join(\"\\n\")\n );\n } else {\n toast.error(\"Error saving template\");\n }\n return responseData;\n } catch (error) {\n toast.error(\"Error saving template\");\n set(tenantErrorAtom, error instanceof Error ? error.message : \"Unknown error\");\n throw error;\n } finally {\n set(isTenantSavingAtom, false);\n }\n});\n\nexport const publishTemplateAtom = atom(null, async (get, set) => {\n const apiUrl = get(apiUrlAtom);\n const token = get(tokenAtom);\n const tenantId = get(tenantIdAtom);\n const templateId = get(templateIdAtom);\n const tenantData = get(tenantDataAtom);\n const version = tenantData?.data?.tenant?.notification?.version;\n\n if (!version) {\n toast.error(\"Version not defined\");\n return;\n }\n\n if (!apiUrl) {\n set(tenantErrorAtom, \"Missing API URL\");\n return;\n }\n\n set(isTenantPublishingAtom, true);\n set(tenantErrorAtom, null);\n\n try {\n const response = await fetch(apiUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"x-courier-client-key\": `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query: `\n mutation PublishNotification($input: PublishNotificationInput!) {\n tenant {\n notification {\n publish(input: $input) {\n success\n }\n }\n }\n }\n `,\n variables: {\n input: {\n tenantId,\n notificationId: templateId,\n version,\n },\n },\n }),\n });\n\n const data = await response.json();\n const status = response.status;\n if (status === 200) {\n toast.success(\"Template published\");\n } else {\n toast.error(\"Error publishing template\");\n }\n return data;\n } catch (error) {\n toast.error(\"Error publishing template\");\n set(tenantErrorAtom, error instanceof Error ? error.message : \"Unknown error\");\n throw error;\n } finally {\n set(isTenantPublishingAtom, false);\n }\n});\n", "import { atom } from \"jotai\";\nimport type { ElementalContent } from \"@/types/elemental.types\";\n\nexport const subjectAtom = atom<string | null>(null);\nexport const templateEditorContentAtom = atom<ElementalContent | undefined | null>(null);\n", "import { Provider, useAtom, useAtomValue } from \"jotai\";\nimport { useEffect, memo } from \"react\";\nimport { getTenantAtom, publishBrandAtom, saveBrandAtom } from \"./api\";\nimport type { BasicProviderProps } from \"./Providers.types\";\nimport {\n apiUrlAtom,\n clientKeyAtom,\n editorStore,\n isTenantLoadingAtom,\n isTenantPublishingAtom,\n isTenantSavingAtom,\n tenantDataAtom,\n tenantErrorAtom,\n tenantIdAtom,\n tokenAtom,\n} from \"./store\";\n// Custom hooks\nexport function useBrandActions() {\n const [, getTenant] = useAtom(getTenantAtom);\n const [, saveBrand] = useAtom(saveBrandAtom);\n const [, publishBrand] = useAtom(publishBrandAtom);\n const isTenantLoading = useAtomValue(isTenantLoadingAtom);\n const isTenantSaving = useAtomValue(isTenantSavingAtom);\n const isTenantPublishing = useAtomValue(isTenantPublishingAtom);\n const tenantError = useAtomValue(tenantErrorAtom);\n const tenantData = useAtomValue(tenantDataAtom);\n\n return {\n getTenant,\n saveBrand,\n publishBrand,\n isTenantLoading,\n isTenantSaving,\n isTenantPublishing,\n tenantError,\n tenantData,\n };\n}\n\n// Configuration provider component\ntype BrandProviderProps = BasicProviderProps;\n\n// Internal component that uses atoms\nconst BrandProviderContext: React.FC<BrandProviderProps> = ({\n children,\n tenantId,\n token,\n clientKey,\n apiUrl,\n}) => {\n const [, setApiUrl] = useAtom(apiUrlAtom);\n const [, setToken] = useAtom(tokenAtom);\n const [, setTenantId] = useAtom(tenantIdAtom);\n const [, setClientKey] = useAtom(clientKeyAtom);\n\n // Set configuration on mount\n useEffect(() => {\n setToken(token);\n setTenantId(tenantId);\n setClientKey(clientKey);\n if (apiUrl) {\n setApiUrl(apiUrl);\n }\n }, [token, tenantId, clientKey, apiUrl, setApiUrl, setToken, setTenantId, setClientKey]);\n\n return <>{children}</>;\n};\n\nconst BrandProviderComponent: React.FC<BrandProviderProps> = (props) => {\n return (\n <Provider store={editorStore}>\n <BrandProviderContext {...props} />\n </Provider>\n );\n};\n\nexport const BrandProvider = memo(BrandProviderComponent);\n", "import { mergeAttributes } from \"@tiptap/core\";\nimport { Blockquote as TiptapBlockquote } from \"@tiptap/extension-blockquote\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { generateNodeIds } from \"../../utils/generateNodeIds\";\nimport type { BlockquoteProps } from \"./Blockquote.types\";\nimport { BlockquoteComponentNode } from \"./BlockquoteComponent\";\n\nexport const defaultBlockquoteProps: BlockquoteProps = {\n paddingHorizontal: 8,\n paddingVertical: 6,\n backgroundColor: \"transparent\",\n borderLeftWidth: 4,\n borderColor: \"#e0e0e0\",\n};\n\nexport const Blockquote = TiptapBlockquote.extend({\n content: \"block+\",\n\n addOptions() {\n return {\n ...this.parent?.(),\n HTMLAttributes: {\n class: \"\",\n },\n };\n },\n\n onCreate() {\n generateNodeIds(this.editor, this.name);\n },\n\n addAttributes() {\n return {\n id: {\n default: undefined,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => ({\n \"data-id\": attributes.id,\n }),\n },\n paddingHorizontal: {\n default: defaultBlockquoteProps.paddingHorizontal,\n parseHTML: (element) => element.getAttribute(\"data-padding-horizontal\"),\n renderHTML: (attributes) => ({\n \"data-padding-horizontal\": attributes.paddingHorizontal,\n }),\n },\n paddingVertical: {\n default: defaultBlockquoteProps.paddingVertical,\n parseHTML: (element) => element.getAttribute(\"data-padding-vertical\"),\n renderHTML: (attributes) => ({\n \"data-padding-vertical\": attributes.paddingVertical,\n }),\n },\n backgroundColor: {\n default: defaultBlockquoteProps.backgroundColor,\n parseHTML: (element) => element.getAttribute(\"data-background-color\"),\n renderHTML: (attributes) => ({\n \"data-background-color\": attributes.backgroundColor,\n }),\n },\n borderLeftWidth: {\n default: defaultBlockquoteProps.borderLeftWidth,\n parseHTML: (element) => element.getAttribute(\"data-border-left-width\"),\n renderHTML: (attributes) => ({\n \"data-border-left-width\": attributes.borderLeftWidth,\n }),\n },\n borderColor: {\n default: defaultBlockquoteProps.borderColor,\n parseHTML: (element) => element.getAttribute(\"data-border-color\"),\n renderHTML: (attributes) => ({\n \"data-border-color\": attributes.borderColor,\n }),\n },\n };\n },\n\n parseHTML() {\n return [{ tag: \"blockquote\" }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"blockquote\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"blockquote\",\n \"data-id\": HTMLAttributes.id,\n }),\n 0,\n ];\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: ({ editor }) => {\n const { selection } = editor.state;\n const { empty } = selection;\n\n if (!empty) return false;\n\n const isInBlockquote = editor.isActive(\"blockquote\");\n const isInParagraph = editor.isActive(\"paragraph\");\n\n if (!isInParagraph || !isInBlockquote) return false;\n\n return editor\n .chain()\n .command(({ tr }) => {\n tr.split(selection.from);\n const pos = tr.selection.from;\n const $pos = tr.doc.resolve(pos);\n if ($pos.depth > 1) {\n const range = $pos.blockRange();\n if (range) {\n tr.lift(range, 0);\n }\n }\n return true;\n })\n .focus()\n .run();\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(BlockquoteComponentNode);\n },\n});\n\nexport default Blockquote;\n", "import { mergeAttributes, Node, wrappingInputRule } from '@tiptap/core'\n\nexport interface BlockquoteOptions {\n /**\n * HTML attributes to add to the blockquote element\n * @default {}\n * @example { class: 'foo' }\n */\n HTMLAttributes: Record<string, any>,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n blockQuote: {\n /**\n * Set a blockquote node\n */\n setBlockquote: () => ReturnType,\n /**\n * Toggle a blockquote node\n */\n toggleBlockquote: () => ReturnType,\n /**\n * Unset a blockquote node\n */\n unsetBlockquote: () => ReturnType,\n }\n }\n}\n\n/**\n * Matches a blockquote to a `>` as input.\n */\nexport const inputRegex = /^\\s*>\\s$/\n\n/**\n * This extension allows you to create blockquotes.\n * @see https://tiptap.dev/api/nodes/blockquote\n */\nexport const Blockquote = Node.create<BlockquoteOptions>({\n\n name: 'blockquote',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n }\n },\n\n content: 'block+',\n\n group: 'block',\n\n defining: true,\n\n parseHTML() {\n return [\n { tag: 'blockquote' },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['blockquote', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n setBlockquote: () => ({ commands }) => {\n return commands.wrapIn(this.name)\n },\n toggleBlockquote: () => ({ commands }) => {\n return commands.toggleWrap(this.name)\n },\n unsetBlockquote: () => ({ commands }) => {\n return commands.lift(this.name)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-b': () => this.editor.commands.toggleBlockquote(),\n }\n },\n\n addInputRules() {\n return [\n wrappingInputRule({\n find: inputRegex,\n type: this.type,\n }),\n ]\n },\n})\n", "import { v4 as uuidv4 } from \"uuid\";\nimport type { Editor } from \"@tiptap/core\";\n\n/**\n * Utility function to generate unique IDs for nodes that don't have them\n * @param editor The Tiptap editor instance\n * @param nodeName The name of the node type to assign IDs to\n * @returns void\n */\nexport function generateNodeIds(editor: Editor, nodeName: string): void {\n const transaction = editor.state.tr;\n let needsUpdate = false;\n\n editor.state.doc.descendants((node, pos) => {\n if (node.type.name === nodeName && !node.attrs.id) {\n const id = `node-${uuidv4()}`;\n transaction.setNodeMarkup(pos, undefined, { ...node.attrs, id });\n needsUpdate = true;\n }\n return false; // Don't need to go deeper\n });\n\n if (needsUpdate) {\n editor.view.dispatch(transaction);\n }\n}\n", "import { cn } from \"@/lib\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { forwardRef } from \"react\";\n\nexport type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"tertiary\"\n | \"quaternary\"\n | \"outline\"\n | \"ghost\"\n | \"link\";\n\nexport type ButtonSize = \"medium\" | \"small\" | \"icon\" | \"iconSmall\";\n\nconst buttonVariants = cva(\n \"courier-flex courier-group courier-items-center courier-justify-center courier-border courier-border-transparent courier-gap-2 courier-text-sm courier-font-semibold courier-rounded-md disabled:courier-opacity-50 courier-whitespace-nowrap courier-outline-none\",\n {\n variants: {\n variant: {\n primary:\n \"courier-text-white courier-bg-[#3B82F6] courier-border-[#3B82F6] dark:courier-text-foreground dark:courier-bg-white dark:courier-border-white\",\n secondary: \"courier-text-foreground courier-bg-[#F5F5F5]\",\n tertiary:\n \"courier-bg-neutral-50 courier-text-foreground dark:courier-bg-foreground dark:courier-text-white dark:courier-border-foreground\",\n quaternary:\n \"courier-bg-transparent courier-border-transparent courier-text-neutral-500 dark:courier-text-neutral-400\",\n ghost: \"hover:courier-bg-accent hover:courier-text-accent-foreground\",\n link: \"courier-text-foreground !courier-font-normal hover:courier-text-accent-foreground !courier-p-0 courier-border-none\",\n outline:\n \"!courier-border-border courier-text-foreground dark:courier-text-white dark:courier-border-foreground hover:courier-bg-neutral-100 dark:hover:courier-bg-neutral-800\",\n },\n size: {\n medium: \"courier-py-2 courier-px-3\",\n small: \"courier-py-1 courier-px-2\",\n icon: \"courier-w-8 courier-h-8\",\n iconSmall: \"courier-w-6 courier-h-6\",\n },\n active: {\n true: \"\",\n false: \"\",\n },\n disabled: {\n true: \"\",\n false: \"\",\n },\n },\n compoundVariants: [\n {\n variant: \"primary\",\n disabled: false,\n active: false,\n class:\n \"hover:courier-bg-neutral-800 active:courier-bg-neutral-900 dark:hover:courier-bg-neutral-200 dark:active:courier-bg-neutral-300\",\n },\n {\n variant: \"primary\",\n active: true,\n class: \"courier-bg-neutral-900 dark:courier-bg-neutral-300\",\n },\n {\n variant: \"secondary\",\n disabled: false,\n active: false,\n class:\n \"hover:courier-bg-neutral-100 active:courier-bg-neutral-200 dark:hover:courier-bg-neutral-900 dark:active:courier-bg-neutral-800\",\n },\n {\n variant: \"secondary\",\n active: true,\n class: \"courier-bg-neutral-200 dark:courier-bg-neutral-800\",\n },\n {\n variant: \"tertiary\",\n disabled: false,\n active: false,\n class:\n \"hover:courier-bg-neutral-100 active:courier-bg-neutral-200 dark:hover:courier-bg-neutral-800 dark:active:courier-bg-neutral-700\",\n },\n {\n variant: \"tertiary\",\n active: true,\n class: \"courier-bg-neutral-200 dark:courier-bg-neutral-800\",\n },\n {\n variant: \"ghost\",\n disabled: false,\n active: false,\n class:\n \"hover:courier-bg-black/5 hover:courier-text-neutral-700 active:courier-bg-black/10 active:courier-text-neutral-800 dark:hover:courier-bg-white/10 dark:hover:courier-text-neutral-300 dark:active:courier-text-neutral-200\",\n },\n {\n variant: \"ghost\",\n active: true,\n class:\n \"courier-bg-accent courier-text-accent-foreground [&_svg]:courier-text-accent-foreground dark:courier-bg-white/20 dark:courier-text-neutral-200\",\n },\n ],\n }\n);\n\nexport interface ButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n variant?: ButtonVariant;\n active?: boolean;\n disabled?: boolean;\n buttonSize?: ButtonSize;\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n active,\n buttonSize = \"medium\", // @TODO: rename it\n disabled,\n variant = \"primary\",\n className,\n asChild = false,\n ...rest\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n ref={ref}\n disabled={disabled}\n className={cn(buttonVariants({ variant, size: buttonSize, disabled, active }), className)}\n {...rest}\n />\n );\n }\n);\n\nButton.displayName = \"Button\";\n", "import { cn } from \"@/lib\";\nimport { forwardRef } from \"react\";\n\nexport type DividerProps = React.ComponentProps<\"hr\">;\n\nexport const Divider = forwardRef<HTMLHRElement, DividerProps>((props, ref) => (\n <hr\n {...props}\n ref={ref}\n className={cn(\n \"courier-my-1 courier-border-border dark:courier-border-neutral-800\",\n props.className\n )}\n />\n));\n\nDivider.displayName = \"Divider\";\n", "import * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronRight, Circle } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"courier-flex courier-cursor-default courier-gap-2 courier-select-none courier-items-center courier-rounded-sm courier-px-2 courier-py-1.5 courier-text-sm courier-outline-none focus:courier-bg-accent data-[state=open]:courier-bg-accent [&_svg]:courier-pointer-events-none [&_svg]:courier-size-4 [&_svg]:courier-shrink-0\",\n inset && \"courier-pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"courier-ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"courier-z-50 courier-min-w-[8rem] courier-overflow-hidden courier-rounded-md courier-border courier-bg-popover courier-p-1 courier-text-popover-foreground courier-shadow-lg data-[state=open]:courier-animate-in data-[state=closed]:courier-animate-out data-[state=closed]:courier-fade-out-0 data-[state=open]:courier-fade-in-0 data-[state=closed]:courier-zoom-out-95 data-[state=open]:courier-zoom-in-95 data-[side=bottom]:courier-slide-in-from-top-2 data-[side=left]:courier-slide-in-from-right-2 data-[side=right]:courier-slide-in-from-left-2 data-[side=top]:courier-slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> & {\n portalProps?: React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Portal>;\n }\n>(({ className, sideOffset = 4, portalProps, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal {...portalProps}>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"courier-z-50 courier-min-w-[8rem] courier-overflow-hidden courier-rounded-md courier-border courier-bg-popover courier-p-1 courier-text-popover-foreground courier-shadow-md\",\n \"data-[state=open]:courier-animate-in data-[state=closed]:courier-animate-out data-[state=closed]:courier-fade-out-0 data-[state=open]:courier-fade-in-0 data-[state=closed]:courier-zoom-out-95 data-[state=open]:courier-zoom-in-95 data-[side=bottom]:courier-slide-in-from-top-2 data-[side=left]:courier-slide-in-from-right-2 data-[side=right]:courier-slide-in-from-left-2 data-[side=top]:courier-slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"courier-relative courier-flex courier-cursor-default courier-select-none courier-items-center courier-gap-2 courier-rounded-sm courier-px-2 courier-py-1.5 courier-text-sm courier-outline-none focus:courier-bg-accent focus:courier-text-foreground data-[disabled]:courier-pointer-events-none data-[disabled]:courier-opacity-50 [&>svg]:courier-size-4 [&>svg]:courier-shrink-0\",\n inset && \"courier-pl-8\",\n className\n )}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"courier-relative courier-flex courier-cursor-default courier-select-none courier-items-center courier-rounded-sm courier-py-1.5 courier-pl-8 courier-pr-2 courier-text-sm courier-outline-none focus:courier-bg-accent focus:courier-text-accent-foreground data-[disabled]:courier-pointer-events-none data-[disabled]:courier-opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"courier-absolute courier-left-2 courier-flex courier-h-3.5 courier-w-3.5 courier-items-center courier-justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"courier-h-4 courier-w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"courier-relative courier-flex courier-cursor-default courier-select-none courier-items-center courier-rounded-sm courier-py-1.5 courier-pl-8 courier-pr-2 courier-text-sm courier-outline-none focus:courier-bg-accent focus:courier-text-accent-foreground data-[disabled]:courier-pointer-events-none data-[disabled]:courier-opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"courier-absolute courier-left-2 courier-flex courier-h-3.5 courier-w-3.5 courier-items-center courier-justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"courier-h-2 courier-w-2 courier-fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"courier-px-2 courier-py-1.5 courier-text-sm courier-font-semibold\",\n inset && \"courier-pl-8\",\n className\n )}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"courier-mx-1 courier-my-1 courier-h-px courier-bg-muted\", className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"courier-ml-auto courier-text-xs courier-tracking-widest courier-opacity-60\",\n className\n )}\n {...props}\n />\n );\n};\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n};\n", "import type * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport {\n Controller,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n FormProvider,\n useFormContext,\n} from \"react-hook-form\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Label } from \"../Label\";\n\nconst Form = FormProvider;\n\ninterface FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n name: TName;\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>({} as FormFieldContextValue);\n\nconst FormField = <\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n );\n};\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext);\n const itemContext = React.useContext(FormItemContext);\n const { getFieldState, formState } = useFormContext();\n\n const fieldState = getFieldState(fieldContext.name, formState);\n\n if (!fieldContext) {\n throw new Error(\"useFormField should be used within <FormField>\");\n }\n\n const { id } = itemContext;\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n };\n};\n\ninterface FormItemContextValue {\n id: string;\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue);\n\nconst FormItem = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const id = React.useId();\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div ref={ref} className={cn(\"courier-space-y-2\", className)} {...props} />\n </FormItemContext.Provider>\n );\n }\n);\nFormItem.displayName = \"FormItem\";\n\nconst FormLabel = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => {\n const { error, formItemId } = useFormField();\n\n return (\n <Label\n ref={ref}\n className={cn(error && \"courier-text-destructive\", className)}\n htmlFor={formItemId}\n {...props}\n />\n );\n});\nFormLabel.displayName = \"FormLabel\";\n\nconst FormControl = React.forwardRef<\n React.ElementRef<typeof Slot>,\n React.ComponentPropsWithoutRef<typeof Slot>\n>(({ ...props }, ref) => {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField();\n\n return (\n <Slot\n ref={ref}\n id={formItemId}\n aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n );\n});\nFormControl.displayName = \"FormControl\";\n\nconst FormDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField();\n\n return (\n <p\n ref={ref}\n id={formDescriptionId}\n className={cn(\"courier-text-[0.8rem] courier-text-muted-foreground\", className)}\n {...props}\n />\n );\n});\nFormDescription.displayName = \"FormDescription\";\n\nconst FormMessage = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, children, ...props }, ref) => {\n const { error, formMessageId } = useFormField();\n const body = error ? String(error?.message) : children;\n\n if (!body) {\n return null;\n }\n\n return (\n <p\n ref={ref}\n id={formMessageId}\n className={cn(\n \"courier-text-[0.8rem] courier-font-medium courier-text-destructive\",\n className\n )}\n {...props}\n >\n {body}\n </p>\n );\n});\nFormMessage.displayName = \"FormMessage\";\n\nexport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n useFormField,\n};\n", "\"use client\";\n\nimport { cn } from \"@/lib\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nconst labelVariants = cva(\n \"courier-text-sm courier-font-medium courier-leading-none peer-disabled:courier-cursor-not-allowed peer-disabled:courier-opacity-70\"\n);\n\nexport type LabelProps = React.ComponentProps<typeof LabelPrimitive.Root>;\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n LabelProps & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root ref={ref} className={cn(labelVariants(), className)} {...props} />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n", "import { cn } from \"@/lib\";\nimport * as React from \"react\";\n\nexport interface InputProps\n extends Omit<React.ComponentProps<\"input\">, \"startAdornment\" | \"endAdornment\"> {\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, startAdornment, endAdornment, ...props }, ref) => {\n return (\n <div className=\"courier-relative courier-flex courier-w-full courier-items-center\">\n {startAdornment && (\n <div className=\"courier-absolute courier-left-2 courier-flex courier-items-center courier-pointer-events-none\">\n {startAdornment}\n </div>\n )}\n <input\n type={type}\n className={cn(\n \"courier-flex courier-w-full courier-rounded-md courier-border-none courier-bg-secondary courier-text-secondary-foreground courier-p-1.5 courier-text-base file:courier-border-0 file:courier-bg-transparent file:courier-text-sm file:courier-font-medium file:courier-text-foreground placeholder:courier-text-muted-foreground focus-visible:courier-outline-none disabled:courier-cursor-not-allowed disabled:courier-opacity-50 md:courier-text-sm\",\n startAdornment && \"courier-pl-8\",\n endAdornment && \"courier-pr-8\",\n className\n )}\n ref={ref}\n {...props}\n />\n {endAdornment && (\n <div className=\"courier-absolute courier-right-2 courier-flex courier-items-center courier-pointer-events-none\">\n {endAdornment}\n </div>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\n", "import { cn } from \"@/lib/utils\";\nimport { forwardRef, useRef, useMemo } from \"react\";\nimport { Input } from \"../Input\";\nimport { ColorPicker } from \"./ColorPicker\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../Popover\";\n\nexport const TRANSPARENT_PATTERN =\n \"bg-[url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOCAwSDBWOEg4VjBaIiBmaWxsPSIjRDlEOUQ5Ii8+PHBhdGggZD0iTTE2IDhIOFYxNkgxNlY4WiIgZmlsbD0iI0Q5RDlEOSIvPjwvc3ZnPg==')]\";\n\nexport const DEFAULT_PRESET_COLORS = [\n \"#ef4444\", // red\n \"#f97316\", // orange\n \"#eab308\", // yellow\n \"#22c55e\", // green\n \"#14b8a6\", // teal\n \"#06b6d4\", // cyan\n \"#3b82f6\", // blue\n \"#6366f1\", // indigo\n \"#8b5cf6\", // violet\n \"#000000\", // black\n \"#525252\", // gray\n \"#a3a3a3\", // light gray\n \"#ffffff\", // white\n \"transparent\", // transparent\n];\n\ntype InputColorProps = Omit<React.ComponentProps<\"input\">, \"onChange\" | \"value\"> & {\n value?: string;\n onChange: (value: string) => void;\n className?: string;\n defaultValue?: string;\n transparent?: boolean;\n presetColors?: string[];\n};\n\nexport const InputColor = forwardRef<HTMLInputElement, InputColorProps>(\n (\n {\n className,\n value = \"\",\n onChange,\n defaultValue,\n transparent = true,\n presetColors = DEFAULT_PRESET_COLORS,\n ...props\n },\n ref\n ) => {\n const showPreview = value !== \"transparent\";\n const containerRef = useRef<HTMLDivElement>(null);\n\n const filteredPresetColors = useMemo(() => {\n if (!transparent) {\n return presetColors.filter((color) => color !== \"transparent\");\n }\n return presetColors;\n }, [presetColors, transparent]);\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <div className=\"courier-relative courier-flex courier-items-center\" ref={containerRef}>\n <div\n className={cn(\n \"courier-absolute courier-left-2 courier-flex courier-h-4 courier-w-4 courier-cursor-pointer courier-items-center courier-justify-center courier-rounded-md courier-border courier-border-input courier-transition-colors courier-z-10\",\n showPreview ? \"\" : TRANSPARENT_PATTERN\n )}\n style={{ backgroundColor: showPreview ? value : undefined }}\n />\n <Input\n {...props}\n ref={ref}\n readOnly\n type=\"text\"\n value={value === \"transparent\" ? \"Transparent\" : value}\n className={cn(\"courier-relative courier-cursor-pointer courier-pl-8\", className)}\n />\n </div>\n </PopoverTrigger>\n <PopoverContent\n portalProps={{ container: containerRef?.current || undefined }}\n className=\"courier-w-[230px]\"\n >\n <ColorPicker\n color={value}\n onChange={onChange}\n presetColors={filteredPresetColors}\n defaultValue={defaultValue}\n />\n </PopoverContent>\n </Popover>\n );\n }\n);\n\nInputColor.displayName = \"InputColor\";\n", "import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { Input } from \"../Input\";\nimport { Divider } from \"../Divider\";\nimport { TRANSPARENT_PATTERN } from \"./InputColor\";\nimport { CircleX } from \"lucide-react\";\n\ninterface ColorPickerProps {\n color: string;\n onChange: (color: string) => void;\n className?: string;\n presetColors: string[];\n defaultValue?: string;\n}\n\nconst isValidHex = (color: string) => {\n return color === \"transparent\" || /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(color);\n};\n\nexport const ColorPicker = ({\n color,\n onChange,\n className,\n presetColors,\n defaultValue = \"transparent\",\n}: ColorPickerProps) => {\n const [hsv, setHsv] = useState(() => hexToHsv(color));\n const [inputValue, setInputValue] = useState(color);\n const gradientRef = useRef<HTMLDivElement>(null);\n const hueRef = useRef<HTMLDivElement>(null);\n const isDragging = useRef<\"gradient\" | \"hue\" | null>(null);\n const isInternalChange = useRef(false);\n\n const showReset = color !== defaultValue;\n\n const updateColor = useCallback(\n (newHsv: typeof hsv) => {\n isInternalChange.current = true;\n const newColor = hsvToHex(newHsv);\n setInputValue(newColor);\n onChange(newColor);\n isInternalChange.current = false;\n },\n [onChange]\n );\n\n const handleMouseDown = (type: \"gradient\" | \"hue\") => (e: React.MouseEvent) => {\n isDragging.current = type;\n handleMouseMove(e);\n };\n\n const handleMouseMove = useCallback(\n (e: MouseEvent | React.MouseEvent) => {\n if (!isDragging.current) return;\n\n if (isDragging.current === \"gradient\" && gradientRef.current) {\n const rect = gradientRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const y = Math.max(0, Math.min(1, (e.clientY - rect.top) / rect.height));\n const newHsv = { ...hsv, s: x * 100, v: (1 - y) * 100 };\n setHsv(newHsv);\n updateColor(newHsv);\n } else if (isDragging.current === \"hue\" && hueRef.current) {\n const rect = hueRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const newHsv = { ...hsv, h: x * 360 };\n setHsv(newHsv);\n updateColor(newHsv);\n }\n },\n [hsv, updateColor]\n );\n\n const handleMouseUp = useCallback(() => {\n isDragging.current = null;\n }, []);\n\n useEffect(() => {\n if (isDragging.current) {\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }\n }, [handleMouseMove, handleMouseUp]);\n\n useEffect(() => {\n if (!isInternalChange.current) {\n setHsv(hexToHsv(color));\n setInputValue(color);\n }\n }, [color]);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setInputValue(value);\n if (isValidHex(value)) {\n const newHsv = hexToHsv(value);\n setHsv(newHsv);\n updateColor(newHsv);\n }\n };\n\n return (\n <div className={cn(\"w-full\", className)}>\n <div\n ref={gradientRef}\n className=\"courier-relative courier-h-[160px] courier-w-full courier-cursor-crosshair courier-rounded-lg\"\n style={{\n backgroundColor: `hsl(${hsv.h}, 100%, 50%)`,\n backgroundImage:\n \"linear-gradient(to top, #000, transparent), linear-gradient(to right, #fff, transparent)\",\n }}\n onMouseDown={handleMouseDown(\"gradient\")}\n >\n <div\n className=\"courier-absolute courier-h-3 courier-w-3 courier-translate-x-[-50%] courier-translate-y-[-50%] courier-rounded-full courier-border-2 courier-border-white\"\n style={{\n left: `${hsv.s}%`,\n top: `${100 - hsv.v}%`,\n }}\n />\n </div>\n\n <div\n ref={hueRef}\n className=\"courier-relative courier-mt-2 courier-h-3 courier-w-full courier-cursor-pointer courier-rounded\"\n style={{\n background: \"linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00)\",\n }}\n onMouseDown={handleMouseDown(\"hue\")}\n >\n <div\n className=\"courier-absolute courier-h-full courier-w-1 courier-translate-x-[-50%] courier-rounded courier-border courier-border-input courier-bg-background\"\n style={{ left: `${(hsv.h / 360) * 100}%` }}\n />\n </div>\n\n <div className=\"courier-mt-3 courier-relative courier-flex courier-items-center\">\n <Input\n value={inputValue}\n onChange={handleInputChange}\n placeholder=\"#000000\"\n className=\"courier-flex-1\"\n />\n {showReset && (\n <button\n onClick={(event) => {\n event.preventDefault();\n\n if (defaultValue === \"transparent\") {\n onChange(\"transparent\");\n setInputValue(\"transparent\");\n setHsv({ h: 0, s: 0, v: 0 });\n return;\n }\n const newHsv = hexToHsv(defaultValue);\n setHsv(newHsv);\n updateColor(newHsv);\n }}\n className=\"courier-absolute courier-right-3 courier-flex courier-cursor-pointer courier-items-center courier-justify-center courier-transition-colors\"\n >\n <CircleX size={14} strokeWidth={1.25} />\n </button>\n )}\n </div>\n\n <Divider className=\"courier-my-3\" />\n\n <div className=\"courier-flex courier-flex-wrap courier-gap-1\">\n {presetColors.map((presetColor) => (\n <button\n key={presetColor}\n className={cn(\n \"courier-h-6 courier-w-6 courier-rounded-md courier-border courier-border-input courier-shrink-0\",\n presetColor === \"transparent\" && TRANSPARENT_PATTERN\n )}\n style={{ backgroundColor: presetColor === \"transparent\" ? undefined : presetColor }}\n onClick={(event) => {\n event.preventDefault();\n if (presetColor === \"transparent\") {\n onChange(\"transparent\");\n setInputValue(\"transparent\");\n setHsv({ h: 0, s: 0, v: 0 });\n return;\n }\n const newHsv = hexToHsv(presetColor);\n setHsv(newHsv);\n updateColor(newHsv);\n }}\n />\n ))}\n </div>\n </div>\n );\n};\n\n// Color conversion utilities\nfunction hexToHsv(hex: string): { h: number; s: number; v: number } {\n // Default to black if transparent\n if (hex === \"transparent\") {\n return { h: 0, s: 0, v: 0 };\n }\n\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const d = max - min;\n\n let h = 0;\n const s = max === 0 ? 0 : d / max;\n const v = max;\n\n if (max !== min) {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return { h: h * 360, s: s * 100, v: v * 100 };\n}\n\nfunction hsvToHex({ h, s, v }: { h: number; s: number; v: number }): string {\n s /= 100;\n v /= 100;\n h = (h % 360) / 360;\n\n const f = (n: number) => {\n const k = (n + h * 6) % 6;\n return v - v * s * Math.max(0, Math.min(k, 4 - k, 1));\n };\n\n const r = Math.round(f(5) * 255);\n const g = Math.round(f(3) * 255);\n const b = Math.round(f(1) * 255);\n\n return `#${[r, g, b].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n", "import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> & {\n portalProps?: React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Portal>;\n }\n>(({ className, align = \"center\", sideOffset = 4, portalProps, ...props }, ref) => (\n <PopoverPrimitive.Portal {...portalProps}>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"courier-z-50 courier-w-72 courier-rounded-md courier-border courier-bg-popover courier-p-4 courier-text-popover-foreground courier-shadow-md courier-outline-none data-[state=open]:courier-animate-in data-[state=closed]:courier-animate-out data-[state=closed]:courier-fade-out-0 data-[state=open]:courier-fade-in-0 data-[state=closed]:courier-zoom-out-95 data-[state=open]:courier-zoom-in-95 data-[side=bottom]:courier-slide-in-from-top-2 data-[side=left]:courier-slide-in-from-right-2 data-[side=right]:courier-slide-in-from-left-2 data-[side=top]:courier-slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };\n", "import * as React from \"react\";\nimport * as SliderPrimitive from \"@radix-ui/react-slider\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst Slider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n className={cn(\n \"courier-relative courier-flex courier-w-full courier-touch-none courier-select-none courier-items-center\",\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track className=\"courier-relative courier-h-1.5 courier-w-full courier-grow courier-overflow-hidden courier-rounded-full courier-bg-secondary\">\n <SliderPrimitive.Range className=\"courier-absolute courier-h-full courier-bg-accent-foreground\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"courier-block courier-h-4 courier-w-4 courier-rounded-full courier-bg-accent-foreground courier-shadow courier-transition-colors focus-visible:courier-outline-none focus-visible:courier-ring-1 focus-visible:courier-ring-ring disabled:courier-pointer-events-none disabled:courier-opacity-50\" />\n </SliderPrimitive.Root>\n));\nSlider.displayName = SliderPrimitive.Root.displayName;\n\nexport { Slider };\n", "import * as React from \"react\";\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n \"courier-peer courier-inline-flex courier-h-5 courier-w-9 courier-shrink-0 courier-cursor-pointer courier-items-center courier-rounded-full courier-border-2 courier-border-transparent courier-shadow-sm courier-transition-colors focus-visible:courier-outline-none focus-visible:courier-ring-2 focus-visible:courier-ring-ring focus-visible:courier-ring-offset-2 focus-visible:courier-ring-offset-background disabled:courier-cursor-not-allowed disabled:courier-opacity-50 data-[state=checked]:courier-bg-accent-foreground data-[state=unchecked]:courier-bg-input\",\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n \"courier-pointer-events-none courier-block courier-h-4 courier-w-4 courier-rounded-full courier-bg-background courier-shadow-lg courier-ring-0 courier-transition-transform data-[state=checked]:courier-translate-x-4 data-[state=unchecked]:courier-translate-x-0\"\n )}\n />\n </SwitchPrimitives.Root>\n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\n", "import * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst Tabs = TabsPrimitive.Root;\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"courier-inline-flex courier-h-9 courier-items-center courier-justify-center courier-rounded-md courier-border courier-border-border courier-bg-background courier-p-[3px] courier-text-muted-foreground\",\n className\n )}\n {...props}\n />\n));\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"courier-inline-flex courier-items-center courier-justify-center courier-whitespace-nowrap courier-rounded-sm courier-px-3 courier-py-1 courier-text-sm courier-font-medium courier-ring-offset-background courier-transition-all focus-visible:courier-outline-none disabled:courier-pointer-events-none disabled:courier-opacity-50 data-[state=active]:courier-bg-accent data-[state=active]:courier-text-accent-foreground\",\n className\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"courier-mt-2 courier-ring-offset-background focus-visible:courier-outline-none focus-visible:courier-ring-2 focus-visible:courier-ring-ring focus-visible:courier-ring-offset-2\",\n className\n )}\n {...props}\n />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n", "import { cn } from \"@/lib/utils\";\nimport * as React from \"react\";\n\nexport interface TextareaProps extends React.ComponentProps<\"textarea\"> {\n autoResize?: boolean;\n}\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, autoResize = false, ...props }, ref) => {\n const textareaRef = React.useRef<HTMLTextAreaElement | null>(null);\n const combinedRef = (node: HTMLTextAreaElement) => {\n textareaRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n };\n\n React.useEffect(() => {\n if (!autoResize) return;\n\n const textarea = textareaRef.current;\n if (!textarea) return;\n\n const adjustHeight = () => {\n textarea.style.height = \"auto\";\n textarea.style.height = `${textarea.scrollHeight}px`;\n };\n\n adjustHeight();\n textarea.addEventListener(\"input\", adjustHeight);\n\n return () => {\n textarea.removeEventListener(\"input\", adjustHeight);\n };\n }, [autoResize]);\n\n return (\n <textarea\n className={cn(\n \"courier-flex courier-min-h-[44px] courier-w-full courier-rounded-md courier-border-none courier-bg-secondary courier-text-secondary-foreground courier-p-1.5 courier-text-base courier-placeholder:courier-text-muted-foreground focus-visible:courier-outline-none disabled:courier-cursor-not-allowed disabled:courier-opacity-50 md:courier-text-sm\",\n autoResize && \"courier-resize-none\",\n className\n )}\n ref={combinedRef}\n {...props}\n />\n );\n }\n);\n\nTextarea.displayName = \"Textarea\";\n", "import { cn } from \"@/lib\";\nimport type { ReactNode } from \"react\";\nimport { useContext } from \"react\";\nimport { ThemeContext } from \"./ThemeContext\";\nimport type { Theme } from \"./ThemeProvider.types\";\nimport { defaultTheme } from \"./ThemeProvider.types\";\n\ninterface ThemeProviderProps {\n children: ReactNode;\n theme?: Theme | string;\n}\n\nexport const ThemeProvider = ({ children, theme = defaultTheme }: ThemeProviderProps) => {\n const themeContextProps =\n typeof theme === \"string\" ? defaultTheme : { ...defaultTheme, ...theme };\n\n const cssVars =\n typeof theme === \"string\"\n ? {}\n : Object.entries(theme).reduce((acc, [key, value]) => {\n const kebabCase = key.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n return {\n ...acc,\n [`--${kebabCase}`]: value,\n };\n }, {});\n\n return (\n <ThemeContext.Provider value={themeContextProps}>\n <div style={cssVars} className={cn(typeof theme === \"string\" ? theme : \"\", \"lightTheme\")}>\n {children}\n </div>\n </ThemeContext.Provider>\n );\n};\n\nexport const useTheme = () => useContext(ThemeContext);\n", "import { createContext } from \"react\";\nimport type { Theme } from \"./ThemeProvider.types\";\nimport { defaultTheme } from \"./ThemeProvider.types\";\n\nexport const ThemeContext = createContext<Theme>(defaultTheme);\n", "export interface Theme {\n background?: string;\n foreground?: string;\n muted?: string;\n mutedForeground?: string;\n popover?: string;\n popoverForeground?: string;\n border?: string;\n input?: string;\n card?: string;\n cardForeground?: string;\n primary?: string;\n primaryForeground?: string;\n secondary?: string;\n secondaryForeground?: string;\n accent?: string;\n accentForeground?: string;\n destructive?: string;\n destructiveForeground?: string;\n ring?: string;\n radius?: string;\n}\n\nexport const defaultTheme: Theme = {\n background: \"#ffffff\",\n foreground: \"#292929\",\n muted: \"#D9D9D9\",\n mutedForeground: \"#A3A3A3\",\n popover: \"#ffffff\",\n popoverForeground: \"#292929\",\n border: \"#DCDEE4\",\n input: \"#DCDEE4\",\n card: \"#FAF9F8\",\n cardForeground: \"#292929\",\n primary: \"#ffffff\",\n primaryForeground: \"#696F8C\",\n secondary: \"#F5F5F5\",\n secondaryForeground: \"#171717\",\n accent: \"#E5F3FF\",\n accentForeground: \"#1D4ED8\",\n destructive: \"#292929\",\n destructiveForeground: \"#FF3363\",\n ring: \"#80849D\",\n radius: \"6px\",\n};\n", "import * as React from \"react\";\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst toggleVariants = cva(\n \"courier-inline-flex courier-items-center courier-justify-center courier-gap-2 courier-rounded-md courier-text-sm courier-font-medium courier-transition-colors hover:courier-bg-secondary hover:courier-text-foreground focus-visible:courier-outline-none focus-visible:courier-ring-1 focus-visible:courier-ring-ring disabled:courier-pointer-events-none disabled:courier-opacity-50 data-[state=on]:courier-bg-accent data-[state=on]:courier-text-accent-foreground [&_svg]:courier-pointer-events-none [&_svg]:courier-size-[30px] [&_svg]:courier-shrink-0\",\n {\n variants: {\n variant: {\n default: \"courier-bg-transparent\",\n outline:\n \"courier-border courier-border-input courier-bg-transparent courier-shadow-sm hover:courier-bg-accent hover:courier-text-accent-foreground\",\n },\n size: {\n default: \"courier-h-9 courier-min-w-9\",\n sm: \"courier-h-8 courier-px-1.5 courier-min-w-8\",\n lg: \"courier-h-10 courier-px-2.5 courier-min-w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n));\n\nToggle.displayName = TogglePrimitive.Root.displayName;\n\nexport { Toggle, toggleVariants };\n", "import { cn } from \"@/lib/utils\";\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\";\nimport { type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { toggleVariants } from \"../Toggle\";\n\nconst ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants>>({\n size: \"default\",\n variant: \"default\",\n});\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, children, ...props }, ref) => (\n <ToggleGroupPrimitive.Root\n ref={ref}\n className={cn(\n \"courier-flex courier-items-center courier-justify-center courier-gap-1\",\n className\n )}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>{children}</ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n));\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext);\n\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n );\n});\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;\n\nexport { ToggleGroup, ToggleGroupItem };\n", "import { cn } from \"@/lib/utils\";\n\nexport interface IconProps extends React.SVGProps<SVGSVGElement> {\n active?: boolean;\n color?: string;\n}\n\nexport interface PathProps\n extends React.SVGProps<SVGPathElement>,\n Pick<IconProps, \"active\" | \"color\"> {\n colorProp?: \"stroke\" | \"fill\";\n}\n\nexport const Path = ({ colorProp, color, active, className, ...props }: PathProps) =>\n colorProp === \"stroke\" ? (\n <path\n className={cn(\n !color && (active ? `courier-stroke-accent-foreground` : `courier-stroke-ring`),\n className\n )}\n {...props}\n />\n ) : (\n <path\n className={cn(\n !color && (active ? `courier-fill-accent-foreground` : `courier-fill-ring`),\n className\n )}\n {...props}\n />\n );\n\nexport const Icon = ({ width = 28, height = 28, ...props }: IconProps) => (\n <svg width={width} height={height} viewBox={`0 0 ${width} ${height}`} fill=\"none\" {...props} />\n);\n", "import type { IconProps } from \"./Icon\";\nimport { Icon } from \"./Icon\";\n\nexport const BinIcon = ({ color = \"#DC2626\", width = 13, height = 13, ...props }: IconProps) => (\n <Icon {...props} fill=\"none\" width={width} height={height}>\n <path\n d=\"M4.89844 1.625C4.82812 1.625 4.78125 1.67188 4.73438 1.71875L4.28906 2.375H7.6875L7.24219 1.71875C7.21875 1.67188 7.14844 1.625 7.07812 1.625H4.89844ZM9.04688 2.375H9.35156H10.5H10.6875C10.9922 2.375 11.25 2.63281 11.25 2.9375C11.25 3.26562 10.9922 3.5 10.6875 3.5H10.4062L9.84375 11.1172C9.77344 11.9141 9.14062 12.5 8.34375 12.5H3.63281C2.83594 12.5 2.20312 11.9141 2.13281 11.1172L1.57031 3.5H1.3125C0.984375 3.5 0.75 3.26562 0.75 2.9375C0.75 2.63281 0.984375 2.375 1.3125 2.375H1.5H2.625H2.92969L3.79688 1.08594C4.03125 0.734375 4.45312 0.5 4.89844 0.5H7.07812C7.52344 0.5 7.94531 0.734375 8.17969 1.08594L9.04688 2.375ZM9.28125 3.5H2.69531L3.25781 11.0469C3.28125 11.2344 3.44531 11.375 3.63281 11.375H8.34375C8.53125 11.375 8.69531 11.2344 8.71875 11.0469L9.28125 3.5Z\"\n fill={color}\n />\n </Icon>\n);\n\nexport default BinIcon;\n", "import type { IconProps } from \"./Icon\";\nimport { Icon, Path } from \"./Icon\";\n\nexport const BorderRadiusIcon = ({\n color = \"#A3A3A3\",\n active,\n width = 16,\n height = 16,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <Path\n active={active}\n colorProp=\"stroke\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n d=\"M1 15V11C1 5.47715 5.47715 1 11 1H15\"\n />\n </Icon>\n);\n\nexport default BorderRadiusIcon;\n", "import type { IconProps } from \"./Icon\";\nimport { Icon } from \"./Icon\";\n\nexport const BorderWidthIcon = ({\n color = \"#A3A3A3\",\n width = 16,\n height = 16,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <rect y=\"2.25\" width=\"16\" height=\"1.5\" rx=\"0.75\" fill={color} />\n <rect y=\"5.75\" width=\"16\" height=\"2.5\" rx=\"1.25\" fill={color} />\n <rect y=\"10.25\" width=\"16\" height=\"3.5\" rx=\"1.75\" fill={color} />\n </Icon>\n);\n\nexport default BorderWidthIcon;\n", "import type { IconProps } from \"./Icon\";\nimport { Icon } from \"./Icon\";\n\nexport const DesktopIcon = ({ color, width = 21, height = 16, ...props }: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <path\n d=\"M2.5 1.5C2.21875 1.5 2 1.75 2 2V11C2 11.2812 2.21875 11.5 2.5 11.5H18.5C18.75 11.5 19 11.2812 19 11V2C19 1.75 18.75 1.5 18.5 1.5H2.5ZM0.5 2C0.5 0.90625 1.375 0 2.5 0H18.5C19.5938 0 20.5 0.90625 20.5 2V11C20.5 12.125 19.5938 13 18.5 13H2.5C1.375 13 0.5 12.125 0.5 11V2ZM4.25 14.5H16.75C17.1562 14.5 17.5 14.8438 17.5 15.25C17.5 15.6875 17.1562 16 16.75 16H4.25C3.8125 16 3.5 15.6875 3.5 15.25C3.5 14.8438 3.8125 14.5 4.25 14.5Z\"\n fill={color}\n />\n </Icon>\n);\n\nexport default DesktopIcon;\n", "import type { IconProps } from \"./Icon\";\nimport { Icon } from \"./Icon\";\n\nexport const DuplicateIcon = ({\n color = \"#171717\",\n width = 12,\n height = 13,\n ...props\n}: IconProps) => (\n <Icon {...props} fill=\"none\" width={width} height={height}>\n <path\n d=\"M1.5 11.375H6.75C6.9375 11.375 7.125 11.2109 7.125 11V9.5H8.25V11C8.25 11.8438 7.57031 12.5 6.75 12.5H1.5C0.65625 12.5 0 11.8438 0 11V5.75C0 4.92969 0.65625 4.25 1.5 4.25H3V5.375H1.5C1.28906 5.375 1.125 5.5625 1.125 5.75V11C1.125 11.2109 1.28906 11.375 1.5 11.375ZM5.25 7.625H10.5C10.6875 7.625 10.875 7.46094 10.875 7.25V2C10.875 1.8125 10.6875 1.625 10.5 1.625H5.25C5.03906 1.625 4.875 1.8125 4.875 2V7.25C4.875 7.46094 5.03906 7.625 5.25 7.625ZM3.75 7.25V2C3.75 1.17969 4.40625 0.5 5.25 0.5H10.5C11.3203 0.5 12 1.17969 12 2V7.25C12 8.09375 11.3203 8.75 10.5 8.75H5.25C4.40625 8.75 3.75 8.09375 3.75 7.25Z\"\n fill={color}\n />\n </Icon>\n);\n\nexport default DuplicateIcon;\n", "import type { IconProps } from \"./Icon\";\nimport { Icon, Path } from \"./Icon\";\n\nexport const FacebookIcon = ({\n color = \"#A3A3A3\",\n active,\n width = 16,\n height = 16,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <Path\n d=\"M16 8C16 12.0938 12.9062 15.4688 8.96875 15.9688V10.4688H11.125L11.5625 8H8.96875V7.15625C8.96875 5.84375 9.46875 5.34375 10.7812 5.34375C11.1875 5.34375 11.5 5.375 11.6875 5.375V3.1875C11.3438 3.0625 10.4688 2.96875 9.96875 2.96875C7.28125 2.96875 6.0625 4.25 6.0625 6.96875V8H4.40625V10.4688H6.0625V15.7812C2.5625 14.9062 0 11.75 0 8C0 3.59375 3.5625 0 8 0C12.4062 0 16 3.59375 16 8Z\"\n active={active}\n fill={color}\n />\n </Icon>\n);\n\nexport default FacebookIcon;\n", "import type { IconProps } from \"./Icon\";\nimport { Icon, Path } from \"./Icon\";\n\nexport const InstagramIcon = ({\n color = \"#A3A3A3\",\n active,\n width = 16,\n height = 16,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <Path\n d=\"M8 4.40625C9.96875 4.40625 11.5938 6.03125 11.5938 8C11.5938 10 9.96875 11.5938 8 11.5938C6 11.5938 4.40625 10 4.40625 8C4.40625 6.03125 6 4.40625 8 4.40625ZM8 10.3438C9.28125 10.3438 10.3125 9.3125 10.3125 8C10.3125 6.71875 9.28125 5.6875 8 5.6875C6.6875 5.6875 5.65625 6.71875 5.65625 8C5.65625 9.3125 6.71875 10.3438 8 10.3438ZM12.5625 4.28125C12.5625 3.8125 12.1875 3.4375 11.7188 3.4375C11.25 3.4375 10.875 3.8125 10.875 4.28125C10.875 4.75 11.25 5.125 11.7188 5.125C12.1875 5.125 12.5625 4.75 12.5625 4.28125ZM14.9375 5.125C15 6.28125 15 9.75 14.9375 10.9062C14.875 12.0312 14.625 13 13.8125 13.8438C13 14.6562 12 14.9062 10.875 14.9688C9.71875 15.0312 6.25 15.0312 5.09375 14.9688C3.96875 14.9062 3 14.6562 2.15625 13.8438C1.34375 13 1.09375 12.0312 1.03125 10.9062C0.96875 9.75 0.96875 6.28125 1.03125 5.125C1.09375 4 1.34375 3 2.15625 2.1875C3 1.375 3.96875 1.125 5.09375 1.0625C6.25 1 9.71875 1 10.875 1.0625C12 1.125 13 1.375 13.8125 2.1875C14.625 3 14.875 4 14.9375 5.125ZM13.4375 12.125C13.8125 11.2188 13.7188 9.03125 13.7188 8C13.7188 7 13.8125 4.8125 13.4375 3.875C13.1875 3.28125 12.7188 2.78125 12.125 2.5625C11.1875 2.1875 9 2.28125 8 2.28125C6.96875 2.28125 4.78125 2.1875 3.875 2.5625C3.25 2.8125 2.78125 3.28125 2.53125 3.875C2.15625 4.8125 2.25 7 2.25 8C2.25 9.03125 2.15625 11.2188 2.53125 12.125C2.78125 12.75 3.25 13.2188 3.875 13.4688C4.78125 13.8438 6.96875 13.75 8 13.75C9 13.75 11.1875 13.8438 12.125 13.4688C12.7188 13.2188 13.2188 12.75 13.4375 12.125Z\"\n active={active}\n fill={color}\n />\n </Icon>\n);\n\nexport default InstagramIcon;\n", "import type { IconProps } from \"./Icon\";\nimport { Icon, Path } from \"./Icon\";\n\nexport const LinkedinIcon = ({\n color = \"#A3A3A3\",\n active,\n width = 16,\n height = 16,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <Path\n d=\"M14 1C14.5312 1 15 1.46875 15 2.03125V14C15 14.5625 14.5312 15 14 15H1.96875C1.4375 15 1 14.5625 1 14V2.03125C1 1.46875 1.4375 1 1.96875 1H14ZM5.21875 13V6.34375H3.15625V13H5.21875ZM4.1875 5.40625C4.84375 5.40625 5.375 4.875 5.375 4.21875C5.375 3.5625 4.84375 3 4.1875 3C3.5 3 2.96875 3.5625 2.96875 4.21875C2.96875 4.875 3.5 5.40625 4.1875 5.40625ZM13 13V9.34375C13 7.5625 12.5938 6.15625 10.5 6.15625C9.5 6.15625 8.8125 6.71875 8.53125 7.25H8.5V6.34375H6.53125V13H8.59375V9.71875C8.59375 8.84375 8.75 8 9.84375 8C10.9062 8 10.9062 9 10.9062 9.75V13H13Z\"\n active={active}\n fill={color}\n />\n </Icon>\n);\n\nexport default LinkedinIcon;\n", "import type { IconProps } from \"./Icon\";\nimport { Icon, Path } from \"./Icon\";\n\nexport const MediumIcon = ({\n color = \"#A3A3A3\",\n active,\n width = 16,\n height = 16,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <Path\n d=\"M5.625 2.34375C8.75 2.34375 11.2812 4.875 11.2812 8C11.2812 11.1562 8.75 13.6875 5.625 13.6875C2.5 13.6875 0 11.1562 0 8C0 4.875 2.5 2.34375 5.625 2.34375ZM14.625 2.65625C16.1875 2.65625 17.4688 5.0625 17.4688 8.03125C17.4688 10.9688 16.1875 13.375 14.625 13.375C13.0625 13.375 11.8125 10.9688 11.8125 8.03125C11.8125 5.0625 13.0625 2.65625 14.625 2.65625ZM19 3.21875C19.5312 3.21875 20 5.375 20 8C20 10.6562 19.5312 12.8125 19 12.8125C18.4375 12.8125 18 10.6562 18 8.03125C18 5.375 18.4375 3.21875 19 3.21875Z\"\n active={active}\n fill={color}\n />\n </Icon>\n);\n\nexport default MediumIcon;\n", "import type { IconProps } from \"./Icon\";\nimport { Icon } from \"./Icon\";\n\nexport const MobileIcon = ({ color, width = 21, height = 16, ...props }: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <g transform=\"translate(4, 0)\">\n <path\n d=\"M8.5 1.5V2C8.5 2.28125 8.25 2.5 8 2.5H5C4.71875 2.5 4.5 2.28125 4.5 2V1.5H3.5C2.9375 1.5 2.5 1.96875 2.5 2.5V13.5C2.5 14.0625 2.9375 14.5 3.5 14.5H9.5C10.0312 14.5 10.5 14.0625 10.5 13.5V2.5C10.5 1.96875 10.0312 1.5 9.5 1.5H8.5ZM1 2.5C1 1.125 2.09375 0 3.5 0H9.5C10.875 0 12 1.125 12 2.5V13.5C12 14.9062 10.875 16 9.5 16H3.5C2.09375 16 1 14.9062 1 13.5V2.5Z\"\n fill={color}\n />\n </g>\n </Icon>\n);\n\nexport default MobileIcon;\n", "import type { IconProps } from \"./Icon\";\nimport { Icon, Path } from \"./Icon\";\n\nexport const PaddingHorizontalIcon = ({\n color = \"#A3A3A3\",\n active,\n width = 16,\n height = 16,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <Path\n d=\"M14.25 0C14.6562 0 15 0.34375 15 0.75V15.25C15 15.6875 14.6562 16 14.25 16C13.8125 16 13.5 15.6875 13.5 15.25V0.75C13.5 0.34375 13.8125 0 14.25 0ZM9.5 11.5V4.5H6.5V11.5H9.5ZM11 4.5V11.5C11 12.3438 10.3125 13 9.5 13H6.5C5.65625 13 5 12.3438 5 11.5V4.5C5 3.6875 5.65625 3 6.5 3H9.5C10.3125 3 11 3.6875 11 4.5ZM2.5 0.75V15.25C2.5 15.6875 2.15625 16 1.75 16C1.3125 16 1 15.6875 1 15.25V0.75C1 0.34375 1.3125 0 1.75 0C2.15625 0 2.5 0.34375 2.5 0.75Z\"\n active={active}\n fill={color}\n />\n </Icon>\n);\n\nexport default PaddingHorizontalIcon;\n", "import type { IconProps } from \"./Icon\";\nimport { Icon, Path } from \"./Icon\";\n\nexport const PaddingVerticalIcon = ({\n color = \"#A3A3A3\",\n active,\n width = 16,\n height = 16,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <Path\n d=\"M0 1.75C0 1.34375 0.3125 1 0.75 1H15.25C15.6562 1 16 1.34375 16 1.75C16 2.1875 15.6562 2.5 15.25 2.5H0.75C0.3125 2.5 0 2.1875 0 1.75ZM11.5 6.5H4.5V9.5H11.5V6.5ZM4.5 5H11.5C12.3125 5 13 5.6875 13 6.5V9.5C13 10.3438 12.3125 11 11.5 11H4.5C3.65625 11 3 10.3438 3 9.5V6.5C3 5.6875 3.65625 5 4.5 5ZM0.75 13.5H15.25C15.6562 13.5 16 13.8438 16 14.25C16 14.6875 15.6562 15 15.25 15H0.75C0.3125 15 0 14.6875 0 14.25C0 13.8438 0.3125 13.5 0.75 13.5Z\"\n active={active}\n fill={color}\n />\n </Icon>\n);\n\nexport default PaddingVerticalIcon;\n", "import type { IconProps } from \"./Icon\";\nimport { Icon } from \"./Icon\";\n\nexport const RemoveFormattingIcon = ({\n color = \"#171717\",\n width = 16,\n height = 13,\n ...props\n}: IconProps) => (\n <Icon {...props} fill=\"none\" width={width} height={height}>\n <path\n d=\"M1.39062 0.640625L4.01562 2.67969L4.17969 1.97656C4.29688 1.55469 4.67188 1.25 5.09375 1.25H12.9453C13.5547 1.25 14 1.83594 13.8594 2.42188L13.6016 3.45312C13.5312 3.75781 13.2266 3.94531 12.9219 3.875C12.6172 3.80469 12.4297 3.5 12.5 3.19531L12.7109 2.375H9.78125L8.65625 6.33594L15.2656 11.5156C15.5234 11.7031 15.5703 12.0547 15.3594 12.2891C15.1719 12.5469 14.8203 12.5938 14.5859 12.3828L0.710938 1.50781C0.453125 1.32031 0.40625 0.96875 0.617188 0.734375C0.804688 0.476562 1.15625 0.429688 1.39062 0.640625ZM4.97656 3.42969L7.71875 5.58594L8.60938 2.375H5.23438L4.97656 3.42969ZM8 8.67969L7.4375 10.625H8.75C9.05469 10.625 9.3125 10.8828 9.3125 11.1875C9.3125 11.5156 9.05469 11.75 8.75 11.75H5C4.67188 11.75 4.4375 11.5156 4.4375 11.1875C4.4375 10.8828 4.67188 10.625 5 10.625H6.28906L6.3125 10.4844L7.03906 7.92969L8 8.67969Z\"\n fill={color}\n />\n </Icon>\n);\n\nexport default RemoveFormattingIcon;\n", "import type { IconProps } from \"./Icon\";\nimport { Icon, Path } from \"./Icon\";\n\nexport const XIcon = ({\n color = \"#A3A3A3\",\n active,\n width = 16,\n height = 16,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <Path\n d=\"M12.1562 1.5H14.3438L9.53125 7.03125L15.2188 14.5H10.7812L7.28125 9.96875L3.3125 14.5H1.09375L6.25 8.625L0.8125 1.5H5.375L8.5 5.65625L12.1562 1.5ZM11.375 13.1875H12.5938L4.71875 2.75H3.40625L11.375 13.1875Z\"\n active={active}\n fill={color}\n />\n </Icon>\n);\n\nexport default XIcon;\n", "import { Divider } from \"@/components/ui-kit\";\nimport { BinIcon, DuplicateIcon, RemoveFormattingIcon } from \"@/components/ui-kit/Icon\";\nimport { cn } from \"@/lib\";\nimport type { DraggableSyntheticListeners } from \"@dnd-kit/core\";\nimport { useSortable } from \"@dnd-kit/sortable\";\nimport type { Transform } from \"@dnd-kit/utilities\";\nimport type { Node } from \"@tiptap/pm/model\";\nimport type { EditorState } from \"@tiptap/pm/state\";\nimport type { Editor, NodeViewWrapperProps } from \"@tiptap/react\";\nimport { NodeViewWrapper } from \"@tiptap/react\";\nimport { useSetAtom } from \"jotai\";\nimport React, { forwardRef, useCallback, useEffect, useState } from \"react\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { createOrDuplicateNode } from \"../../utils\";\nimport { Handle } from \"../Handle\";\nimport { useTextmenuCommands } from \"../TextMenu/hooks/useTextmenuCommands\";\nimport { selectedNodeAtom } from \"../TextMenu/store\";\n\nexport interface SortableItemWrapperProps extends NodeViewWrapperProps {\n children: React.ReactNode;\n id: string;\n className?: string;\n editor: Editor;\n}\n\nfunction useMountStatus() {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n const timeout = setTimeout(() => setIsMounted(true), 500);\n\n return () => clearTimeout(timeout);\n }, []);\n\n return isMounted;\n}\n\nexport const SortableItemWrapper = ({\n children,\n id,\n className,\n ...props\n}: SortableItemWrapperProps) => {\n const { setNodeRef, setActivatorNodeRef, listeners, isDragging, transform, transition } =\n useSortable({\n id,\n });\n const mounted = useMountStatus();\n const mountedWhileDragging = isDragging && !mounted;\n\n return (\n <SortableItem\n ref={setNodeRef}\n id={id}\n transition={transition}\n transform={transform}\n fadeIn={mountedWhileDragging}\n listeners={listeners}\n className={className}\n handleProps={{ ref: setActivatorNodeRef }}\n {...props}\n >\n {children}\n </SortableItem>\n );\n};\n\nexport interface SortableItemProps {\n children: React.ReactNode;\n id?: string;\n dragOverlay?: boolean;\n disabled?: boolean;\n dragging?: boolean;\n handleProps?: Record<string, unknown>;\n fadeIn?: boolean;\n transform?: Transform | null;\n listeners?: DraggableSyntheticListeners;\n transition?: string | null;\n className?: string;\n editor: Editor;\n}\n\nexport const SortableItem = forwardRef<HTMLDivElement, SortableItemProps>(\n (\n {\n children,\n className,\n dragOverlay,\n handleProps,\n listeners,\n id,\n transition,\n transform,\n editor,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n fadeIn,\n ...props\n },\n ref\n ) => {\n useEffect(() => {\n if (!dragOverlay) {\n return;\n }\n\n document.body.style.cursor = \"grabbing\";\n\n return () => {\n document.body.style.cursor = \"\";\n };\n }, [dragOverlay]);\n\n const setSelectedNode = useSetAtom(selectedNodeAtom);\n const { resetButtonFormatting } = useTextmenuCommands(editor);\n\n // Helper function to find node position by ID\n const findNodePositionById = (state: EditorState, targetId: string): number | null => {\n let foundPos: number | null = null;\n\n state.doc.descendants((node: Node, pos: number) => {\n if (foundPos !== null) return false; // Stop if already found\n if (node.attrs?.id === targetId) {\n foundPos = pos;\n return false; // Stop traversal\n }\n return true; // Continue traversal\n });\n\n return foundPos;\n };\n\n // Helper function to get node and position\n const getNodeAndPosition = useCallback(() => {\n if (!editor || !id) {\n return { node: null, pos: null };\n }\n\n const pos = findNodePositionById(editor.state, id);\n\n if (pos === null) {\n return { node: null, pos: null };\n }\n\n const node = editor.state.doc.nodeAt(pos);\n\n return { node, pos };\n }, [editor, id]);\n\n // Common method to clear selection\n const clearSelection = useCallback(() => {\n editor.commands.blur();\n setSelectedNode(null);\n }, [editor, setSelectedNode]);\n\n const deleteNode = useCallback(() => {\n if (!editor || !id) return;\n\n try {\n // Clear selection first\n clearSelection();\n\n setTimeout(() => {\n const { node, pos } = getNodeAndPosition();\n if (!node || pos === null) {\n return;\n }\n\n // Check if this is the last node in the document\n const isLastNode = editor.state.doc.childCount === 1;\n\n // Create and dispatch a transaction directly\n const tr = editor.state.tr;\n tr.delete(pos, pos + node?.nodeSize);\n tr.setMeta(\"addToHistory\", true);\n\n // Dispatch the transaction\n editor.view.dispatch(tr);\n\n // If we deleted the last node, TipTap will automatically create an empty paragraph\n // We need to ensure it has a unique ID\n if (isLastNode) {\n setTimeout(() => {\n // The new paragraph will be at position 0\n const newNode = editor.state.doc.nodeAt(0);\n if (newNode && newNode.type.name === \"paragraph\" && !newNode.attrs.id) {\n const newId = `node-${uuidv4()}`;\n const tr = editor.state.tr;\n tr.setNodeMarkup(0, undefined, { ...newNode.attrs, id: newId });\n editor.view.dispatch(tr);\n\n // Dispatch a custom event to notify the Editor component about the new node\n const customEvent = new CustomEvent(\"node-duplicated\", {\n detail: { newNodeId: newId },\n });\n document.dispatchEvent(customEvent);\n }\n }, 50);\n }\n\n setSelectedNode(null);\n }, 100);\n } catch (error) {\n console.error(\"Error deleting node:\", error);\n }\n }, [editor, id, getNodeAndPosition, clearSelection, setSelectedNode]);\n\n const removeFormatting = useCallback(() => {\n if (!editor || !id) return;\n\n try {\n // Get the current node and position\n const { node, pos } = getNodeAndPosition();\n if (!node || pos === null) return;\n\n // Check if this is a button node\n if (node.type.name === \"button\") {\n // Use the resetButtonFormatting function for buttons\n resetButtonFormatting();\n return;\n }\n\n // For non-button nodes, use the original formatting removal logic\n clearSelection();\n\n setTimeout(() => {\n const chain = editor.chain();\n\n // Set node selection and remove all marks\n chain.setNodeSelection(pos).unsetAllMarks();\n\n // For blockquote nodes, find and format the child content\n if (node.type.name === \"blockquote\" && node.content && node.content.firstChild) {\n const childNode = node.content.firstChild;\n // Only convert to paragraph if it's not already a paragraph\n if (childNode.type.name !== \"paragraph\") {\n chain.setParagraph();\n }\n }\n // For non-blockquote nodes that aren't paragraphs, convert to paragraph\n else if (node.type.name !== \"paragraph\" && node.type.name !== \"blockquote\") {\n chain.setParagraph();\n }\n\n chain.run();\n }, 100);\n } catch (error) {\n console.error(\"Error removing formatting:\", error);\n }\n }, [editor, id, getNodeAndPosition, clearSelection, resetButtonFormatting]);\n\n const duplicateNode = useCallback(() => {\n if (!editor || !id) return;\n\n try {\n // Clear selection first\n clearSelection();\n\n setTimeout(() => {\n const { node, pos } = getNodeAndPosition();\n if (!node || pos === null) return;\n\n // Get the node type and attributes\n const nodeType = node.type.name;\n const nodeAttrs = { ...node.attrs };\n\n // Remove the id from the source attributes as we'll generate a new one\n delete nodeAttrs.id;\n\n // Get the position to insert the duplicate (right after the current node)\n const insertPos = pos + node?.nodeSize;\n\n // Use the createOrDuplicateNode utility to create the duplicate\n createOrDuplicateNode(\n editor,\n nodeType,\n insertPos,\n nodeAttrs,\n (node) => setSelectedNode(node as Node),\n node.content\n );\n }, 100);\n } catch (error) {\n console.error(\"Error duplicating node:\", error);\n }\n }, [editor, id, getNodeAndPosition, clearSelection, setSelectedNode]);\n\n const { node } = getNodeAndPosition();\n\n return (\n <NodeViewWrapper\n ref={ref}\n data-cypress=\"draggable-item\"\n data-node-view-wrapper\n data-id={id}\n className={cn(\n \"courier-flex courier-items-center courier-justify-center courier-gap-2 courier-pl-6 draggable-item\",\n className\n )}\n style={\n {\n transition: [transition].filter(Boolean).join(\", \"),\n \"--translate-x\": transform ? `${Math.round(transform.x)}px` : undefined,\n \"--translate-y\": transform ? `${Math.round(transform.y)}px` : undefined,\n \"--scale-x\": transform?.scaleX ? `${transform.scaleX}` : undefined,\n \"--scale-y\": transform?.scaleY ? `${transform.scaleY}` : undefined,\n transform: `translate3d(var(--translate-x, 0), var(--translate-y, 0), 0) scaleX(var(--scale-x, 1)) scaleY(var(--scale-y, 1))`,\n } as React.CSSProperties\n }\n {...props}\n >\n <Handle\n className=\"courier-absolute courier-left-[-20px]\"\n tabIndex={-1}\n {...handleProps}\n {...listeners}\n />\n {children}\n <div className=\"courier-actions-panel courier-absolute courier-right-[-50px] courier-rounded-md courier-border courier-border-border courier-bg-background courier-shadow-sm courier-flex courier-items-center courier-justify-center courier-hidden\">\n {node?.type.name !== \"imageBlock\" &&\n node?.type.name !== \"divider\" &&\n node?.type.name !== \"spacer\" && (\n <>\n <button\n className=\"courier-w-8 courier-h-8 courier-flex courier-items-center courier-justify-center\"\n onClick={removeFormatting}\n tabIndex={-1}\n >\n <RemoveFormattingIcon />\n </button>\n <Divider className=\"courier-m-0\" />\n </>\n )}\n <button\n className=\"courier-w-8 courier-h-8 courier-flex courier-items-center courier-justify-center\"\n onClick={duplicateNode}\n tabIndex={-1}\n >\n <DuplicateIcon />\n </button>\n <Divider className=\"courier-m-0\" />\n <button\n className=\"courier-w-8 courier-h-8 courier-flex courier-items-center courier-justify-center\"\n onClick={deleteNode}\n tabIndex={-1}\n >\n <BinIcon />\n </button>\n </div>\n </NodeViewWrapper>\n );\n }\n);\n", "export { Color } from \"@tiptap/extension-color\";\nexport { Dropcursor } from \"@tiptap/extension-dropcursor\";\nexport { HardBreak } from \"@tiptap/extension-hard-break\";\nexport { History } from \"@tiptap/extension-history\";\nexport { Placeholder } from \"@tiptap/extension-placeholder\";\nexport { TextAlign } from \"@tiptap/extension-text-align\";\nexport { Typography } from \"@tiptap/extension-typography\";\nexport { Underline } from \"@tiptap/extension-underline\";\nexport { StarterKit } from \"@tiptap/starter-kit\";\nexport { Blockquote } from \"./Blockquote\";\nexport { Button } from \"./Button\";\nexport { Divider } from \"./Divider\";\nexport { Document } from \"./Document\";\nexport * from \"./DragPlaceholder\";\nexport { FileHandler } from \"./FileHandler\";\nexport { Heading } from \"./Heading\";\nexport { ImageBlock } from \"./ImageBlock\";\nexport { Link } from \"./Link\";\nexport { Paragraph } from \"./Paragraph\";\nexport { Selection } from \"./Selection\";\nexport { SlashMenu } from \"./SlashMenu\";\nexport { UniqueId } from \"./UniqueId\";\nexport { Variable, VariableNode } from \"./Variable\";\n", "import { Extension } from '@tiptap/core'\nimport { dropCursor } from '@tiptap/pm/dropcursor'\n\nexport interface DropcursorOptions {\n /**\n * The color of the drop cursor\n * @default 'currentColor'\n * @example 'red'\n */\n color: string | undefined,\n\n /**\n * The width of the drop cursor\n * @default 1\n * @example 2\n */\n width: number | undefined,\n\n /**\n * The class of the drop cursor\n * @default undefined\n * @example 'drop-cursor'\n */\n class: string | undefined,\n}\n\n/**\n * This extension allows you to add a drop cursor to your editor.\n * A drop cursor is a line that appears when you drag and drop content\n * inbetween nodes.\n * @see https://tiptap.dev/api/extensions/dropcursor\n */\nexport const Dropcursor = Extension.create<DropcursorOptions>({\n name: 'dropCursor',\n\n addOptions() {\n return {\n color: 'currentColor',\n width: 1,\n class: undefined,\n }\n },\n\n addProseMirrorPlugins() {\n return [\n dropCursor(this.options),\n ]\n },\n})\n", "import { Extension } from '@tiptap/core'\nimport { history, redo, undo } from '@tiptap/pm/history'\n\nexport interface HistoryOptions {\n /**\n * The amount of history events that are collected before the oldest events are discarded.\n * @default 100\n * @example 50\n */\n depth: number,\n\n /**\n * The delay (in milliseconds) between changes after which a new group should be started.\n * @default 500\n * @example 1000\n */\n newGroupDelay: number,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n history: {\n /**\n * Undo recent changes\n * @example editor.commands.undo()\n */\n undo: () => ReturnType,\n /**\n * Reapply reverted changes\n * @example editor.commands.redo()\n */\n redo: () => ReturnType,\n }\n }\n}\n\n/**\n * This extension allows you to undo and redo recent changes.\n * @see https://www.tiptap.dev/api/extensions/history\n *\n * **Important**: If the `@tiptap/extension-collaboration` package is used, make sure to remove\n * the `history` extension, as it is not compatible with the `collaboration` extension.\n *\n * `@tiptap/extension-collaboration` uses its own history implementation.\n */\nexport const History = Extension.create<HistoryOptions>({\n name: 'history',\n\n addOptions() {\n return {\n depth: 100,\n newGroupDelay: 500,\n }\n },\n\n addCommands() {\n return {\n undo: () => ({ state, dispatch }) => {\n return undo(state, dispatch)\n },\n redo: () => ({ state, dispatch }) => {\n return redo(state, dispatch)\n },\n }\n },\n\n addProseMirrorPlugins() {\n return [\n history(this.options),\n ]\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-z': () => this.editor.commands.undo(),\n 'Shift-Mod-z': () => this.editor.commands.redo(),\n 'Mod-y': () => this.editor.commands.redo(),\n\n // Russian keyboard layouts\n 'Mod-я': () => this.editor.commands.undo(),\n 'Shift-Mod-я': () => this.editor.commands.redo(),\n }\n },\n})\n", "import { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport type { ButtonProps } from \"./Button.types\";\nimport { ButtonComponentNode } from \"./ButtonComponent\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { generateNodeIds } from \"../../utils\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n button: {\n setButton: (props: Partial<ButtonProps>) => ReturnType;\n toggleBold: () => ReturnType;\n toggleItalic: () => ReturnType;\n toggleUnderline: () => ReturnType;\n };\n }\n}\n\nexport const defaultButtonProps: ButtonProps = {\n label: \"Button\",\n link: \"\",\n alignment: \"center\",\n size: \"default\",\n backgroundColor: \"#0085FF\",\n textColor: \"#ffffff\",\n borderWidth: 0,\n borderRadius: 0,\n borderColor: \"#000000\",\n padding: 6,\n fontWeight: \"normal\",\n fontStyle: \"normal\",\n isUnderline: false,\n isStrike: false,\n};\n\nexport const Button = Node.create({\n name: \"button\",\n group: \"block\",\n atom: true,\n\n onCreate() {\n generateNodeIds(this.editor, this.name);\n },\n\n addAttributes() {\n return {\n label: {\n default: defaultButtonProps.label,\n parseHTML: (element) => element.getAttribute(\"data-label\"),\n renderHTML: (attributes) => ({\n \"data-label\": attributes.label,\n }),\n },\n link: {\n default: defaultButtonProps.link,\n parseHTML: (element) => element.getAttribute(\"data-link\"),\n renderHTML: (attributes) => ({\n \"data-link\": attributes.link,\n }),\n },\n alignment: {\n default: defaultButtonProps.alignment,\n parseHTML: (element) => element.getAttribute(\"data-alignment\"),\n renderHTML: (attributes) => ({\n \"data-alignment\": attributes.alignment,\n }),\n },\n size: {\n default: defaultButtonProps.size,\n parseHTML: (element) => element.getAttribute(\"data-size\"),\n renderHTML: (attributes) => ({\n \"data-size\": attributes.size,\n }),\n },\n backgroundColor: {\n default: defaultButtonProps.backgroundColor,\n parseHTML: (element) => element.getAttribute(\"data-background-color\"),\n renderHTML: (attributes) => ({\n \"data-background-color\": attributes.backgroundColor,\n }),\n },\n textColor: {\n default: defaultButtonProps.textColor,\n parseHTML: (element) => element.getAttribute(\"data-text-color\"),\n renderHTML: (attributes) => ({\n \"data-text-color\": attributes.textColor,\n }),\n },\n borderWidth: {\n default: defaultButtonProps.borderWidth,\n parseHTML: (element) => element.getAttribute(\"data-border-width\"),\n renderHTML: (attributes) => ({\n \"data-border-width\": attributes.borderWidth,\n }),\n },\n borderRadius: {\n default: defaultButtonProps.borderRadius,\n parseHTML: (element) => element.getAttribute(\"data-border-radius\"),\n renderHTML: (attributes) => ({\n \"data-border-radius\": attributes.borderRadius,\n }),\n },\n borderColor: {\n default: defaultButtonProps.borderColor,\n parseHTML: (element) => element.getAttribute(\"data-border-color\"),\n renderHTML: (attributes) => ({\n \"data-border-color\": attributes.borderColor,\n }),\n },\n padding: {\n default: defaultButtonProps.padding,\n parseHTML: (element) => element.getAttribute(\"data-padding\"),\n renderHTML: (attributes) => ({\n \"data-padding\": attributes.padding,\n }),\n },\n fontWeight: {\n default: defaultButtonProps.fontWeight,\n parseHTML: (element) => element.getAttribute(\"data-font-weight\"),\n renderHTML: (attributes) => ({\n \"data-font-weight\": attributes.fontWeight,\n }),\n },\n fontStyle: {\n default: defaultButtonProps.fontStyle,\n parseHTML: (element) => element.getAttribute(\"data-font-style\"),\n renderHTML: (attributes) => ({\n \"data-font-style\": attributes.fontStyle,\n }),\n },\n isUnderline: {\n default: defaultButtonProps.isUnderline,\n parseHTML: (element) => element.getAttribute(\"data-is-underline\"),\n renderHTML: (attributes) => ({\n \"data-is-underline\": attributes.isUnderline,\n }),\n },\n isStrike: {\n default: defaultButtonProps.isStrike,\n parseHTML: (element) => element.getAttribute(\"data-is-strike\"),\n renderHTML: (attributes) => ({\n \"data-is-strike\": attributes.isStrike,\n }),\n },\n id: {\n default: () => `node-${uuidv4()}`,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => ({\n \"data-id\": attributes.id,\n \"data-node-id\": attributes.id,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"button\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n \"data-type\": \"button\",\n }),\n 0,\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ButtonComponentNode);\n },\n\n addCommands() {\n return {\n // setButton:\n // (props) =>\n // ({ chain, editor }) => {\n // return chain()\n // .insertContent({\n // type: this.name,\n // attrs: props,\n // })\n // .command(({ tr }) => {\n // const lastNode = tr.doc.lastChild;\n // if (lastNode?.type.name === \"button\") {\n // const pos = tr.doc.content.size;\n // tr.insert(pos, editor.schema.nodes.paragraph.create());\n // tr.setSelection(TextSelection.create(tr.doc, pos + 1));\n // }\n // return true;\n // })\n // .run();\n // },\n toggleBold:\n () =>\n ({ editor, chain }) => {\n const { selection } = editor.state;\n const node = editor.state.doc.nodeAt(selection.$anchor.pos);\n\n // Only handle bold for button nodes\n if (node?.type.name === \"button\") {\n const newFontWeight = node.attrs.fontWeight === \"bold\" ? \"normal\" : \"bold\";\n return chain().updateAttributes(node.type, { fontWeight: newFontWeight }).run();\n }\n\n // For non-button nodes, use the core bold mark\n return chain().focus().toggleMark(\"bold\").run();\n },\n toggleItalic:\n () =>\n ({ editor, chain }) => {\n const { selection } = editor.state;\n const node = editor.state.doc.nodeAt(selection.$anchor.pos);\n\n if (node?.type.name === \"button\") {\n const newFontStyle = node.attrs.fontStyle === \"italic\" ? \"normal\" : \"italic\";\n return chain().updateAttributes(node.type, { fontStyle: newFontStyle }).run();\n }\n\n return chain().focus().toggleMark(\"italic\").run();\n },\n toggleUnderline:\n () =>\n ({ editor, chain }) => {\n const { selection } = editor.state;\n const node = editor.state.doc.nodeAt(selection.$anchor.pos);\n\n if (node?.type.name === \"button\") {\n const newIsUnderline = !node.attrs.isUnderline;\n return chain().updateAttributes(node.type, { isUnderline: newIsUnderline }).run();\n }\n\n return chain().focus().toggleMark(\"underline\").run();\n },\n toggleStrike:\n () =>\n ({ editor, chain }) => {\n const { selection } = editor.state;\n const node = editor.state.doc.nodeAt(selection.$anchor.pos);\n\n if (node?.type.name === \"button\") {\n const newIsStrike = !node.attrs.isStrike;\n return chain().updateAttributes(node.type, { isStrike: newIsStrike }).run();\n }\n\n return chain().focus().toggleMark(\"strike\").run();\n },\n };\n },\n});\n", "import { cn } from \"@/lib\";\nimport { type NodeViewProps } from \"@tiptap/react\";\nimport { useSetAtom } from \"jotai\";\nimport React, { useCallback } from \"react\";\nimport { SortableItemWrapper } from \"../../ui/SortableItemWrapper\";\nimport { setSelectedNodeAtom } from \"../../ui/TextMenu/store\";\nimport type { ButtonProps } from \"./Button.types\";\n\nexport const ButtonComponent: React.FC<\n ButtonProps & {\n nodeKey?: string;\n selected?: boolean;\n fontWeight?: string;\n isUnderline?: boolean;\n isStrike?: boolean;\n }\n> = ({\n label,\n alignment,\n size,\n backgroundColor,\n textColor,\n borderWidth,\n borderRadius,\n borderColor,\n padding,\n fontWeight,\n fontStyle,\n isUnderline,\n isStrike,\n}) => {\n return (\n <div className=\"courier-w-full node-element\">\n <div\n className=\"courier-flex\"\n style={{ marginTop: `${padding}px`, marginBottom: `${padding}px` }}\n >\n <div\n className={cn(\n \"courier-inline-flex courier-justify-center courier-px-4 courier-py-2 courier-cursor-pointer courier-text-base\",\n {\n left: \"courier-mr-auto\",\n center: \"courier-mx-auto\",\n right: \"courier-ml-auto\",\n }[alignment],\n size === \"full\" && \"courier-w-full\"\n )}\n style={{\n backgroundColor,\n color: textColor,\n borderWidth: `${borderWidth}px`,\n borderRadius: `${borderRadius}px`,\n borderColor,\n borderStyle: borderWidth > 0 ? \"solid\" : \"none\",\n caretColor: \"#ff0000\",\n fontWeight,\n fontStyle,\n }}\n >\n {isStrike ? (\n <s>{isUnderline ? <u>{label}</u> : label}</s>\n ) : isUnderline ? (\n <u>{label}</u>\n ) : (\n label\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport const ButtonComponentNode = (props: NodeViewProps) => {\n const setSelectedNode = useSetAtom(setSelectedNodeAtom);\n\n const handleSelect = useCallback(() => {\n if (!props.editor.isEditable) {\n return;\n }\n\n const pos = props.getPos();\n const node = props.editor.state.doc.nodeAt(pos);\n if (node) {\n props.editor.commands.blur();\n const nodeId = node.attrs.id;\n props.editor.state.doc.descendants((currentNode) => {\n if (currentNode.type.name === \"button\" && currentNode.attrs.id === nodeId) {\n setSelectedNode(currentNode);\n return false; // Stop traversal\n }\n return true; // Continue traversal\n });\n }\n }, [props, setSelectedNode]);\n\n return (\n <SortableItemWrapper\n id={props.node.attrs.id}\n className={cn(props.node.attrs.isSelected && \"selected-element\")}\n onClick={handleSelect}\n editor={props.editor}\n data-node-type=\"button\"\n >\n <ButtonComponent {...(props.node.attrs as ButtonProps)} />\n </SortableItemWrapper>\n );\n};\n", "import type { Mark, Node } from \"@tiptap/pm/model\";\nimport { atom } from \"jotai\";\nimport type { TextMenuConfig, TextMenuItemState } from \"./config\";\nimport { defaultTextMenuConfig } from \"./config\";\n\ntype GlobalTextMenuConfig = Record<string, TextMenuConfig>;\n\nconst defaultGlobalConfig: GlobalTextMenuConfig = {\n paragraph: defaultTextMenuConfig,\n heading: defaultTextMenuConfig,\n};\n\nexport const textMenuConfigAtom = atom<GlobalTextMenuConfig>(defaultGlobalConfig);\n\nexport const selectedNodeAtom = atom<Node | null>(null);\n\nexport const setSelectedNodeAtom = atom(null, (_, set, node: Node | null) => {\n set(selectedNodeAtom, node);\n});\n\n// Store the current TextInput ref\nexport const textInputRefAtom = atom<{\n ref: HTMLInputElement | HTMLTextAreaElement | null;\n caretPosition: number | null;\n}>({\n ref: null,\n caretPosition: null,\n});\n\n// Store the last active input ref (persists after blur)\nexport const lastActiveInputRefAtom = atom<{\n ref: HTMLInputElement | HTMLTextAreaElement | null;\n caretPosition: number | null;\n}>({\n ref: null,\n caretPosition: null,\n});\n\n// Atom to track TextInput focus state and available variables\nexport const textInputStateAtom = atom<{\n isFocused: boolean;\n hasVariables: boolean;\n showVariablePopup: boolean;\n}>({\n isFocused: false,\n hasVariables: false,\n showVariablePopup: false,\n});\n\n// Derived atom that gets config for a specific node\nexport const getNodeConfigAtom = atom((get) => (nodeName: string) => {\n const globalConfig = get(textMenuConfigAtom);\n const textInputState = get(textInputStateAtom);\n\n const config = globalConfig[nodeName] || {\n bold: { state: \"hidden\" },\n italic: { state: \"hidden\" },\n underline: { state: \"hidden\" },\n strike: { state: \"hidden\" },\n alignLeft: { state: \"hidden\" },\n alignCenter: { state: \"hidden\" },\n alignRight: { state: \"hidden\" },\n alignJustify: { state: \"hidden\" },\n quote: { state: \"hidden\" },\n link: { state: \"hidden\" },\n variable: { state: \"hidden\" },\n };\n\n // Override variable button state if TextInput is focused and has variables\n if (textInputState.isFocused && textInputState.hasVariables) {\n return {\n ...config,\n variable: { state: \"enabled\" },\n };\n }\n\n return config;\n});\n\n// Actions\nexport const setNodeConfigAtom = atom(\n null,\n (get, set, { nodeName, config }: { nodeName: string; config: Partial<TextMenuConfig> }) => {\n const globalConfig = get(textMenuConfigAtom);\n set(textMenuConfigAtom, {\n ...globalConfig,\n [nodeName]: {\n ...globalConfig[nodeName],\n ...Object.fromEntries(\n Object.entries(config).map(([key, value]) => [\n key,\n { state: value?.state || (\"hidden\" as TextMenuItemState) },\n ])\n ),\n },\n });\n }\n);\n\nexport const resetNodeConfigAtom = atom(null, (get, set, nodeName: string) => {\n const globalConfig = get(textMenuConfigAtom);\n const { [nodeName]: _, ...rest } = globalConfig;\n set(textMenuConfigAtom, rest);\n});\n\n// Actions to update TextInput ref and state\nexport const setTextInputRefAtom = atom(\n null,\n (\n _,\n set,\n {\n ref,\n caretPosition,\n }: { ref: HTMLInputElement | HTMLTextAreaElement | null; caretPosition: number | null }\n ) => {\n set(textInputRefAtom, { ref, caretPosition });\n }\n);\n\nexport const setShowVariablePopupAtom = atom(null, (get, set, showVariablePopup: boolean) => {\n const currentState = get(textInputStateAtom);\n set(textInputStateAtom, {\n ...currentState,\n showVariablePopup,\n });\n});\n\ninterface PendingLinkState {\n mark?: Mark;\n link?: {\n from: number;\n to: number;\n };\n}\n\nexport const pendingLinkAtom = atom<PendingLinkState | null>(null);\n\nexport const setPendingLinkAtom = atom(null, (_, set, value: PendingLinkState | null) => {\n set(pendingLinkAtom, value);\n});\n", "export type TextMenuItemState = \"enabled\" | \"disabled\" | \"hidden\";\n\nexport interface TextMenuItem {\n state: TextMenuItemState;\n}\n\nexport interface TextMenuConfig {\n contentType?: TextMenuItem;\n bold?: TextMenuItem;\n italic?: TextMenuItem;\n underline?: TextMenuItem;\n strike?: TextMenuItem;\n alignLeft?: TextMenuItem;\n alignCenter?: TextMenuItem;\n alignRight?: TextMenuItem;\n alignJustify?: TextMenuItem;\n quote?: TextMenuItem;\n link?: TextMenuItem;\n variable?: TextMenuItem;\n}\n\nexport const defaultTextMenuConfig: TextMenuConfig = {\n contentType: { state: \"enabled\" },\n bold: { state: \"enabled\" },\n italic: { state: \"enabled\" },\n underline: { state: \"enabled\" },\n strike: { state: \"enabled\" },\n alignLeft: { state: \"enabled\" },\n alignCenter: { state: \"enabled\" },\n alignRight: { state: \"enabled\" },\n alignJustify: { state: \"enabled\" },\n quote: { state: \"enabled\" },\n link: { state: \"enabled\" },\n variable: { state: \"enabled\" },\n};\n\nexport const getTextMenuConfigForNode = (nodeName: string): TextMenuConfig => {\n switch (nodeName) {\n case \"button\":\n return {\n bold: { state: \"enabled\" },\n italic: { state: \"enabled\" },\n underline: { state: \"enabled\" },\n strike: { state: \"enabled\" },\n };\n case \"paragraph\":\n case \"heading\":\n case \"blockquote\":\n return defaultTextMenuConfig;\n default:\n return {\n contentType: { state: \"hidden\" },\n bold: { state: \"hidden\" },\n italic: { state: \"hidden\" },\n underline: { state: \"hidden\" },\n strike: { state: \"hidden\" },\n alignLeft: { state: \"hidden\" },\n alignCenter: { state: \"hidden\" },\n alignRight: { state: \"hidden\" },\n alignJustify: { state: \"hidden\" },\n quote: { state: \"hidden\" },\n link: { state: \"hidden\" },\n variable: { state: \"hidden\" },\n };\n }\n};\n", "import { z } from \"zod\";\n\nexport const buttonSchema = z.object({\n label: z.string(),\n link: z.string().optional(),\n alignment: z.enum([\"left\", \"center\", \"right\"]),\n size: z.enum([\"default\", \"full\"]),\n backgroundColor: z.string(),\n textColor: z.string(),\n borderWidth: z.number(),\n borderRadius: z.number(),\n borderColor: z.string(),\n padding: z.number(),\n fontWeight: z.enum([\"normal\", \"bold\"]),\n fontStyle: z.enum([\"normal\", \"italic\"]),\n isUnderline: z.boolean(),\n isStrike: z.boolean(),\n});\n\nexport interface ButtonProps {\n label: string;\n link?: string;\n alignment: \"left\" | \"center\" | \"right\";\n size: \"default\" | \"full\";\n backgroundColor: string;\n textColor: string;\n borderWidth: number;\n borderRadius: number;\n borderColor: string;\n padding: number;\n fontWeight: \"normal\" | \"bold\";\n fontStyle: \"normal\" | \"italic\";\n isUnderline: boolean;\n isStrike: boolean;\n}\n", "import {\n Divider,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormMessage,\n Input,\n InputColor,\n ToggleGroup,\n ToggleGroupItem,\n} from \"@/components/ui-kit\";\nimport { BorderRadiusIcon, BorderWidthIcon } from \"@/components/ui-kit/Icon\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport type { Editor } from \"@tiptap/react\";\nimport { useForm } from \"react-hook-form\";\nimport type { z } from \"zod\";\nimport { useNodeAttributes } from \"../../hooks\";\nimport { FormHeader } from \"../../ui/FormHeader\";\nimport { TextInput } from \"../../ui/TextInput\";\nimport { getFlattenedVariables } from \"../../utils/getFlattenedVariables\";\nimport { defaultButtonProps } from \"./Button\";\nimport { buttonSchema } from \"./Button.types\";\nimport {\n ButtonAlignCenterIcon,\n ButtonAlignLeftIcon,\n ButtonAlignRightIcon,\n ButtonSizeDefaultIcon,\n ButtonSizeFullIcon,\n} from \"./ButtonIcon\";\n\ninterface ButtonFormProps {\n element?: ProseMirrorNode;\n editor: Editor | null;\n}\n\nexport const ButtonForm = ({ element, editor }: ButtonFormProps) => {\n const form = useForm<z.infer<typeof buttonSchema>>({\n resolver: zodResolver(buttonSchema),\n defaultValues: {\n ...defaultButtonProps,\n ...(element?.attrs as z.infer<typeof buttonSchema>),\n },\n });\n\n const { updateNodeAttributes } = useNodeAttributes({\n editor,\n element,\n form,\n nodeType: \"button\",\n });\n\n // Get variables from editor storage\n const variables =\n editor?.extensionManager.extensions.find((ext) => ext.name === \"variableSuggestion\")?.options\n ?.variables || {};\n\n const variableKeys = getFlattenedVariables(variables);\n\n if (!element) {\n return null;\n }\n\n return (\n <Form {...form}>\n <FormHeader type=\"button\" />\n <form\n onChange={() => {\n updateNodeAttributes(form.getValues());\n }}\n >\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Link</h4>\n <FormField\n control={form.control}\n name=\"link\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <TextInput\n as=\"Textarea\"\n {...field}\n variables={variableKeys}\n onChange={(e) => {\n field.onChange(e);\n updateNodeAttributes({\n ...form.getValues(),\n link: e.target.value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Divider className=\"courier-mt-6 courier-mb-4\" />\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Text</h4>\n <FormField\n control={form.control}\n name=\"label\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-2\">\n <FormControl>\n <TextInput\n {...field}\n variables={variableKeys}\n onChange={(e) => {\n field.onChange(e);\n updateNodeAttributes({\n ...form.getValues(),\n label: e.target.value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"textColor\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <InputColor\n {...field}\n defaultValue={defaultButtonProps.textColor}\n onChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n [field.name]: value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Divider className=\"courier-mt-6 courier-mb-4\" />\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Background</h4>\n <FormField\n control={form.control}\n name=\"backgroundColor\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <InputColor\n {...field}\n defaultValue={defaultButtonProps.backgroundColor}\n onChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n [field.name]: value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Divider className=\"courier-mt-6 courier-mb-4\" />\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Frame</h4>\n <FormField\n control={form.control}\n name=\"padding\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-2\">\n <FormControl>\n <Input type=\"number\" min={0} {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <div className=\"courier-flex courier-flex-row courier-gap-6\">\n <FormField\n control={form.control}\n name=\"alignment\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <ToggleGroup\n type=\"single\"\n value={field.value}\n onValueChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n alignment: value,\n });\n }}\n >\n <ToggleGroupItem value=\"left\">\n <ButtonAlignLeftIcon />\n </ToggleGroupItem>\n <ToggleGroupItem value=\"center\">\n <ButtonAlignCenterIcon />\n </ToggleGroupItem>\n <ToggleGroupItem value=\"right\">\n <ButtonAlignRightIcon />\n </ToggleGroupItem>\n </ToggleGroup>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"size\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <ToggleGroup\n type=\"single\"\n value={field.value}\n onValueChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n size: value,\n });\n }}\n >\n <ToggleGroupItem value=\"default\">\n <ButtonSizeDefaultIcon />\n </ToggleGroupItem>\n <ToggleGroupItem value=\"full\">\n <ButtonSizeFullIcon />\n </ToggleGroupItem>\n </ToggleGroup>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n <Divider className=\"courier-mt-6 courier-mb-4\" />\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Border</h4>\n <div className=\"courier-flex courier-flex-row courier-gap-3 courier-mb-3\">\n <FormField\n control={form.control}\n name=\"borderWidth\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input startAdornment={<BorderWidthIcon />} type=\"number\" min={0} {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"borderRadius\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input startAdornment={<BorderRadiusIcon />} type=\"number\" min={0} {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n <FormField\n control={form.control}\n name=\"borderColor\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <InputColor\n {...field}\n defaultValue={defaultButtonProps.borderColor}\n onChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n [field.name]: value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </form>\n </Form>\n );\n};\n", "import type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport type { Editor } from \"@tiptap/react\";\nimport { useEffect, useRef } from \"react\";\nimport type { FieldValues, Path, UseFormReturn } from \"react-hook-form\";\n\ninterface UseNodeAttributesProps<T extends FieldValues> {\n editor: Editor | null;\n element?: ProseMirrorNode;\n form: UseFormReturn<T>;\n nodeType: string;\n}\n\nexport const useNodeAttributes = <T extends FieldValues>({\n editor,\n element,\n form,\n nodeType,\n}: UseNodeAttributesProps<T>) => {\n // Keep track of the current node for updates\n const currentNodeRef = useRef<ProseMirrorNode | null>(null);\n const currentNodePosRef = useRef<number | null>(null);\n\n // Update tracked node when element changes or selection changes\n useEffect(() => {\n if (!editor || !element) return;\n\n const updateCurrentNode = () => {\n // Find the node with matching ID in the document\n let foundPos: number | null = null;\n editor.state.doc.descendants((node, pos) => {\n if (node.attrs.id === element.attrs.id) {\n foundPos = pos;\n return false; // Stop traversing\n }\n return true;\n });\n\n if (foundPos !== null) {\n const node = editor.state.doc.nodeAt(foundPos);\n if (node?.type.name === nodeType) {\n currentNodeRef.current = node;\n currentNodePosRef.current = foundPos;\n\n // Sync form with new node's attributes\n Object.entries(node.attrs).forEach(([key, value]) => {\n const currentValue = form.getValues(key as Path<T>);\n if (currentValue !== value) {\n form.setValue(key as Path<T>, value);\n }\n });\n }\n }\n };\n\n // Update immediately\n updateCurrentNode();\n\n // Subscribe to selection changes\n editor.on(\"update\", updateCurrentNode);\n\n return () => {\n editor.off(\"update\", updateCurrentNode);\n };\n }, [editor, element, form, nodeType]);\n\n const updateNodeAttributes = (attrs: Record<string, unknown>) => {\n if (!editor || currentNodePosRef.current === null) return;\n\n editor.commands.command(({ tr }) => {\n const node = tr.doc.nodeAt(currentNodePosRef.current!);\n if (node?.type.name === nodeType) {\n // Preserve the id and other existing attributes\n const updatedAttrs = {\n ...node.attrs,\n ...attrs,\n id: node.attrs.id, // Ensure ID is preserved\n };\n tr.setNodeMarkup(currentNodePosRef.current!, node.type, updatedAttrs);\n return true;\n }\n return false;\n });\n };\n\n return {\n updateNodeAttributes,\n };\n};\n", "import { Button, Divider } from \"@/components/ui-kit\";\nimport { useSetAtom } from \"jotai\";\nimport {\n BlockquoteBlock,\n ButtonBlock,\n DividerBlock,\n HeadingBlock,\n ImageBlock,\n SpacerBlock,\n TextBlock,\n} from \"../Blocks\";\nimport { setSelectedNodeAtom } from \"../TextMenu/store\";\ninterface FormHeaderProps {\n type: \"text\" | \"image\" | \"spacer\" | \"divider\" | \"button\" | \"blockquote\" | \"heading\";\n}\n\nexport const FormHeader = ({ type }: FormHeaderProps) => {\n const setSelectedNode = useSetAtom(setSelectedNodeAtom);\n\n return (\n <div className=\"courier-flex courier-gap-4 courier-flex-col\">\n <Button\n className=\"courier-w-fit\"\n variant=\"secondary\"\n buttonSize=\"small\"\n onClick={() => {\n setSelectedNode(null);\n }}\n >\n Close\n </Button>\n {type === \"heading\" && <HeadingBlock />}\n {type === \"text\" && <TextBlock />}\n {type === \"image\" && <ImageBlock />}\n {type === \"spacer\" && <SpacerBlock />}\n {type === \"divider\" && <DividerBlock />}\n {type === \"button\" && <ButtonBlock />}\n {type === \"blockquote\" && <BlockquoteBlock />}\n <Divider className=\"courier-m-0\" />\n </div>\n );\n};\n", "import { cn } from \"@/lib\";\n\nexport interface BlockBaseProps {\n draggable?: boolean;\n icon: React.ReactNode;\n draggableLabel: string;\n label: string;\n}\n\nexport const BlockBase = ({ draggable = false, icon, draggableLabel, label }: BlockBaseProps) => {\n return (\n <div className=\"courier-flex courier-flex-row courier-items-center courier-gap-2\">\n <div\n className={cn(\n \"courier-w-8 courier-h-8 courier-rounded-md courier-flex courier-items-center courier-justify-center\",\n draggable ? \"courier-cursor-grab courier-bg-[#F5F5F5]\" : \"courier-border\"\n )}\n >\n {icon}\n </div>\n <span className=\"courier-text-sm courier-font-medium\">\n {draggable ? draggableLabel : label}\n </span>\n </div>\n );\n};\n", "import { BlockBase, type BlockBaseProps } from \"../Block\";\nimport { Quote } from \"lucide-react\";\n\nexport const BlockquoteBlock = ({ draggable = false }: Pick<BlockBaseProps, \"draggable\">) => {\n return (\n <BlockBase\n draggable={draggable}\n icon={<Quote strokeWidth={1.25} className=\"courier-w-4 courier-h-4\" />}\n draggableLabel=\"Blockquote\"\n label=\"Blockquote block\"\n />\n );\n};\n", "import { BlockBase, type BlockBaseProps } from \"../Block\";\n\nexport const ButtonBlockIcon = () => (\n <svg width=\"20\" height=\"12\" viewBox=\"0 0 20 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M18 1.5H2C1.71875 1.5 1.5 1.75 1.5 2V10C1.5 10.2812 1.71875 10.5 2 10.5H18C18.25 10.5 18.5 10.2812 18.5 10V2C18.5 1.75 18.25 1.5 18 1.5ZM2 0H18C19.0938 0 20 0.90625 20 2V10C20 11.125 19.0938 12 18 12H2C0.875 12 0 11.125 0 10V2C0 0.90625 0.875 0 2 0Z\"\n fill=\"#171717\"\n />\n </svg>\n);\n\nexport const ButtonBlock = ({ draggable = false }: Pick<BlockBaseProps, \"draggable\">) => {\n return (\n <BlockBase\n draggable={draggable}\n icon={<ButtonBlockIcon />}\n draggableLabel=\"Button\"\n label=\"Button block\"\n />\n );\n};\n", "import { BlockBase, type BlockBaseProps } from \"../Block\";\n\nexport const DividerBlockIcon = () => (\n <svg width=\"16\" height=\"2\" viewBox=\"0 0 16 2\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M0 1C0 0.59375 0.3125 0.25 0.75 0.25H15.25C15.6562 0.25 16 0.59375 16 1C16 1.4375 15.6562 1.75 15.25 1.75H0.75C0.3125 1.75 0 1.4375 0 1Z\"\n fill=\"#171717\"\n />\n </svg>\n);\n\nexport const DividerBlock = ({ draggable = false }: Pick<BlockBaseProps, \"draggable\">) => {\n return (\n <BlockBase\n draggable={draggable}\n icon={<DividerBlockIcon />}\n draggableLabel=\"Divider\"\n label=\"Divider block\"\n />\n );\n};\n", "import { BlockBase, type BlockBaseProps } from \"../Block\";\n\nexport const HeadingBlockIcon = () => (\n <svg width=\"18\" height=\"13\" viewBox=\"0 0 18 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M1.5 1.75V6H8.5V1.75C8.5 1.34375 8.8125 1 9.25 1C9.65625 1 10 1.34375 10 1.75V6.75V12.25C10 12.6875 9.65625 13 9.25 13C8.8125 13 8.5 12.6875 8.5 12.25V7.5H1.5V12.25C1.5 12.6875 1.15625 13 0.75 13C0.3125 13 0 12.6875 0 12.25V6.75V1.75C0 1.34375 0.3125 1 0.75 1C1.15625 1 1.5 1.34375 1.5 1.75ZM15.75 1.75V11.5H17.25C17.6562 11.5 18 11.8438 18 12.25C18 12.6875 17.6562 13 17.25 13H15H12.75C12.3125 13 12 12.6875 12 12.25C12 11.8438 12.3125 11.5 12.75 11.5H14.25V3.03125L13.0938 3.65625C12.75 3.875 12.2812 3.75 12.0938 3.375C11.875 3 12 2.5625 12.375 2.34375L14.625 1.09375C14.8438 0.96875 15.125 0.96875 15.375 1.125C15.5938 1.25 15.75 1.5 15.75 1.75Z\"\n fill=\"#171717\"\n />\n </svg>\n);\n\nexport const HeadingBlock = ({ draggable = false }: Pick<BlockBaseProps, \"draggable\">) => {\n return (\n <BlockBase\n draggable={draggable}\n icon={<HeadingBlockIcon />}\n draggableLabel=\"Heading\"\n label=\"Heading block\"\n />\n );\n};\n", "import { BlockBase, type BlockBaseProps } from \"../Block\";\n\nexport const ImageBlockIcon = () => (\n <svg width=\"16\" height=\"14\" viewBox=\"0 0 16 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 1.5H2C1.71875 1.5 1.5 1.75 1.5 2V12V12.0312L1.625 11.8438L4.125 8.34375C4.28125 8.125 4.5 8 4.75 8C4.96875 8 5.21875 8.125 5.34375 8.3125L6.3125 9.65625L8.90625 6.3125C9.03125 6.125 9.25 6 9.5 6C9.71875 6 9.9375 6.125 10.0938 6.3125L14.3438 11.8125L14.5 12V2C14.5 1.75 14.25 1.5 14 1.5ZM2 0H14C15.0938 0 16 0.90625 16 2V12C16 13.125 15.0938 14 14 14H2C0.875 14 0 13.125 0 12V2C0 0.90625 0.875 0 2 0ZM4.5 6C3.9375 6 3.46875 5.71875 3.1875 5.25C2.90625 4.8125 2.90625 4.21875 3.1875 3.75C3.46875 3.3125 3.9375 3 4.5 3C5.03125 3 5.5 3.3125 5.78125 3.75C6.0625 4.21875 6.0625 4.8125 5.78125 5.25C5.5 5.71875 5.03125 6 4.5 6Z\"\n fill=\"#171717\"\n />\n </svg>\n);\n\nexport const ImageBlock = ({ draggable = false }: Pick<BlockBaseProps, \"draggable\">) => {\n return (\n <BlockBase\n draggable={draggable}\n icon={<ImageBlockIcon />}\n draggableLabel=\"Image\"\n label=\"Image block\"\n />\n );\n};\n", "import { BlockBase, type BlockBaseProps } from \"../Block\";\nimport { AlignVerticalSpaceAround } from \"lucide-react\";\n\nexport const SpacerBlock = ({ draggable = false }: Pick<BlockBaseProps, \"draggable\">) => {\n return (\n <BlockBase\n draggable={draggable}\n icon={<AlignVerticalSpaceAround className=\"courier-w-4 courier-h-4\" />}\n draggableLabel=\"Spacer\"\n label=\"Spacer block\"\n />\n );\n};\n", "import { BlockBase, type BlockBaseProps } from \"../Block\";\n\nexport const TextBlockIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M1.5 1.5V3C1.5 3.4375 1.15625 3.75 0.75 3.75C0.3125 3.75 0 3.4375 0 3V1.25C0 0.5625 0.53125 0 1.25 0H12.75C13.4375 0 14 0.5625 14 1.25V3C14 3.4375 13.6562 3.75 13.25 3.75C12.8125 3.75 12.5 3.4375 12.5 3V1.5H7.75V12.5H9.25C9.65625 12.5 10 12.8438 10 13.25C10 13.6875 9.65625 14 9.25 14H4.75C4.3125 14 4 13.6875 4 13.25C4 12.8438 4.3125 12.5 4.75 12.5H6.25V1.5H1.5Z\"\n fill=\"#171717\"\n />\n </svg>\n);\n\nexport const TextBlock = ({ draggable = false }: Pick<BlockBaseProps, \"draggable\">) => {\n return (\n <BlockBase\n draggable={draggable}\n icon={<TextBlockIcon />}\n draggableLabel=\"Text\"\n label=\"Text block\"\n />\n );\n};\n", "import { Input, Textarea } from \"@/components/ui-kit\";\nimport type { InputProps } from \"@/components/ui-kit/Input/Input\";\nimport type { TextareaProps } from \"@/components/ui-kit/Textarea/Textarea\";\nimport { useSetAtom } from \"jotai\";\nimport * as React from \"react\";\nimport { useRef, useState } from \"react\";\nimport { VariableSuggestions } from \"../../extensions/Variable/VariableSuggestions\";\nimport { lastActiveInputRefAtom, setTextInputRefAtom, textInputStateAtom } from \"../TextMenu/store\";\n\nexport interface TextInputProps extends Omit<React.ComponentProps<\"input\">, \"as\" | \"onChange\"> {\n as?: \"Input\" | \"Textarea\";\n variables?: string[];\n autoResize?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n}\n\nexport const TextInput = React.forwardRef<HTMLInputElement | HTMLTextAreaElement, TextInputProps>(\n ({ as = \"Input\", variables = [], autoResize, onChange, ...props }, ref) => {\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [cursorPosition, setCursorPosition] = useState<{ top: number; left: number } | null>(\n null\n );\n const [selectedIndex, setSelectedIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement | HTMLTextAreaElement | null>(null);\n const setTextInputState = useSetAtom(textInputStateAtom);\n const setTextInputRef = useSetAtom(setTextInputRefAtom);\n const setLastActiveInputRef = useSetAtom(lastActiveInputRefAtom);\n\n const handleFocus = React.useCallback(() => {\n if (!inputRef.current) return;\n\n const data = {\n ref: inputRef.current,\n caretPosition: inputRef.current.selectionStart,\n };\n setTextInputRef(data);\n setLastActiveInputRef(data);\n\n const state = {\n isFocused: true,\n hasVariables: variables.length > 0,\n showVariablePopup: false,\n };\n setTextInputState(state);\n }, [setTextInputState, setTextInputRef, setLastActiveInputRef, variables]);\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent) => {\n const isToSuggestions =\n e.relatedTarget && containerRef.current?.contains(e.relatedTarget as Node);\n const isToVariableButton = e.relatedTarget?.closest(\"[data-variable-button]\");\n\n if (!isToSuggestions && !isToVariableButton) {\n setTextInputRef({ ref: null, caretPosition: null });\n setTextInputState({\n isFocused: false,\n hasVariables: false,\n showVariablePopup: false,\n });\n }\n },\n [setTextInputState, setTextInputRef]\n );\n\n // Track caret position only when focused\n const handleSelect = (e: React.SyntheticEvent) => {\n const target = e.target as HTMLInputElement | HTMLTextAreaElement;\n const data = {\n ref: target,\n caretPosition: target.selectionStart,\n };\n setTextInputRef(data);\n setLastActiveInputRef(data);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (showSuggestions) {\n switch (e.key) {\n case \"ArrowUp\":\n e.preventDefault();\n setSelectedIndex((prev: number) => (prev > 0 ? prev - 1 : variables.length - 1));\n break;\n case \"ArrowDown\":\n e.preventDefault();\n setSelectedIndex((prev: number) => (prev < variables.length - 1 ? prev + 1 : 0));\n break;\n case \"Enter\":\n if (variables[selectedIndex]) {\n e.preventDefault();\n e.stopPropagation();\n insertVariable(variables[selectedIndex]);\n return;\n }\n break;\n case \"Escape\":\n setShowSuggestions(false);\n e.preventDefault();\n e.stopPropagation();\n break;\n }\n }\n\n props.onKeyDown?.(e);\n };\n\n const insertVariable = (variable: string) => {\n const element = inputRef.current;\n if (!element) return;\n\n const value = element.value;\n const selectionStart = element.selectionStart || 0;\n const beforeCursor = value.substring(0, selectionStart - 2); // Remove {{\n const afterCursor = value.substring(selectionStart);\n\n const newValue = `${beforeCursor}{{${variable}}}${afterCursor}`;\n const newCursorPosition = selectionStart + variable.length + 3; // +3 to account for the closing braces\n\n if (onChange) {\n const event = {\n target: { ...element, value: newValue },\n } as unknown as React.ChangeEvent<typeof element>;\n onChange(event);\n }\n\n // Need to use setTimeout to ensure the value is updated before setting selection\n setTimeout(() => {\n element.value = newValue;\n element.setSelectionRange(newCursorPosition, newCursorPosition);\n }, 0);\n\n setShowSuggestions(false);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const element = e.target;\n const value = element.value;\n const selectionStart = element.selectionStart || 0;\n\n // Check if user just typed {{\n if (value.slice(selectionStart - 2, selectionStart) === \"{{\") {\n const containerRect = containerRef.current?.getBoundingClientRect();\n\n if (containerRect) {\n // Calculate cursor position for suggestions popup\n const textBeforeCursor = value.slice(0, selectionStart);\n const tempSpan = document.createElement(\"span\");\n tempSpan.style.font = window.getComputedStyle(element).font;\n tempSpan.style.whiteSpace = \"pre-wrap\";\n tempSpan.textContent = textBeforeCursor;\n document.body.appendChild(tempSpan);\n\n const textWidth = tempSpan.offsetWidth;\n document.body.removeChild(tempSpan);\n\n const lineHeight = parseInt(window.getComputedStyle(element).lineHeight);\n const lines = textBeforeCursor.split(\"\\n\").length - 1;\n\n setCursorPosition({\n left: Math.min(textWidth % element.offsetWidth, element.offsetWidth - 200),\n top: lines * lineHeight + 30,\n });\n setShowSuggestions(true);\n setSelectedIndex(0);\n }\n }\n\n if (onChange) {\n const syntheticEvent = {\n target: element,\n currentTarget: element,\n type: \"change\",\n preventDefault: () => {},\n stopPropagation: () => {},\n } as unknown as React.ChangeEvent<typeof element>;\n onChange(syntheticEvent);\n }\n };\n\n const handleInput = (e: Event) => {\n const element = e.target as HTMLInputElement | HTMLTextAreaElement;\n const value = element.value;\n const selectionStart = element.selectionStart || 0;\n\n // Check for {{ and show suggestions\n if (value.slice(selectionStart - 2, selectionStart) === \"{{\") {\n const containerRect = containerRef.current?.getBoundingClientRect();\n\n if (containerRect) {\n // Calculate cursor position for suggestions popup\n const textBeforeCursor = value.slice(0, selectionStart);\n const tempSpan = document.createElement(\"span\");\n tempSpan.style.font = window.getComputedStyle(element).font;\n tempSpan.style.whiteSpace = \"pre-wrap\";\n tempSpan.textContent = textBeforeCursor;\n document.body.appendChild(tempSpan);\n\n const textWidth = tempSpan.offsetWidth;\n document.body.removeChild(tempSpan);\n\n const lineHeight = parseInt(window.getComputedStyle(element).lineHeight);\n const lines = textBeforeCursor.split(\"\\n\").length - 1;\n\n setCursorPosition({\n left: Math.min(textWidth % element.offsetWidth, element.offsetWidth - 200),\n top: lines * lineHeight + 30,\n });\n setShowSuggestions(true);\n setSelectedIndex(0);\n }\n }\n\n if (onChange) {\n const syntheticEvent = {\n target: element,\n currentTarget: element,\n type: \"change\",\n preventDefault: () => {},\n stopPropagation: () => {},\n } as unknown as React.ChangeEvent<typeof element>;\n onChange(syntheticEvent);\n }\n };\n\n // Add event listener for custom showVariableSuggestions event\n React.useEffect(() => {\n const element = inputRef.current;\n if (!element) return;\n\n const handleShowSuggestions = (e: CustomEvent) => {\n setCursorPosition(e.detail.cursorPosition);\n setShowSuggestions(true);\n setSelectedIndex(0);\n };\n\n element.addEventListener(\"showVariableSuggestions\", handleShowSuggestions as EventListener);\n return () => {\n element.removeEventListener(\n \"showVariableSuggestions\",\n handleShowSuggestions as EventListener\n );\n };\n }, []);\n\n if (as === \"Input\") {\n const inputProps: InputProps = {\n ...(props as InputProps),\n ref: (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n },\n onChange: handleChange as React.ChangeEventHandler<HTMLInputElement>,\n onInput: handleInput as unknown as React.FormEventHandler<HTMLInputElement>,\n onKeyDown: handleKeyDown,\n onFocus: handleFocus,\n onBlur: handleBlur,\n onSelect: handleSelect,\n };\n\n return (\n <div ref={containerRef} className=\"courier-relative\">\n <Input {...inputProps} />\n {showSuggestions && cursorPosition && (\n <div\n style={{\n position: \"absolute\",\n left: `${cursorPosition.left}px`,\n top: `${cursorPosition.top}px`,\n zIndex: 50,\n }}\n >\n <VariableSuggestions\n items={variables}\n command={insertVariable}\n selected={selectedIndex}\n />\n </div>\n )}\n </div>\n );\n }\n\n const textareaProps: TextareaProps = {\n ...(props as TextareaProps),\n ref: (node: HTMLTextAreaElement | null) => {\n inputRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current = node;\n }\n },\n onChange: handleChange as React.ChangeEventHandler<HTMLTextAreaElement>,\n onInput: handleInput as unknown as React.FormEventHandler<HTMLTextAreaElement>,\n onKeyDown: handleKeyDown,\n onFocus: handleFocus,\n onBlur: handleBlur,\n autoResize,\n onSelect: handleSelect,\n };\n\n return (\n <div ref={containerRef} className=\"courier-relative\">\n <Textarea {...textareaProps} />\n {showSuggestions && cursorPosition && (\n <div\n style={{\n position: \"absolute\",\n left: `${cursorPosition.left}px`,\n top: `${cursorPosition.top}px`,\n zIndex: 50,\n }}\n >\n <VariableSuggestions\n items={variables}\n command={insertVariable}\n selected={selectedIndex}\n />\n </div>\n )}\n </div>\n );\n }\n);\n\nTextInput.displayName = \"TextInput\";\n", "import { cn } from \"@/lib\";\n\ninterface VariableSuggestionsProps {\n items: string[];\n command: (item: string) => void;\n selected: number;\n}\n\nexport const VariableSuggestions: React.FC<VariableSuggestionsProps> = ({\n items,\n command,\n selected = 0,\n}) => {\n return (\n <div className=\"courier-bg-white courier-rounded-md courier-shadow-lg courier-border courier-border-border courier-max-h-60 courier-overflow-y-auto\">\n {items.map((item, index) => (\n <button\n key={index}\n className={cn(\n \"courier-w-full courier-px-4 courier-py-2 courier-text-left hover:courier-bg-gray-100 focus:courier-bg-gray-100 focus:courier-outline-none\",\n index === selected ? \"courier-bg-gray-100\" : \"\"\n )}\n onClick={() => command(item)}\n >\n {item}\n </button>\n ))}\n </div>\n );\n};\n", "/**\n * Flattens a nested object of variables into an array of dot-notation paths\n * @example\n * const vars = {\n * user: {\n * firstName: \"John\",\n * contact: {\n * email: \"john@example.com\"\n * }\n * }\n * }\n * getFlattenedVariables(vars) // [\"user.firstName\", \"user.contact.email\"]\n */\nexport const getFlattenedVariables = (\n variables: Record<string, unknown> = {},\n prefix = \"\"\n): string[] => {\n return Object.entries(variables).reduce((acc: string[], [key, value]) => {\n const newKey = prefix ? `${prefix}.${key}` : key;\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return [...acc, ...getFlattenedVariables(value as Record<string, unknown>, newKey)];\n }\n return [...acc, newKey];\n }, []);\n};\n", "import { type IconProps, Icon } from \"@/components/ui-kit/Icon/Icon\";\n\nconst DEFAULT_COLOR = \"#80849D\";\nconst DEFAULT_SIZE = 30;\n\nexport const ButtonAlignLeftIcon = ({\n color = DEFAULT_COLOR,\n width = DEFAULT_SIZE,\n height = DEFAULT_SIZE,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <path\n d=\"M6.375 23.9998C6.375 24.345 6.65482 24.6248 7 24.6248C7.34518 24.6248 7.625 24.345 7.625 23.9998H6.375ZM7.625 7.33317C7.625 6.98799 7.34518 6.70817 7 6.70817C6.65482 6.70817 6.375 6.98799 6.375 7.33317H7.625ZM7.625 23.9998V7.33317H6.375V23.9998H7.625ZM10.4583 16.4995V14.8328H9.20834V16.4995H10.4583ZM11.5 13.7912H21.5V12.5412H11.5V13.7912ZM22.5417 14.8328V16.4995H23.7917V14.8328H22.5417ZM21.5 17.5412H11.5V18.7912H21.5V17.5412ZM22.5417 16.4995C22.5417 16.91 22.5403 17.155 22.5167 17.3306C22.5059 17.4111 22.4932 17.4514 22.4857 17.4695C22.484 17.4737 22.4826 17.4765 22.4818 17.4781C22.481 17.4797 22.4805 17.4804 22.4805 17.4805C22.4804 17.4805 22.4805 17.4803 22.4808 17.4801C22.481 17.4798 22.481 17.4798 22.4807 17.4802L23.3645 18.364C23.6221 18.1065 23.7158 17.7934 23.7556 17.4972C23.793 17.2189 23.7917 16.8747 23.7917 16.4995H22.5417ZM21.5 18.7912C21.8752 18.7912 22.2194 18.7925 22.4977 18.7551C22.7939 18.7153 23.107 18.6216 23.3645 18.364L22.4807 17.4802C22.4803 17.4805 22.4803 17.4805 22.4806 17.4803C22.4808 17.48 22.481 17.4799 22.481 17.48C22.4809 17.48 22.4802 17.4805 22.4786 17.4813C22.477 17.4821 22.4742 17.4835 22.47 17.4852C22.4519 17.4927 22.4116 17.5054 22.3311 17.5162C22.1555 17.5398 21.9105 17.5412 21.5 17.5412V18.7912ZM21.5 13.7912C21.9105 13.7912 22.1555 13.7925 22.3311 13.8161C22.4116 13.8269 22.4519 13.8397 22.47 13.8471C22.4742 13.8489 22.477 13.8502 22.4786 13.8511C22.4802 13.8519 22.4809 13.8524 22.481 13.8524C22.481 13.8524 22.4808 13.8523 22.4806 13.8521C22.4803 13.8518 22.4803 13.8518 22.4807 13.8522L23.3645 12.9683C23.107 12.7108 22.7939 12.6171 22.4977 12.5773C22.2194 12.5398 21.8752 12.5412 21.5 12.5412V13.7912ZM23.7917 14.8328C23.7917 14.4577 23.793 14.1134 23.7556 13.8352C23.7158 13.5389 23.6221 13.2258 23.3645 12.9683L22.4807 13.8522C22.481 13.8526 22.481 13.8526 22.4808 13.8523C22.4805 13.852 22.4804 13.8518 22.4805 13.8519C22.4805 13.8519 22.481 13.8526 22.4818 13.8542C22.4826 13.8558 22.484 13.8586 22.4857 13.8628C22.4932 13.881 22.5059 13.9213 22.5167 14.0017C22.5403 14.1773 22.5417 14.4223 22.5417 14.8328H23.7917ZM10.4583 14.8328C10.4583 14.4223 10.4597 14.1773 10.4833 14.0017C10.4941 13.9213 10.5068 13.881 10.5143 13.8628C10.516 13.8586 10.5174 13.8558 10.5182 13.8542C10.5191 13.8526 10.5195 13.8519 10.5196 13.8519C10.5196 13.8518 10.5195 13.852 10.5192 13.8523C10.519 13.8526 10.519 13.8526 10.5194 13.8522L9.63548 12.9683C9.37796 13.2258 9.28425 13.5389 9.24443 13.8352C9.20702 14.1134 9.20834 14.4577 9.20834 14.8328H10.4583ZM11.5 12.5412C11.1248 12.5412 10.7806 12.5398 10.5023 12.5773C10.2061 12.6171 9.893 12.7108 9.63548 12.9683L10.5194 13.8522C10.5197 13.8518 10.5198 13.8518 10.5195 13.8521C10.5192 13.8523 10.519 13.8524 10.519 13.8524C10.5191 13.8524 10.5198 13.8519 10.5214 13.8511C10.523 13.8502 10.5258 13.8489 10.53 13.8471C10.5481 13.8397 10.5884 13.8269 10.6689 13.8161C10.8445 13.7925 11.0895 13.7912 11.5 13.7912V12.5412ZM9.20834 16.4995C9.20834 16.8747 9.20702 17.2189 9.24443 17.4972C9.28425 17.7934 9.37796 18.1065 9.63548 18.364L10.5194 17.4802C10.519 17.4798 10.519 17.4798 10.5192 17.4801C10.5195 17.4803 10.5196 17.4805 10.5196 17.4805C10.5195 17.4804 10.5191 17.4797 10.5182 17.4781C10.5174 17.4765 10.516 17.4737 10.5143 17.4695C10.5068 17.4514 10.4941 17.4111 10.4833 17.3306C10.4597 17.155 10.4583 16.91 10.4583 16.4995H9.20834ZM11.5 17.5412C11.0895 17.5412 10.8445 17.5398 10.6689 17.5162C10.5884 17.5054 10.5481 17.4927 10.53 17.4852C10.5258 17.4835 10.523 17.4821 10.5214 17.4813C10.5198 17.4805 10.5191 17.48 10.519 17.48C10.519 17.4799 10.5192 17.48 10.5195 17.4803C10.5198 17.4805 10.5197 17.4805 10.5194 17.4802L9.63548 18.364C9.893 18.6216 10.2061 18.7153 10.5023 18.7551C10.7806 18.7925 11.1248 18.7912 11.5 18.7912V17.5412Z\"\n fill={color}\n />\n </Icon>\n);\n\nexport const ButtonAlignCenterIcon = ({\n color = DEFAULT_COLOR,\n width = DEFAULT_SIZE,\n height = DEFAULT_SIZE,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <path\n d=\"M14.9583 7C14.9583 6.65482 14.6785 6.375 14.3333 6.375C13.9881 6.375 13.7083 6.65482 13.7083 7L14.9583 7ZM13.7083 23.3333C13.7083 23.6785 13.9881 23.9583 14.3333 23.9583C14.6785 23.9583 14.9583 23.6785 14.9583 23.3333L13.7083 23.3333ZM13.7083 7L13.7083 12.6665L14.9583 12.6665L14.9583 7L13.7083 7ZM20.375 14.3332L20.375 15.9998L21.625 15.9998L21.625 14.3332L20.375 14.3332ZM19.3333 17.0415L9.33333 17.0415L9.33333 18.2915L19.3333 18.2915L19.3333 17.0415ZM8.29167 15.9998L8.29167 14.3332L7.04167 14.3332L7.04167 15.9998L8.29167 15.9998ZM9.33333 13.2915L19.3333 13.2915L19.3333 12.0415L9.33333 12.0415L9.33333 13.2915ZM8.29167 14.3332C8.29167 13.9227 8.29299 13.6777 8.3166 13.5021C8.32742 13.4216 8.34016 13.3813 8.34763 13.3631C8.34936 13.3589 8.35071 13.3562 8.35155 13.3546C8.35238 13.353 8.35284 13.3523 8.35289 13.3522C8.35292 13.3521 8.35279 13.3523 8.35256 13.3526C8.35232 13.3529 8.35231 13.3529 8.35269 13.3525L7.4688 12.4686C7.21128 12.7262 7.11758 13.0393 7.07775 13.3355C7.04034 13.6138 7.04167 13.958 7.04167 14.3332L8.29167 14.3332ZM9.33333 12.0415C8.95816 12.0415 8.61391 12.0402 8.33566 12.0776C8.03943 12.1174 7.72632 12.2111 7.4688 12.4686L8.35269 13.3525C8.35307 13.3521 8.35308 13.3522 8.35279 13.3524C8.3525 13.3526 8.3523 13.3528 8.35236 13.3527C8.35243 13.3527 8.35313 13.3522 8.35472 13.3514C8.35634 13.3505 8.3591 13.3492 8.3633 13.3475C8.38145 13.34 8.42175 13.3273 8.50222 13.3164C8.67782 13.2928 8.92283 13.2915 9.33333 13.2915L9.33333 12.0415ZM9.33333 17.0415C8.92283 17.0415 8.67782 17.0402 8.50222 17.0166C8.42175 17.0057 8.38145 16.993 8.3633 16.9855C8.3591 16.9838 8.35634 16.9825 8.35472 16.9816C8.35313 16.9808 8.35243 16.9803 8.35236 16.9803C8.3523 16.9802 8.3525 16.9804 8.35279 16.9806C8.35308 16.9808 8.35307 16.9809 8.35269 16.9805L7.4688 17.8644C7.72632 18.1219 8.03943 18.2156 8.33566 18.2554C8.61391 18.2928 8.95816 18.2915 9.33333 18.2915L9.33333 17.0415ZM7.04167 15.9998C7.04167 16.375 7.04034 16.7193 7.07775 16.9975C7.11758 17.2937 7.21128 17.6068 7.4688 17.8644L8.35269 16.9805C8.3523 16.9801 8.35232 16.9801 8.35256 16.9804C8.35279 16.9807 8.35292 16.9809 8.35289 16.9808C8.35284 16.9807 8.35238 16.98 8.35155 16.9784C8.35071 16.9768 8.34936 16.9741 8.34763 16.9699C8.34016 16.9517 8.32742 16.9114 8.3166 16.8309C8.29299 16.6553 8.29167 16.4103 8.29167 15.9998L7.04167 15.9998ZM20.375 15.9998C20.375 16.4103 20.3737 16.6553 20.3501 16.8309C20.3392 16.9114 20.3265 16.9517 20.319 16.9699C20.3173 16.9741 20.316 16.9768 20.3151 16.9784C20.3143 16.98 20.3138 16.9807 20.3138 16.9808C20.3137 16.9809 20.3139 16.9807 20.3141 16.9804C20.3143 16.9801 20.3144 16.9801 20.314 16.9805L21.1979 17.8644C21.4554 17.6068 21.5491 17.2937 21.5889 16.9975C21.6263 16.7193 21.625 16.375 21.625 15.9998L20.375 15.9998ZM19.3333 18.2915C19.7085 18.2915 20.0528 18.2928 20.331 18.2554C20.6272 18.2156 20.9403 18.1219 21.1979 17.8644L20.314 16.9805C20.3136 16.9809 20.3136 16.9808 20.3139 16.9806C20.3142 16.9804 20.3144 16.9802 20.3143 16.9803C20.3142 16.9803 20.3135 16.9808 20.3119 16.9816C20.3103 16.9825 20.3076 16.9838 20.3034 16.9855C20.2852 16.993 20.2449 17.0057 20.1644 17.0166C19.9888 17.0402 19.7438 17.0415 19.3333 17.0415L19.3333 18.2915ZM21.625 14.3332C21.625 13.958 21.6263 13.6138 21.5889 13.3355C21.5491 13.0393 21.4554 12.7262 21.1979 12.4686L20.314 13.3525C20.3144 13.3529 20.3143 13.3529 20.3141 13.3526C20.3139 13.3523 20.3137 13.3521 20.3138 13.3522C20.3138 13.3523 20.3143 13.353 20.3151 13.3546C20.316 13.3562 20.3173 13.3589 20.319 13.3631C20.3265 13.3813 20.3392 13.4216 20.3501 13.5021C20.3737 13.6777 20.375 13.9227 20.375 14.3332L21.625 14.3332ZM19.3333 13.2915C19.7438 13.2915 19.9888 13.2928 20.1644 13.3164C20.2449 13.3273 20.2852 13.34 20.3034 13.3475C20.3076 13.3492 20.3103 13.3505 20.3119 13.3514C20.3135 13.3522 20.3142 13.3527 20.3143 13.3527C20.3144 13.3528 20.3142 13.3526 20.3139 13.3524C20.3136 13.3522 20.3136 13.3521 20.314 13.3525L21.1979 12.4686C20.9403 12.2111 20.6272 12.1174 20.331 12.0776C20.0528 12.0402 19.7085 12.0415 19.3333 12.0415L19.3333 13.2915ZM13.7083 17.6665L13.7083 23.3333L14.9583 23.3333L14.9583 17.6665L13.7083 17.6665Z\"\n fill={color}\n />\n </Icon>\n);\n\nexport const ButtonAlignRightIcon = ({\n color = DEFAULT_COLOR,\n width = DEFAULT_SIZE,\n height = DEFAULT_SIZE,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <path\n d=\"M23.625 23.9998C23.625 24.345 23.3452 24.6248 23 24.6248C22.6548 24.6248 22.375 24.345 22.375 23.9998H23.625ZM22.375 7.33317C22.375 6.98799 22.6548 6.70817 23 6.70817C23.3452 6.70817 23.625 6.98799 23.625 7.33317H22.375ZM22.375 23.9998V7.33317H23.625V23.9998H22.375ZM19.5417 16.4995V14.8328H20.7917V16.4995H19.5417ZM18.5 13.7912H8.49999V12.5412H18.5V13.7912ZM7.45832 14.8328V16.4995H6.20832V14.8328H7.45832ZM8.49999 17.5412H18.5V18.7912H8.49999V17.5412ZM7.45832 16.4995C7.45832 16.91 7.45965 17.155 7.48326 17.3306C7.49408 17.4111 7.50682 17.4514 7.51429 17.4695C7.51602 17.4737 7.51737 17.4765 7.51821 17.4781C7.51904 17.4797 7.5195 17.4804 7.51955 17.4805C7.51958 17.4805 7.51945 17.4803 7.51922 17.4801C7.51898 17.4798 7.51896 17.4798 7.51934 17.4802L6.63546 18.364C6.37794 18.1065 6.28424 17.7934 6.24441 17.4972C6.207 17.2189 6.20832 16.8747 6.20832 16.4995H7.45832ZM8.49999 18.7912C8.12482 18.7912 7.78057 18.7925 7.50232 18.7551C7.20608 18.7153 6.89298 18.6216 6.63546 18.364L7.51934 17.4802C7.51972 17.4805 7.51974 17.4805 7.51945 17.4803C7.51916 17.48 7.51896 17.4799 7.51902 17.48C7.51909 17.48 7.51979 17.4805 7.52138 17.4813C7.52299 17.4821 7.52576 17.4835 7.52996 17.4852C7.54811 17.4927 7.58841 17.5054 7.66888 17.5162C7.84448 17.5398 8.08948 17.5412 8.49999 17.5412V18.7912ZM8.49999 13.7912C8.08948 13.7912 7.84448 13.7925 7.66888 13.8161C7.58841 13.8269 7.54811 13.8397 7.52996 13.8471C7.52576 13.8489 7.52299 13.8502 7.52138 13.8511C7.51979 13.8519 7.51909 13.8524 7.51902 13.8524C7.51896 13.8524 7.51916 13.8523 7.51945 13.8521C7.51974 13.8518 7.51972 13.8518 7.51934 13.8522L6.63546 12.9683C6.89298 12.7108 7.20608 12.6171 7.50232 12.5773C7.78057 12.5398 8.12482 12.5412 8.49999 12.5412V13.7912ZM6.20832 14.8328C6.20832 14.4577 6.207 14.1134 6.24441 13.8352C6.28424 13.5389 6.37794 13.2258 6.63546 12.9683L7.51934 13.8522C7.51896 13.8526 7.51898 13.8526 7.51922 13.8523C7.51945 13.852 7.51958 13.8518 7.51955 13.8519C7.5195 13.8519 7.51904 13.8526 7.51821 13.8542C7.51737 13.8558 7.51602 13.8586 7.51429 13.8628C7.50682 13.881 7.49408 13.9213 7.48326 14.0017C7.45965 14.1773 7.45832 14.4223 7.45832 14.8328H6.20832ZM19.5417 14.8328C19.5417 14.4223 19.5403 14.1773 19.5167 14.0017C19.5059 13.9213 19.4932 13.881 19.4857 13.8628C19.484 13.8586 19.4826 13.8558 19.4818 13.8542C19.4809 13.8526 19.4805 13.8519 19.4804 13.8519C19.4804 13.8518 19.4805 13.852 19.4808 13.8523C19.481 13.8526 19.481 13.8526 19.4806 13.8522L20.3645 12.9683C20.622 13.2258 20.7157 13.5389 20.7556 13.8352C20.793 14.1134 20.7917 14.4577 20.7917 14.8328H19.5417ZM18.5 12.5412C18.8752 12.5412 19.2194 12.5398 19.4977 12.5773C19.7939 12.6171 20.107 12.7108 20.3645 12.9683L19.4806 13.8522C19.4803 13.8518 19.4802 13.8518 19.4805 13.8521C19.4808 13.8523 19.481 13.8524 19.481 13.8524C19.4809 13.8524 19.4802 13.8519 19.4786 13.8511C19.477 13.8502 19.4742 13.8489 19.47 13.8471C19.4519 13.8397 19.4116 13.8269 19.3311 13.8161C19.1555 13.7925 18.9105 13.7912 18.5 13.7912V12.5412ZM20.7917 16.4995C20.7917 16.8747 20.793 17.2189 20.7556 17.4972C20.7157 17.7934 20.622 18.1065 20.3645 18.364L19.4806 17.4802C19.481 17.4798 19.481 17.4798 19.4808 17.4801C19.4805 17.4803 19.4804 17.4805 19.4804 17.4805C19.4805 17.4804 19.4809 17.4797 19.4818 17.4781C19.4826 17.4765 19.484 17.4737 19.4857 17.4695C19.4932 17.4514 19.5059 17.4111 19.5167 17.3306C19.5403 17.155 19.5417 16.91 19.5417 16.4995H20.7917ZM18.5 17.5412C18.9105 17.5412 19.1555 17.5398 19.3311 17.5162C19.4116 17.5054 19.4519 17.4927 19.47 17.4852C19.4742 17.4835 19.477 17.4821 19.4786 17.4813C19.4802 17.4805 19.4809 17.48 19.481 17.48C19.481 17.4799 19.4808 17.48 19.4805 17.4803C19.4802 17.4805 19.4803 17.4805 19.4806 17.4802L20.3645 18.364C20.107 18.6216 19.7939 18.7153 19.4977 18.7551C19.2194 18.7925 18.8752 18.7912 18.5 18.7912V17.5412Z\"\n fill={color}\n />\n </Icon>\n);\n\nexport const ButtonSizeDefaultIcon = ({\n color = DEFAULT_COLOR,\n width = DEFAULT_SIZE,\n height = DEFAULT_SIZE,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <path\n d=\"M10.3007 18.8007C10.0566 19.0448 10.0566 19.4405 10.3007 19.6846C10.5448 19.9287 10.9405 19.9287 11.1846 19.6846L10.3007 18.8007ZM11.1846 10.3154C10.9405 10.0713 10.5448 10.0713 10.3007 10.3154C10.0566 10.5595 10.0566 10.9552 10.3007 11.1993L11.1846 10.3154ZM8.11464 14.375C7.76946 14.375 7.48964 14.6548 7.48964 15C7.48964 15.3452 7.76946 15.625 8.11464 15.625L8.11464 14.375ZM13.5092 15.625C13.8544 15.625 14.1342 15.3452 14.1342 15C14.1342 14.6548 13.8544 14.375 13.5092 14.375L13.5092 15.625ZM11.1846 19.6846L13.9512 16.918L13.0673 16.0341L10.3007 18.8007L11.1846 19.6846ZM13.9512 13.082L11.1846 10.3154L10.3007 11.1993L13.0673 13.9659L13.9512 13.082ZM13.9512 16.918C14.2866 16.5826 14.5836 16.2875 14.7889 16.0183C15.0053 15.7347 15.178 15.4078 15.178 15L13.928 15C13.928 15.0246 13.9267 15.0877 13.7951 15.2601C13.6526 15.4469 13.4277 15.6737 13.0673 16.0341L13.9512 16.918ZM13.0673 13.9659C13.4277 14.3263 13.6526 14.5531 13.7951 14.7399C13.9267 14.9123 13.928 14.9754 13.928 15L15.178 15C15.178 14.5922 15.0053 14.2653 14.7889 13.9817C14.5836 13.7125 14.2866 13.4174 13.9512 13.082L13.0673 13.9659ZM8.11464 15.625L13.5092 15.625L13.5092 14.375L8.11464 14.375L8.11464 15.625Z\"\n fill={color}\n />\n <path\n d=\"M21.6993 18.8007C21.9434 19.0448 21.9434 19.4405 21.6993 19.6846C21.4552 19.9287 21.0595 19.9287 20.8154 19.6846L21.6993 18.8007ZM20.8154 10.3154C21.0595 10.0713 21.4552 10.0713 21.6993 10.3154C21.9434 10.5595 21.9434 10.9552 21.6993 11.1993L20.8154 10.3154ZM23.8854 14.375C24.2305 14.375 24.5104 14.6548 24.5104 15C24.5104 15.3452 24.2305 15.625 23.8854 15.625L23.8854 14.375ZM18.4908 15.625C18.1456 15.625 17.8658 15.3452 17.8658 15C17.8658 14.6548 18.1456 14.375 18.4908 14.375L18.4908 15.625ZM20.8154 19.6846L18.0488 16.918L18.9327 16.0341L21.6993 18.8007L20.8154 19.6846ZM18.0488 13.082L20.8154 10.3154L21.6993 11.1993L18.9327 13.9659L18.0488 13.082ZM18.0488 16.918C17.7134 16.5826 17.4164 16.2875 17.2111 16.0183C16.9947 15.7347 16.822 15.4078 16.822 15L18.072 15C18.072 15.0246 18.0733 15.0877 18.2049 15.2601C18.3474 15.4469 18.5723 15.6737 18.9327 16.0341L18.0488 16.918ZM18.9327 13.9659C18.5723 14.3263 18.3474 14.5531 18.2049 14.7399C18.0733 14.9123 18.072 14.9754 18.072 15L16.822 15C16.822 14.5922 16.9947 14.2653 17.2111 13.9817C17.4164 13.7125 17.7134 13.4174 18.0488 13.082L18.9327 13.9659ZM23.8854 15.625L18.4908 15.625L18.4908 14.375L23.8854 14.375L23.8854 15.625Z\"\n fill={color}\n />\n </Icon>\n);\n\nexport const ButtonSizeFullIcon = ({\n color = DEFAULT_COLOR,\n width = DEFAULT_SIZE,\n height = DEFAULT_SIZE,\n ...props\n}: IconProps) => (\n <Icon {...props} width={width} height={height}>\n <path\n d=\"M9.18459 18.8007C9.42867 19.0448 9.42867 19.4405 9.18459 19.6846C8.94051 19.9287 8.54479 19.9287 8.30071 19.6846L9.18459 18.8007ZM8.30071 10.3154C8.54479 10.0713 8.94051 10.0713 9.18459 10.3154C9.42867 10.5595 9.42867 10.9552 9.18459 11.1993L8.30071 10.3154ZM11.3707 14.375C11.7158 14.375 11.9957 14.6548 11.9957 15C11.9957 15.3452 11.7158 15.625 11.3707 15.625L11.3707 14.375ZM5.97605 15.625C5.63087 15.625 5.35105 15.3452 5.35105 15C5.35105 14.6548 5.63087 14.375 5.97605 14.375L5.97605 15.625ZM8.30071 19.6846L5.5341 16.918L6.41799 16.0341L9.18459 18.8007L8.30071 19.6846ZM5.5341 13.082L8.30071 10.3154L9.18459 11.1993L6.41799 13.9659L5.5341 13.082ZM5.5341 16.918C5.19869 16.5826 4.90174 16.2875 4.69637 16.0183C4.48 15.7347 4.30733 15.4078 4.30733 15L5.55733 15C5.55733 15.0246 5.55861 15.0877 5.69015 15.2601C5.83269 15.4469 6.05759 15.6737 6.41799 16.0341L5.5341 16.918ZM6.41799 13.9659C6.05759 14.3263 5.83269 14.5531 5.69015 14.7399C5.55861 14.9123 5.55733 14.9754 5.55733 15L4.30733 15C4.30733 14.5922 4.48 14.2653 4.69637 13.9817C4.90174 13.7125 5.19869 13.4174 5.5341 13.082L6.41799 13.9659ZM11.3707 15.625L5.97605 15.625L5.97605 14.375L11.3707 14.375L11.3707 15.625Z\"\n fill={color}\n />\n <path\n d=\"M22.8154 18.8007C22.5713 19.0448 22.5713 19.4405 22.8154 19.6846C23.0595 19.9287 23.4552 19.9287 23.6993 19.6846L22.8154 18.8007ZM23.6993 10.3154C23.4552 10.0713 23.0595 10.0713 22.8154 10.3154C22.5713 10.5595 22.5713 10.9552 22.8154 11.1993L23.6993 10.3154ZM20.6293 14.375C20.2842 14.375 20.0043 14.6548 20.0043 15C20.0043 15.3452 20.2842 15.625 20.6293 15.625L20.6293 14.375ZM26.024 15.625C26.3691 15.625 26.649 15.3452 26.649 15C26.649 14.6548 26.3691 14.375 26.024 14.375L26.024 15.625ZM23.6993 19.6846L26.4659 16.918L25.582 16.0341L22.8154 18.8007L23.6993 19.6846ZM26.4659 13.082L23.6993 10.3154L22.8154 11.1993L25.582 13.9659L26.4659 13.082ZM26.4659 16.918C26.8013 16.5826 27.0983 16.2875 27.3036 16.0183C27.52 15.7347 27.6927 15.4078 27.6927 15L26.4427 15C26.4427 15.0246 26.4414 15.0877 26.3099 15.2601C26.1673 15.4469 25.9424 15.6737 25.582 16.0341L26.4659 16.918ZM25.582 13.9659C25.9424 14.3263 26.1673 14.5531 26.3099 14.7399C26.4414 14.9123 26.4427 14.9754 26.4427 15L27.6927 15C27.6927 14.5922 27.52 14.2653 27.3036 13.9817C27.0983 13.7125 26.8013 13.4174 26.4659 13.082L25.582 13.9659ZM20.6293 15.625L26.024 15.625L26.024 14.375L20.6293 14.375L20.6293 15.625Z\"\n fill={color}\n />\n </Icon>\n);\n", "import { mergeAttributes } from \"@tiptap/core\";\nimport TiptapHorizontalRule from \"@tiptap/extension-horizontal-rule\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { v4 as uuidv4 } from \"uuid\";\n// import { TextSelection } from \"prosemirror-state\";\nimport type { DividerProps } from \"./Divider.types\";\nimport { DividerComponentNode } from \"./DividerComponent\";\nimport { generateNodeIds } from \"../../utils\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n divider: {\n setDivider: (props: Partial<DividerProps>) => ReturnType;\n };\n }\n}\n\nexport const defaultDividerProps: DividerProps = {\n padding: 6,\n color: \"#000000\",\n size: 1,\n radius: 0,\n variant: \"divider\",\n};\n\nexport const defaultSpacerProps: DividerProps = {\n padding: 6,\n color: \"transparent\",\n size: 1,\n radius: 0,\n variant: \"spacer\",\n};\n\nexport const Divider = TiptapHorizontalRule.extend({\n name: \"divider\",\n atom: true,\n\n onCreate() {\n generateNodeIds(this.editor, this.name);\n },\n\n addAttributes() {\n return {\n padding: {\n default: defaultDividerProps.padding,\n parseHTML: (element) => element.getAttribute(\"data-padding\"),\n renderHTML: (attributes) => ({\n \"data-padding\": attributes.margin,\n }),\n },\n size: {\n default: defaultDividerProps.size,\n parseHTML: (element) => element.getAttribute(\"data-size\"),\n renderHTML: (attributes) => ({\n \"data-size\": attributes.size,\n }),\n },\n color: {\n default: defaultDividerProps.color,\n parseHTML: (element) => element.getAttribute(\"data-color\"),\n renderHTML: (attributes) => ({\n \"data-color\": attributes.color,\n }),\n },\n width: {\n default: defaultDividerProps.size,\n parseHTML: (element) => element.getAttribute(\"data-size\"),\n renderHTML: (attributes) => ({\n \"data-size\": attributes.size,\n }),\n },\n radius: {\n default: defaultDividerProps.radius,\n parseHTML: (element) => element.getAttribute(\"data-radius\"),\n renderHTML: (attributes) => ({\n \"data-radius\": attributes.radius,\n }),\n },\n variant: {\n default: defaultDividerProps.variant,\n parseHTML: (element) => element.getAttribute(\"data-variant\"),\n renderHTML: (attributes) => ({\n \"data-variant\": attributes.variant,\n }),\n },\n id: {\n default: () => `node-${uuidv4()}`,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => ({\n \"data-id\": attributes.id,\n \"data-node-id\": attributes.id,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"divider\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"divider\",\n }),\n [\"hr\"],\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(DividerComponentNode);\n },\n\n // addCommands() {\n // return {\n // setDivider:\n // (props) =>\n // ({ chain, editor }) => {\n // return chain()\n // .insertContent({\n // type: this.name,\n // attrs: {\n // ...defaultDividerProps,\n // ...props,\n // },\n // })\n // .command(({ tr }) => {\n // const lastNode = tr.doc.lastChild;\n // if (lastNode?.type.name === \"divider\") {\n // const pos = tr.doc.content.size;\n // tr.insert(pos, editor.schema.nodes.paragraph.create());\n // tr.setSelection(TextSelection.create(tr.doc, pos + 1));\n // }\n // return true;\n // })\n // .run();\n // },\n // };\n // },\n});\n\nexport default Divider;\n", "import {\n isNodeSelection, mergeAttributes, Node, nodeInputRule,\n} from '@tiptap/core'\nimport { NodeSelection, TextSelection } from '@tiptap/pm/state'\n\nexport interface HorizontalRuleOptions {\n /**\n * The HTML attributes for a horizontal rule node.\n * @default {}\n * @example { class: 'foo' }\n */\n HTMLAttributes: Record<string, any>\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n horizontalRule: {\n /**\n * Add a horizontal rule\n * @example editor.commands.setHorizontalRule()\n */\n setHorizontalRule: () => ReturnType\n }\n }\n}\n\n/**\n * This extension allows you to insert horizontal rules.\n * @see https://www.tiptap.dev/api/nodes/horizontal-rule\n */\nexport const HorizontalRule = Node.create<HorizontalRuleOptions>({\n name: 'horizontalRule',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n }\n },\n\n group: 'block',\n\n parseHTML() {\n return [{ tag: 'hr' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['hr', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]\n },\n\n addCommands() {\n return {\n setHorizontalRule:\n () => ({ chain, state }) => {\n const { selection } = state\n const { $from: $originFrom, $to: $originTo } = selection\n\n const currentChain = chain()\n\n if ($originFrom.parentOffset === 0) {\n currentChain.insertContentAt(\n {\n from: Math.max($originFrom.pos - 1, 0),\n to: $originTo.pos,\n },\n {\n type: this.name,\n },\n )\n } else if (isNodeSelection(selection)) {\n currentChain.insertContentAt($originTo.pos, {\n type: this.name,\n })\n } else {\n currentChain.insertContent({ type: this.name })\n }\n\n return (\n currentChain\n // set cursor after horizontal rule\n .command(({ tr, dispatch }) => {\n if (dispatch) {\n const { $to } = tr.selection\n const posAfter = $to.end()\n\n if ($to.nodeAfter) {\n if ($to.nodeAfter.isTextblock) {\n tr.setSelection(TextSelection.create(tr.doc, $to.pos + 1))\n } else if ($to.nodeAfter.isBlock) {\n tr.setSelection(NodeSelection.create(tr.doc, $to.pos))\n } else {\n tr.setSelection(TextSelection.create(tr.doc, $to.pos))\n }\n } else {\n // add node after horizontal rule if it’s the end of the document\n const node = $to.parent.type.contentMatch.defaultType?.create()\n\n if (node) {\n tr.insert(posAfter, node)\n tr.setSelection(TextSelection.create(tr.doc, posAfter + 1))\n }\n }\n\n tr.scrollIntoView()\n }\n\n return true\n })\n .run()\n )\n },\n }\n },\n\n addInputRules() {\n return [\n nodeInputRule({\n find: /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n type: this.type,\n }),\n ]\n },\n})\n", "import { cn } from \"@/lib\";\nimport { type NodeViewProps } from \"@tiptap/react\";\nimport { useSetAtom } from \"jotai\";\nimport React, { useCallback } from \"react\";\nimport { SortableItemWrapper } from \"../../ui/SortableItemWrapper\";\nimport { setSelectedNodeAtom } from \"../../ui/TextMenu/store\";\nimport type { DividerProps } from \"./Divider.types\";\n\nexport const DividerComponent: React.FC<\n DividerProps & {\n nodeKey?: string;\n selected?: boolean;\n draggable?: boolean;\n }\n> = ({ padding, color, size, radius, variant = \"divider\" }) => (\n <div className=\"courier-w-full node-element\">\n <hr\n style={{\n marginTop: `${padding}px`,\n marginBottom: `${padding}px`,\n backgroundColor: variant === \"spacer\" ? \"transparent\" : color,\n height: `${size}px`,\n borderRadius: `${radius}px`,\n border: \"none\",\n }}\n data-variant={variant}\n />\n </div>\n);\n\nexport const DividerComponentNode = (props: NodeViewProps) => {\n const setSelectedNode = useSetAtom(setSelectedNodeAtom);\n\n const handleSelect = useCallback(() => {\n if (!props.editor.isEditable) {\n return;\n }\n\n const pos = props.getPos();\n const node = props.editor.state.doc.nodeAt(pos);\n if (node) {\n props.editor.commands.blur();\n setSelectedNode(node);\n }\n }, [props, setSelectedNode]);\n\n return (\n <SortableItemWrapper\n id={props.node.attrs.id}\n className={cn(props.node.attrs.isSelected && \"selected-element\")}\n onClick={handleSelect}\n editor={props.editor}\n >\n <DividerComponent {...(props.node.attrs as DividerProps)} />\n </SortableItemWrapper>\n );\n};\n", "import { z } from \"zod\";\n\nexport const dividerSchema = z.object({\n padding: z.number(),\n color: z.string(),\n size: z.number(),\n radius: z.number(),\n variant: z.enum([\"divider\", \"spacer\"]).default(\"divider\"),\n});\n\nexport interface DividerProps {\n padding: number;\n color: string;\n size: number;\n radius: number;\n variant: \"divider\" | \"spacer\";\n}\n", "import {\n Divider,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormMessage,\n Input,\n InputColor,\n} from \"@/components/ui-kit\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport type { Editor } from \"@tiptap/react\";\nimport { useForm } from \"react-hook-form\";\nimport type { z } from \"zod\";\nimport { useNodeAttributes } from \"../../hooks\";\nimport { FormHeader } from \"../../ui/FormHeader\";\n// import {\n// ButtonSizeDefaultIcon,\n// ButtonSizeFullIcon,\n// } from \"../Button/ButtonIcon\";\nimport { defaultDividerProps } from \"./Divider\";\nimport { dividerSchema } from \"./Divider.types\";\n// import { BorderRadiusIcon, BorderWidthIcon, PaddingVerticalIcon } from \"@/components/ui-kit/Icon\";\nimport { BorderWidthIcon, PaddingVerticalIcon } from \"@/components/ui-kit/Icon\";\n\ninterface DividerFormProps {\n element?: ProseMirrorNode;\n editor: Editor | null;\n}\n\nexport const DividerForm = ({ element, editor }: DividerFormProps) => {\n const form = useForm<z.infer<typeof dividerSchema>>({\n resolver: zodResolver(dividerSchema),\n defaultValues: {\n ...defaultDividerProps,\n ...(element?.attrs as z.infer<typeof dividerSchema>),\n },\n });\n\n const { updateNodeAttributes } = useNodeAttributes({\n editor,\n element,\n form,\n nodeType: \"divider\",\n });\n\n if (!element) {\n return null;\n }\n\n const variant = form.watch(\"variant\");\n\n return (\n <Form {...form}>\n <FormHeader type={variant} />\n <form\n onChange={() => {\n updateNodeAttributes(form.getValues());\n }}\n >\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Frame</h4>\n {/* <div className=\"grid grid-cols-2 gap-6\"> */}\n <FormField\n control={form.control}\n name=\"padding\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input\n startAdornment={<PaddingVerticalIcon />}\n type=\"number\"\n {...field}\n onChange={(e) => {\n field.onChange(e);\n updateNodeAttributes({\n ...form.getValues(),\n margin: e.target.value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n {/* <FormField\n control={form.control}\n name=\"size\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Size</FormLabel>\n <FormControl>\n <ToggleGroup\n type=\"single\"\n className=\"justify-start\"\n value={field.value}\n onValueChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n size: value\n });\n }}\n >\n <ToggleGroupItem value=\"default\">\n <ButtonSizeDefaultIcon />\n </ToggleGroupItem>\n <ToggleGroupItem value=\"full\">\n <ButtonSizeFullIcon />\n </ToggleGroupItem>\n </ToggleGroup>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n /> */}\n {/* </div> */}\n\n {variant === \"divider\" && (\n <>\n <Divider className=\"courier-mt-6 courier-mb-4\" />\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Line</h4>\n {/* <div className=\"grid grid-cols-2 gap-3\"> */}\n <FormField\n control={form.control}\n name=\"size\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <Input\n startAdornment={<BorderWidthIcon />}\n type=\"number\"\n min={0}\n {...field}\n onChange={(e) => {\n field.onChange(e);\n updateNodeAttributes({\n ...form.getValues(),\n width: e.target.value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n {/* <FormField\n control={form.control}\n name=\"radius\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <Input startAdornment={<BorderRadiusIcon />} type=\"number\" min={0} {...field} onChange={(e) => {\n field.onChange(e);\n updateNodeAttributes({\n ...form.getValues(),\n radius: e.target.value\n });\n }} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n /> */}\n {/* </div> */}\n <FormField\n control={form.control}\n name=\"color\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <InputColor\n {...field}\n defaultValue={defaultDividerProps.color}\n onChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n [field.name]: value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </>\n )}\n </form>\n </Form>\n );\n};\n", "import { Node } from '@tiptap/core'\n\n/**\n * The default document node which represents the top level node of the editor.\n * @see https://tiptap.dev/api/nodes/document\n */\nexport const Document = Node.create({\n name: 'doc',\n topNode: true,\n content: 'block+',\n})\n", "import { Document as TiptapDocument } from \"@tiptap/extension-document\";\n\nexport const Document = TiptapDocument.extend({\n // content: '(block|columns)+',\n content: \"(block)+\",\n});\n\nexport default Document;\n", "import { Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { DragPlaceholderComponent } from \"./DragPlaceholderComponent\";\n\nexport interface DragPlaceholderOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n dragPlaceholder: {\n setDragPlaceholder: (options: { id: string; type: string; pos?: number }) => ReturnType;\n removeDragPlaceholder: () => ReturnType;\n };\n }\n}\n\nexport const DragPlaceholder = Node.create({\n name: \"dragPlaceholder\",\n group: \"block\",\n atom: true,\n draggable: true,\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) {\n return {};\n }\n return {\n \"data-id\": attributes.id,\n };\n },\n },\n type: {\n default: \"text\",\n parseHTML: (element) => element.getAttribute(\"data-type\"),\n renderHTML: (attributes) => {\n return {\n \"data-type\": attributes.type,\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"drag-placeholder\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", { \"data-type\": \"drag-placeholder\", ...HTMLAttributes }, 0];\n },\n\n addCommands() {\n return {\n setDragPlaceholder:\n (options) =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n const node = this.type.create(options);\n if (typeof options.pos === \"number\") {\n tr.insert(options.pos, node);\n } else {\n tr.replaceSelectionWith(node);\n }\n }\n return true;\n },\n removeDragPlaceholder:\n () =>\n ({ tr, state, dispatch }) => {\n let hasDeleted = false;\n state.doc.descendants((node, pos) => {\n if (node.type.name === this.name) {\n if (dispatch && node?.nodeSize) {\n tr.delete(pos, pos + node.nodeSize);\n hasDeleted = true;\n }\n return false;\n }\n return true;\n });\n return hasDeleted;\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(DragPlaceholderComponent, {\n // Enable drag handle and sorting\n as: \"div\",\n className: \"drag-placeholder-wrapper\",\n });\n },\n});\n", "import { cn } from \"@/lib/utils\";\nimport type { DraggableSyntheticListeners } from \"@dnd-kit/core\";\nimport { useSortable } from \"@dnd-kit/sortable\";\nimport type { Transform } from \"@dnd-kit/utilities\";\nimport type { NodeViewProps } from \"@tiptap/react\";\nimport { NodeViewWrapper } from \"@tiptap/react\";\nimport React, { forwardRef, useEffect, useState } from \"react\";\n\nfunction useMountStatus() {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n const timeout = setTimeout(() => setIsMounted(true), 500);\n return () => clearTimeout(timeout);\n }, []);\n\n return isMounted;\n}\n\ninterface SortablePlaceholderProps {\n children: React.ReactNode;\n id: string;\n className?: string;\n dragOverlay?: boolean;\n handleProps?: Record<string, unknown>;\n fadeIn?: boolean;\n transform?: Transform | null;\n listeners?: DraggableSyntheticListeners;\n transition?: string | null;\n}\n\nconst SortablePlaceholder = forwardRef<HTMLDivElement, SortablePlaceholderProps>(\n ({ children, className, dragOverlay, id }, ref) => {\n useEffect(() => {\n if (!dragOverlay) {\n return;\n }\n document.body.style.cursor = \"grabbing\";\n return () => {\n document.body.style.cursor = \"\";\n };\n }, [dragOverlay]);\n\n return (\n <NodeViewWrapper\n ref={ref}\n data-cypress=\"draggable-item\"\n data-node-view-wrapper\n data-id={id}\n className={cn(\"courier-flex courier-items-start courier-gap-2 courier-pl-6\", className)}\n >\n {children}\n </NodeViewWrapper>\n );\n }\n);\n\nexport const DragPlaceholderComponent: React.FC<NodeViewProps> = ({ node }) => {\n const type = node.attrs.type;\n const id = node.attrs.id;\n\n const { setNodeRef, setActivatorNodeRef, listeners, isDragging, transform, transition } =\n useSortable({\n id,\n });\n\n const mounted = useMountStatus();\n const mountedWhileDragging = isDragging && !mounted;\n\n return (\n <SortablePlaceholder\n ref={setNodeRef}\n id={id}\n transition={transition}\n transform={transform}\n fadeIn={mountedWhileDragging}\n listeners={listeners}\n handleProps={{ ref: setActivatorNodeRef }}\n >\n <div\n className={cn(\n \"courier-relative courier-flex courier-flex-grow courier-items-center courier-px-5 courier-py-[18px] courier-bg-background/50\",\n \"courier-border-2 courier-border-dashed courier-border-primary/30 courier-rounded-md\",\n \"courier-animate-pulse\"\n )}\n >\n <div className=\"courier-text-muted-foreground\">\n {type === \"text\"\n ? \"Text\"\n : type === \"heading\"\n ? \"Heading\"\n : type === \"spacer\"\n ? \"Spacer\"\n : type === \"divider\"\n ? \"Divider\"\n : type === \"button\"\n ? \"Button\"\n : type === \"image\"\n ? \"Image\"\n : type}\n </div>\n </div>\n </SortablePlaceholder>\n );\n};\n", "import type { Editor } from \"@tiptap/core\";\nimport { Extension } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\n\nexport interface FileHandlerOptions {\n allowedMimeTypes?: string[];\n onDrop?: (editor: Editor, files: File[], pos: number) => void;\n onPaste?: (editor: Editor, files: File[]) => void;\n}\n\nexport const FileHandlerPlugin = new PluginKey(\"file-handler\");\n\nexport const FileHandler = Extension.create<FileHandlerOptions>({\n name: \"fileHandler\",\n\n addOptions() {\n return {\n allowedMimeTypes: [],\n onDrop: () => {},\n onPaste: () => {},\n };\n },\n\n addProseMirrorPlugins() {\n const { allowedMimeTypes, onDrop, onPaste } = this.options;\n\n return [\n new Plugin({\n key: FileHandlerPlugin,\n props: {\n handleDrop: (view, event, _, moved) => {\n if (!event.dataTransfer?.files || moved) {\n return false;\n }\n\n const { files } = event.dataTransfer;\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n });\n\n if (!coordinates) {\n return false;\n }\n\n const filteredFiles = Array.from(files).filter((file) =>\n allowedMimeTypes?.includes(file.type)\n );\n\n if (filteredFiles.length === 0) {\n return false;\n }\n\n event.preventDefault();\n\n if (onDrop) {\n onDrop(this.editor, filteredFiles, coordinates.pos);\n }\n\n return true;\n },\n\n handlePaste: (_, event) => {\n if (!event.clipboardData?.files) {\n return false;\n }\n\n const { files } = event.clipboardData;\n const filteredFiles = Array.from(files).filter((file) =>\n allowedMimeTypes?.includes(file.type)\n );\n\n if (filteredFiles.length === 0) {\n return false;\n }\n\n event.preventDefault();\n\n if (onPaste) {\n onPaste(this.editor, filteredFiles);\n }\n\n return true;\n },\n },\n }),\n ];\n },\n});\n\nexport default FileHandler;\n", "import { mergeAttributes } from \"@tiptap/core\";\nimport TiptapHeading from \"@tiptap/extension-heading\";\nimport type { Level } from \"@tiptap/extension-heading\";\nimport { defaultTextBlockProps, TextBlockComponentNode } from \"../TextBlock\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { generateNodeIds } from \"../../utils\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n heading: {\n setHeading: (attributes: { level: Level }) => ReturnType;\n toggleHeading: (attributes: { level: Level }) => ReturnType;\n };\n textAlign: {\n setTextAlign: (alignment: string) => ReturnType;\n unsetTextAlign: () => ReturnType;\n };\n }\n}\n\nexport const Heading = TiptapHeading.extend({\n addOptions() {\n return {\n ...this.parent?.(),\n HTMLAttributes: {\n class: \"\",\n },\n };\n },\n onCreate() {\n generateNodeIds(this.editor, this.name);\n },\n\n addAttributes() {\n return {\n ...this.parent?.(),\n paddingVertical: {\n default: defaultTextBlockProps.paddingVertical,\n parseHTML: (element) =>\n element.style.paddingTop\n ? parseInt(element.style.paddingTop)\n : defaultTextBlockProps.paddingVertical,\n renderHTML: (attributes) => ({\n style: `padding-top: ${attributes.paddingVertical}px; padding-bottom: ${attributes.paddingVertical}px;`,\n }),\n },\n paddingHorizontal: {\n default: defaultTextBlockProps.paddingHorizontal,\n parseHTML: (element) =>\n element.style.paddingLeft\n ? parseInt(element.style.paddingLeft)\n : defaultTextBlockProps.paddingHorizontal,\n renderHTML: (attributes) => ({\n style: `padding-left: ${attributes.paddingHorizontal}px; padding-right: ${attributes.paddingHorizontal}px;`,\n }),\n },\n textAlign: {\n default: defaultTextBlockProps.textAlign,\n parseHTML: (element) => element.style.textAlign || defaultTextBlockProps.textAlign,\n renderHTML: (attributes) => ({\n style: `text-align: ${attributes.textAlign}`,\n }),\n },\n backgroundColor: {\n default: defaultTextBlockProps.backgroundColor,\n parseHTML: (element) =>\n element.style.backgroundColor || defaultTextBlockProps.backgroundColor,\n renderHTML: (attributes) => ({\n style: `background-color: ${attributes.backgroundColor}`,\n }),\n },\n borderWidth: {\n default: defaultTextBlockProps.borderWidth,\n parseHTML: (element) =>\n element.style.borderWidth\n ? parseInt(element.style.borderWidth)\n : defaultTextBlockProps.borderWidth,\n renderHTML: (attributes) => ({\n style: `border-width: ${attributes.borderWidth}px`,\n }),\n },\n borderRadius: {\n default: defaultTextBlockProps.borderRadius,\n parseHTML: (element) =>\n element.style.borderRadius\n ? parseInt(element.style.borderRadius)\n : defaultTextBlockProps.borderRadius,\n renderHTML: (attributes) => ({\n style: `border-radius: ${attributes.borderRadius}px`,\n }),\n },\n borderColor: {\n default: defaultTextBlockProps.borderColor,\n parseHTML: (element) => element.style.borderColor || defaultTextBlockProps.borderColor,\n renderHTML: (attributes) => ({\n style: `border-color: ${attributes.borderColor}`,\n }),\n },\n textColor: {\n default: defaultTextBlockProps.textColor,\n parseHTML: (element) => element.style.color || defaultTextBlockProps.textColor,\n renderHTML: (attributes) => ({\n style: `color: ${attributes.textColor}`,\n }),\n },\n id: {\n default: () => null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => ({\n \"data-id\": attributes.id,\n }),\n },\n };\n },\n\n addCommands() {\n return {\n // setHeading: (attributes) => ({ chain }) => {\n // return chain()\n // .setHeading(attributes)\n // .updateAttributes(this.name, {\n // ...defaultTextBlockProps,\n // id: `node-${uuidv4()}`\n // })\n // .run()\n // },\n setTextAlign:\n (alignment) =>\n ({ chain }) => {\n return chain().updateAttributes(this.name, { textAlign: alignment }).run();\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"heading\"]',\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const nodeLevel = parseInt(node.attrs.level, 10) as Level;\n const hasLevel = this.options.levels.includes(nodeLevel);\n const level = hasLevel ? nodeLevel : this.options.levels[0];\n\n return [`h${level}`, mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(TextBlockComponentNode);\n },\n});\n\nexport default Heading;\n", "import { mergeAttributes, Node, textblockTypeInputRule } from '@tiptap/core'\n\n/**\n * The heading level options.\n */\nexport type Level = 1 | 2 | 3 | 4 | 5 | 6\n\nexport interface HeadingOptions {\n /**\n * The available heading levels.\n * @default [1, 2, 3, 4, 5, 6]\n * @example [1, 2, 3]\n */\n levels: Level[],\n\n /**\n * The HTML attributes for a heading node.\n * @default {}\n * @example { class: 'foo' }\n */\n HTMLAttributes: Record<string, any>,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n heading: {\n /**\n * Set a heading node\n * @param attributes The heading attributes\n * @example editor.commands.setHeading({ level: 1 })\n */\n setHeading: (attributes: { level: Level }) => ReturnType,\n /**\n * Toggle a heading node\n * @param attributes The heading attributes\n * @example editor.commands.toggleHeading({ level: 1 })\n */\n toggleHeading: (attributes: { level: Level }) => ReturnType,\n }\n }\n}\n\n/**\n * This extension allows you to create headings.\n * @see https://www.tiptap.dev/api/nodes/heading\n */\nexport const Heading = Node.create<HeadingOptions>({\n name: 'heading',\n\n addOptions() {\n return {\n levels: [1, 2, 3, 4, 5, 6],\n HTMLAttributes: {},\n }\n },\n\n content: 'inline*',\n\n group: 'block',\n\n defining: true,\n\n addAttributes() {\n return {\n level: {\n default: 1,\n rendered: false,\n },\n }\n },\n\n parseHTML() {\n return this.options.levels\n .map((level: Level) => ({\n tag: `h${level}`,\n attrs: { level },\n }))\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const hasLevel = this.options.levels.includes(node.attrs.level)\n const level = hasLevel\n ? node.attrs.level\n : this.options.levels[0]\n\n return [`h${level}`, mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n setHeading: attributes => ({ commands }) => {\n if (!this.options.levels.includes(attributes.level)) {\n return false\n }\n\n return commands.setNode(this.name, attributes)\n },\n toggleHeading: attributes => ({ commands }) => {\n if (!this.options.levels.includes(attributes.level)) {\n return false\n }\n\n return commands.toggleNode(this.name, 'paragraph', attributes)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return this.options.levels.reduce((items, level) => ({\n ...items,\n ...{\n [`Mod-Alt-${level}`]: () => this.editor.commands.toggleHeading({ level }),\n },\n }), {})\n },\n\n addInputRules() {\n return this.options.levels.map(level => {\n return textblockTypeInputRule({\n find: new RegExp(`^(#{${Math.min(...this.options.levels)},${level}})\\\\s$`),\n type: this.type,\n getAttributes: {\n level,\n },\n })\n })\n },\n})\n", "import { z } from \"zod\";\n\nexport const textBlockSchema = z.object({\n paddingVertical: z.number(),\n paddingHorizontal: z.number(),\n backgroundColor: z.string(),\n borderWidth: z.number(),\n borderRadius: z.number(),\n borderColor: z.string(),\n textColor: z.string(),\n textAlign: z.enum([\"left\", \"center\", \"right\", \"justify\"]).default(\"left\"),\n selected: z.boolean().default(false),\n id: z.string().optional(),\n});\n\nexport interface TextBlockProps {\n paddingVertical: number;\n paddingHorizontal: number;\n backgroundColor: string;\n borderWidth: number;\n borderRadius: number;\n borderColor: string;\n textColor: string;\n textAlign: \"left\" | \"center\" | \"right\" | \"justify\";\n selected: boolean;\n id?: string;\n}\n\nexport const defaultTextBlockProps: TextBlockProps = {\n paddingVertical: 6,\n paddingHorizontal: 0,\n backgroundColor: \"transparent\",\n borderWidth: 0,\n borderRadius: 0,\n borderColor: \"#000000\",\n // TODO: find a way to get the text color from the theme\n textColor: \"#292929\",\n textAlign: \"left\",\n selected: false,\n};\n", "import { cn } from \"@/lib\";\nimport { type NodeViewProps, NodeViewContent, NodeViewWrapper } from \"@tiptap/react\";\nimport { useSetAtom } from \"jotai\";\nimport React, { useCallback } from \"react\";\nimport { SortableItemWrapper } from \"../../ui/SortableItemWrapper\";\nimport { setSelectedNodeAtom } from \"../../ui/TextMenu/store\";\nimport type { TextBlockProps } from \"./TextBlock.types\";\n\ntype AllowedTags = \"p\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\nexport const TextBlockComponent: React.FC<\n TextBlockProps & {\n nodeKey?: string;\n selected?: boolean;\n level?: number;\n type?: string;\n }\n> = ({\n paddingVertical,\n paddingHorizontal,\n textAlign,\n backgroundColor,\n borderWidth,\n borderRadius,\n borderColor,\n textColor,\n level,\n type,\n}) => {\n const tag = type === \"heading\" ? (`h${level}` as AllowedTags) : \"p\";\n return (\n <div className=\"courier-w-full node-element\">\n <div\n className={cn(!textColor && \"is-empty\")}\n style={{\n padding: `${paddingVertical}px ${paddingHorizontal}px`,\n textAlign,\n backgroundColor,\n borderWidth: `${borderWidth}px`,\n borderRadius: `${borderRadius}px`,\n borderColor,\n borderStyle: borderWidth > 0 ? \"solid\" : \"none\",\n color: textColor,\n }}\n >\n <NodeViewContent as={tag} />\n </div>\n </div>\n );\n};\n\nexport const TextBlockComponentNode = (props: NodeViewProps) => {\n const setSelectedNode = useSetAtom(setSelectedNodeAtom);\n\n const handleSelect = useCallback(() => {\n if (!props.editor.isEditable) {\n return;\n }\n\n const pos = props.getPos();\n const node = props.editor.state.doc.nodeAt(pos);\n if (node) {\n setSelectedNode(node);\n }\n }, [props, setSelectedNode]);\n\n const isEmpty = !props.node.content || props.node.content.size === 0;\n\n const $pos = props.editor.state.doc.resolve(props.getPos());\n const isBlockquote = $pos.parent.type.name === \"blockquote\";\n\n if (isBlockquote) {\n return (\n <NodeViewWrapper\n className={cn(props.node.attrs.isSelected && \"selected-element\")}\n onClick={handleSelect}\n >\n <TextBlockComponent {...(props.node.attrs as TextBlockProps)} type={props.node.type.name} />\n </NodeViewWrapper>\n );\n }\n\n return (\n <SortableItemWrapper\n id={props.node.attrs.id}\n className={cn(props.node.attrs.isSelected && \"selected-element\", isEmpty && \"is-empty\")}\n onClick={handleSelect}\n editor={props.editor}\n >\n <TextBlockComponent {...(props.node.attrs as TextBlockProps)} type={props.node.type.name} />\n </SortableItemWrapper>\n );\n};\n", "import {\n Divider,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormMessage,\n Input,\n InputColor,\n} from \"@/components/ui-kit\";\nimport {\n BorderRadiusIcon,\n BorderWidthIcon,\n PaddingHorizontalIcon,\n PaddingVerticalIcon,\n} from \"@/components/ui-kit/Icon\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport type { Editor } from \"@tiptap/react\";\nimport { useForm } from \"react-hook-form\";\nimport type { z } from \"zod\";\nimport { useNodeAttributes } from \"../../hooks\";\nimport { FormHeader } from \"../../ui/FormHeader\";\nimport { defaultTextBlockProps, textBlockSchema } from \"./TextBlock.types\";\n\ninterface TextBlockFormProps {\n element?: ProseMirrorNode;\n editor: Editor | null;\n}\n\nexport const TextBlockForm = ({ element, editor }: TextBlockFormProps) => {\n const form = useForm<z.infer<typeof textBlockSchema>>({\n resolver: zodResolver(textBlockSchema),\n defaultValues: {\n ...defaultTextBlockProps,\n ...(element?.attrs as z.infer<typeof textBlockSchema>),\n },\n });\n\n const { updateNodeAttributes } = useNodeAttributes({\n editor,\n element,\n form,\n nodeType: element?.type.name || \"paragraph\",\n });\n\n if (!element) {\n return null;\n }\n\n return (\n <Form {...form}>\n <FormHeader type=\"text\" />\n <form\n onChange={() => {\n updateNodeAttributes(form.getValues());\n }}\n >\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Frame</h4>\n <div className=\"courier-flex courier-flex-row courier-gap-3 courier-mb-3\">\n <FormField\n control={form.control}\n name=\"paddingHorizontal\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input\n startAdornment={<PaddingHorizontalIcon />}\n type=\"number\"\n min={0}\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"paddingVertical\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input\n startAdornment={<PaddingVerticalIcon />}\n type=\"number\"\n min={0}\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n <FormField\n control={form.control}\n name=\"backgroundColor\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <InputColor\n {...field}\n defaultValue={defaultTextBlockProps.backgroundColor}\n onChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n [field.name]: value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Divider className=\"courier-mb-4\" />\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Text</h4>\n <FormField\n control={form.control}\n name=\"textColor\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <InputColor\n {...field}\n transparent={false}\n defaultValue={defaultTextBlockProps.textColor}\n onChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n [field.name]: value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Divider className=\"courier-mb-4\" />\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Border</h4>\n <div className=\"courier-flex courier-flex-row courier-gap-3 courier-mb-3\">\n <FormField\n control={form.control}\n name=\"borderWidth\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input startAdornment={<BorderWidthIcon />} type=\"number\" min={0} {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"borderRadius\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input startAdornment={<BorderRadiusIcon />} type=\"number\" min={0} {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n <FormField\n control={form.control}\n name=\"borderColor\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <InputColor\n {...field}\n defaultValue={defaultTextBlockProps.borderColor}\n onChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n [field.name]: value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </form>\n </Form>\n );\n};\n", "import type { ChainedCommands } from \"@tiptap/core\";\nimport { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { ImageBlockView } from \"./components/ImageBlockView\";\nimport type { ImageBlockProps } from \"./ImageBlock.types\";\nimport { generateNodeIds } from \"../../utils\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n imageBlock: {\n setImageBlock: (props: Partial<ImageBlockProps>) => ReturnType;\n setImageBlockAt: (props: { pos: number; src: string }) => ReturnType;\n setImageBlockAlign: (alignment: \"left\" | \"center\" | \"right\") => ReturnType;\n setImageBlockWidth: (width: number) => ReturnType;\n };\n }\n}\n\nexport const defaultImageProps: ImageBlockProps = {\n sourcePath: \"\",\n link: \"\",\n alt: \"\",\n alignment: \"center\",\n width: 1,\n borderWidth: 0,\n borderRadius: 0,\n borderColor: \"#000000\",\n isUploading: false,\n imageNaturalWidth: 0,\n};\n\nexport const ImageBlock = Node.create({\n name: \"imageBlock\",\n group: \"block\",\n atom: true,\n inline: false,\n\n onCreate() {\n generateNodeIds(this.editor, this.name);\n },\n\n addOptions() {\n return {\n ...this.parent?.(),\n placeholder: \"\",\n };\n },\n\n addAttributes() {\n return {\n sourcePath: {\n default: defaultImageProps.sourcePath,\n parseHTML: (element) => element.getAttribute(\"data-source-path\") || \"\",\n renderHTML: (attributes) => ({\n \"data-source-path\": attributes.sourcePath || \"\",\n }),\n },\n link: {\n default: defaultImageProps.link,\n parseHTML: (element) => element.getAttribute(\"data-link\"),\n renderHTML: (attributes) => ({\n \"data-link\": attributes.link,\n }),\n },\n alt: {\n default: defaultImageProps.alt,\n parseHTML: (element) => element.getAttribute(\"data-alt\"),\n renderHTML: (attributes) => ({\n \"data-alt\": attributes.alt,\n }),\n },\n alignment: {\n default: defaultImageProps.alignment,\n parseHTML: (element) => element.getAttribute(\"data-alignment\"),\n renderHTML: (attributes) => ({\n \"data-alignment\": attributes.alignment,\n }),\n },\n width: {\n default: defaultImageProps.width,\n parseHTML: (element) => element.getAttribute(\"data-width\"),\n renderHTML: (attributes) => ({\n \"data-width\": attributes.width,\n }),\n },\n imageNaturalWidth: {\n default: defaultImageProps.imageNaturalWidth,\n parseHTML: (element) => element.getAttribute(\"data-natural-width\"),\n renderHTML: (attributes) => ({\n \"data-natural-width\": attributes.imageNaturalWidth,\n }),\n },\n borderWidth: {\n default: defaultImageProps.borderWidth,\n parseHTML: (element) => element.getAttribute(\"data-border-width\"),\n renderHTML: (attributes) => ({\n \"data-border-width\": attributes.borderWidth,\n }),\n },\n borderRadius: {\n default: defaultImageProps.borderRadius,\n parseHTML: (element) => element.getAttribute(\"data-border-radius\"),\n renderHTML: (attributes) => ({\n \"data-border-radius\": attributes.borderRadius,\n }),\n },\n borderColor: {\n default: defaultImageProps.borderColor,\n parseHTML: (element) => element.getAttribute(\"data-border-color\"),\n renderHTML: (attributes) => ({\n \"data-border-color\": attributes.borderColor,\n }),\n },\n isUploading: {\n default: defaultImageProps.isUploading,\n parseHTML: (element) => element.getAttribute(\"data-is-uploading\"),\n renderHTML: (attributes) => ({\n \"data-is-uploading\": attributes.isUploading,\n }),\n },\n id: {\n default: undefined,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => ({\n \"data-id\": attributes.id,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"image-block\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n \"data-type\": \"image-block\",\n }),\n 0,\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ImageBlockView);\n },\n\n addCommands() {\n return {\n setImageBlock:\n (props) =>\n ({ chain }) => {\n return chain()\n .insertContent({\n type: this.name,\n attrs: {\n ...defaultImageProps,\n ...props,\n },\n })\n .run();\n },\n setImageBlockAt:\n ({ pos, src }) =>\n ({ chain }) => {\n return chain()\n .insertContentAt(pos, {\n type: this.name,\n attrs: {\n ...defaultImageProps,\n sourcePath: src || \"\",\n },\n })\n .run();\n },\n setImageBlockAlign:\n (alignment) =>\n ({ commands }) => {\n return commands.updateAttributes(this.name, { alignment });\n },\n setImageBlockWidth:\n (width) =>\n ({ commands }) => {\n return commands.updateAttributes(this.name, { width });\n },\n uploadImage:\n (file: File) =>\n ({ chain }: { chain: () => ChainedCommands }) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n chain()\n .setImageBlock({\n sourcePath: reader.result as string,\n isUploading: true,\n })\n .run();\n };\n\n reader.readAsDataURL(file);\n return true;\n },\n };\n },\n});\n", "interface UploadImageResponse {\n tenant: {\n notification: {\n uploadImage: {\n url: string;\n };\n };\n };\n}\n\nexport const uploadImage = async (\n file: File,\n config: {\n apiUrl: string;\n token: string;\n tenantId: string;\n clientKey: string;\n }\n): Promise<string> => {\n const { apiUrl, token, clientKey } = config;\n\n // Validate file type\n if (!file.type.startsWith(\"image/\")) {\n throw new Error(`Invalid file type: ${file.type}. Only image files are supported.`);\n }\n\n // Generate a random filename but keep the original extension\n const fileExtension = file.name.split(\".\").pop() || \"\";\n const randomFilename = `image_${Date.now()}_${Math.random().toString(36).substring(2, 10)}.${fileExtension}`;\n\n // Read file as Data URL (base64)\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === \"string\") {\n resolve(reader.result);\n } else {\n reject(new Error(\"Failed to read file as data URL\"));\n }\n };\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n });\n\n // Extract the base64 data without the Data URL prefix\n const base64Data = dataUrl.split(\",\")[1];\n\n try {\n const response = await fetch(apiUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n \"X-COURIER-CLIENT-KEY\": clientKey,\n },\n body: JSON.stringify({\n query: `\n mutation UploadImage($input: UploadImageInput!) {\n tenant {\n notification {\n uploadImage(input: $input) {\n url\n }\n }\n }\n }\n `,\n variables: {\n input: {\n name: randomFilename, // Use random filename here\n type: file.type,\n data: base64Data,\n },\n },\n }),\n });\n\n const result = await response.json();\n\n if (result.errors) {\n throw new Error(result.errors.map((error: { message: string }) => error.message).join(\"\\n\"));\n }\n\n const data = result.data as UploadImageResponse;\n return data.tenant.notification.uploadImage.url;\n } catch (error) {\n console.error(\"Error uploading image:\", error);\n throw error;\n }\n};\n", "import { uploadImage } from \"@/lib/api/uploadImage\";\nimport { cn } from \"@/lib/utils\";\nimport type { Editor, NodeViewProps } from \"@tiptap/react\";\nimport { useAtomValue, useSetAtom } from \"jotai\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { apiUrlAtom, clientKeyAtom, tenantIdAtom, tokenAtom } from \"../../../Providers/store\";\nimport { Loader } from \"../../../ui/Loader/Loader\";\nimport { SortableItemWrapper } from \"../../../ui/SortableItemWrapper\";\nimport { setSelectedNodeAtom } from \"../../../ui/TextMenu/store\";\nimport type { ImageBlockProps } from \"../ImageBlock.types\";\n\nexport const ImageBlockComponent: React.FC<\n ImageBlockProps & {\n nodeKey?: string;\n selected?: boolean;\n draggable?: boolean;\n onFileSelect?: (file: File) => void;\n width: number;\n imageNaturalWidth: number;\n editor?: Editor;\n }\n> = ({\n sourcePath,\n alt,\n alignment,\n borderWidth,\n borderRadius,\n borderColor,\n isUploading,\n width,\n imageNaturalWidth,\n onFileSelect,\n editor,\n}) => {\n const [isDragging, setIsDragging] = useState(false);\n const [isImageLoading, setIsImageLoading] = useState(true);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n\n useEffect(() => {\n if (sourcePath) {\n setIsImageLoading(true);\n }\n }, [sourcePath]);\n\n // Update imageNaturalWidth when image loads\n useEffect(() => {\n if (sourcePath && !imageNaturalWidth && editor) {\n const img = new Image();\n img.onload = () => {\n try {\n if (!editor.view || !editor.state) return;\n const pos = editor.view.state.selection.from;\n editor\n .chain()\n .setNodeSelection(pos)\n .updateAttributes(\"imageBlock\", {\n imageNaturalWidth: img.naturalWidth,\n })\n .run();\n } catch (error) {\n // console.warn('Editor not ready for image update:', error);\n }\n };\n img.src = sourcePath;\n }\n }, [sourcePath, imageNaturalWidth, editor]);\n\n // Memoize the width percentage calculation to avoid recalculations\n const calculateWidthPercentage = useCallback(\n (naturalWidth: number) => {\n // Get the editor's container width\n const editorContainer = editor?.view?.dom?.closest(\".ProseMirror\");\n const containerWidth = editorContainer?.clientWidth || 1000;\n const percentage = Math.min(100, (naturalWidth / containerWidth) * 100);\n\n // Round to integer\n return Math.round(percentage);\n },\n [editor]\n );\n\n // Memoize the original width percentage to avoid recalculations during renders\n const originalWidthPercentage = useMemo(\n () => calculateWidthPercentage(imageNaturalWidth),\n [calculateWidthPercentage, imageNaturalWidth]\n );\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.dataTransfer.types.includes(\"Files\")) {\n const items = Array.from(e.dataTransfer.items);\n const hasImageFile = items.some((item) => item.type.startsWith(\"image/\"));\n if (hasImageFile) {\n setIsDragging(true);\n e.dataTransfer.dropEffect = \"copy\";\n }\n }\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n }, []);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.dataTransfer.types.includes(\"Files\")) {\n const items = Array.from(e.dataTransfer.items);\n const hasImageFile = items.some((item) => item.type.startsWith(\"image/\"));\n if (hasImageFile) {\n setIsDragging(true);\n }\n }\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n\n // Check if we have files and at least one is an image\n const files = Array.from(e.dataTransfer.files);\n\n const imageFile = files.find((file) => file.type.startsWith(\"image/\"));\n if (imageFile && onFileSelect) {\n onFileSelect(imageFile);\n }\n },\n [onFileSelect]\n );\n\n const handleFileSelect = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file && onFileSelect) {\n onFileSelect(file);\n }\n },\n [onFileSelect]\n );\n\n const handleBrowseClick = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n if (!sourcePath) {\n return (\n <div\n className={cn(\n \"courier-w-full node-element courier-empty-image courier-h-[160px] courier-bg-gray-100 courier-rounded-md courier-flex courier-flex-row courier-items-center courier-justify-center courier-cursor-pointer courier-transition-colors courier-flex-1\",\n isDragging && \"courier-border-primary courier-bg-gray-50\"\n )}\n onDragOver={handleDragOver}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{ pointerEvents: \"all\" }}\n >\n {isUploading ? (\n <Loader className=\"courier-w-8 courier-h-8\" />\n ) : (\n <>\n <span className=\"courier-text-sm courier-pointer-events-none courier-inline-block\">\n Drag and drop image, or \n </span>\n <button\n className=\"courier-underline courier-font-medium courier-inline-block courier-text-sm\"\n onClick={handleBrowseClick}\n >\n Browse\n </button>\n </>\n )}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"courier-hidden\"\n onChange={handleFileSelect}\n />\n </div>\n );\n }\n\n return (\n <div className=\"courier-w-full node-element\">\n <div\n className={cn(\n \"courier-relative courier-p-1\",\n (isUploading || isImageLoading) &&\n \"courier-min-h-[200px] courier-min-w-[300px] courier-bg-gray-100\"\n )}\n >\n {(isUploading || isImageLoading) && (\n <div className=\"courier-absolute courier-inset-0 courier-flex courier-items-center courier-justify-center\">\n <Loader className=\"courier-w-8 courier-h-8\" />\n </div>\n )}\n <img\n ref={imgRef}\n src={sourcePath}\n alt={alt}\n className={cn(\n \"courier-h-auto courier-inline-block courier-w-full\",\n {\n left: \"courier-mr-auto\",\n center: \"courier-mx-auto\",\n right: \"courier-ml-auto\",\n }[alignment],\n isUploading && \"courier-opacity-50\",\n (isUploading || isImageLoading) && \"courier-invisible\"\n )}\n style={{\n maxWidth: width === originalWidthPercentage ? `${imageNaturalWidth}px` : `${width}%`,\n borderWidth: `${borderWidth}px`,\n borderRadius: `${borderRadius}px`,\n borderColor,\n borderStyle: borderWidth > 0 ? \"solid\" : \"none\",\n display: \"block\",\n }}\n loading=\"lazy\"\n decoding=\"async\"\n draggable={false}\n onLoad={(e) => {\n setIsImageLoading(false);\n // Update imageNaturalWidth from the actual loaded image if needed\n if (!imageNaturalWidth && editor) {\n try {\n if (!editor.view || !editor.state) return;\n setTimeout(() => {\n const pos = editor.view.state.selection.from;\n editor\n .chain()\n .setNodeSelection(pos)\n .updateAttributes(\"imageBlock\", {\n imageNaturalWidth: (e.target as HTMLImageElement).naturalWidth,\n })\n .run();\n }, 100);\n } catch (error) {\n console.warn(\"Editor not ready for image update:\", error);\n }\n }\n }}\n onError={() => setIsImageLoading(false)}\n />\n </div>\n </div>\n );\n};\n\nexport const ImageBlockView = (props: NodeViewProps) => {\n const setSelectedNode = useSetAtom(setSelectedNodeAtom);\n const apiUrl = useAtomValue(apiUrlAtom);\n const token = useAtomValue(tokenAtom);\n const tenantId = useAtomValue(tenantIdAtom);\n const clientKey = useAtomValue(clientKeyAtom);\n\n const calculateWidthPercentage = useCallback(\n (naturalWidth: number) => {\n // Get the editor's container width\n const editorContainer = props.editor?.view?.dom?.closest(\".ProseMirror\");\n const containerWidth = editorContainer?.clientWidth || 1000;\n const percentage = Math.min(100, (naturalWidth / containerWidth) * 100);\n\n // Round to integer\n return Math.round(percentage);\n },\n [props.editor]\n );\n\n // Add useEffect for initial image load\n useEffect(() => {\n const node = props.editor.state.doc.nodeAt(props.getPos());\n // Only set natural width if it's not already set, but preserve the existing width value\n if (node?.attrs?.sourcePath && !node?.attrs?.imageNaturalWidth) {\n const img = new Image();\n img.onload = () => {\n // Only calculate width percentage if no width is set\n const widthPercentage = node.attrs.width || calculateWidthPercentage(img.naturalWidth);\n\n props.editor\n .chain()\n .focus()\n .setNodeSelection(props.getPos())\n .updateAttributes(\"imageBlock\", {\n width: widthPercentage,\n imageNaturalWidth: img.naturalWidth,\n })\n .run();\n };\n img.src = node.attrs.sourcePath;\n }\n }, [props, props.getPos, calculateWidthPercentage]);\n\n const handleSelect = useCallback(() => {\n if (!props.editor.isEditable) {\n return;\n }\n\n const pos = props.getPos();\n const node = props.editor.state.doc.nodeAt(pos);\n if (node) {\n props.editor.commands.blur();\n setSelectedNode(node);\n }\n }, [props, setSelectedNode]);\n\n const handleFileSelect = useCallback(\n async (file: File) => {\n if (!apiUrl || !token || !tenantId) {\n toast.error(\"Missing configuration for image upload\");\n return;\n }\n\n // Show uploading state immediately\n const pos = props.getPos();\n const node = props.editor.state.doc.nodeAt(pos);\n if (node) {\n props.editor\n .chain()\n .focus()\n .setNodeSelection(pos)\n .updateAttributes(\"imageBlock\", {\n isUploading: true,\n })\n .run();\n }\n\n try {\n // Validate basic file properties to catch obvious issues\n if (!file.type.startsWith(\"image/\")) {\n throw new Error(\"Only image files are supported\");\n }\n\n // First check if file can be read properly\n const reader = new FileReader();\n reader.readAsDataURL(file);\n\n await new Promise((resolve, reject) => {\n reader.onload = resolve;\n reader.onerror = reject;\n });\n\n // Now upload the image once we know the file is valid\n const imageUrl = await uploadImage(file, {\n apiUrl,\n token,\n tenantId,\n clientKey,\n });\n\n // Update the node with the uploaded image URL\n const pos = props.getPos();\n const node = props.editor.state.doc.nodeAt(pos);\n if (node) {\n // Get the natural width of the uploaded image\n const img = new Image();\n img.src = imageUrl;\n\n await new Promise((resolve) => {\n img.onload = resolve;\n });\n\n const widthPercentage = calculateWidthPercentage(img.naturalWidth);\n\n props.editor\n .chain()\n .focus()\n .setNodeSelection(pos)\n .updateAttributes(\"imageBlock\", {\n sourcePath: imageUrl,\n isUploading: false,\n width: widthPercentage,\n imageNaturalWidth: img.naturalWidth,\n })\n .run();\n }\n } catch (error) {\n console.error(\"Error uploading image:\", error);\n let errorMessage = \"Failed to upload image\";\n\n if (error instanceof Error) {\n const errorText = error.message;\n\n if (errorText.includes(\"GraphQL error\")) {\n errorMessage = \"Server error: Could not process image\";\n } else if (errorText.includes(\"network\") || errorText.includes(\"fetch\")) {\n errorMessage = \"Network error: Could not upload image\";\n }\n }\n\n toast.error(errorMessage);\n\n // Reset uploading state on error\n const pos = props.getPos();\n const node = props.editor.state.doc.nodeAt(pos);\n if (node) {\n props.editor\n .chain()\n .focus()\n .setNodeSelection(pos)\n .updateAttributes(\"imageBlock\", {\n isUploading: false,\n })\n .run();\n }\n }\n },\n [props, calculateWidthPercentage, apiUrl, token, tenantId, clientKey]\n );\n\n return (\n <SortableItemWrapper\n id={props.node.attrs.id}\n className={cn(props.node.attrs.isSelected && \"selected-element\")}\n onClick={handleSelect}\n editor={props.editor}\n >\n <ImageBlockComponent\n {...(props.node.attrs as ImageBlockProps)}\n onFileSelect={handleFileSelect}\n editor={props.editor}\n />\n </SortableItemWrapper>\n );\n};\n", "import { cn } from \"@/lib/utils\";\n\nexport const Loader = ({ className }: { className?: string }) => {\n return (\n <div\n className={cn(\n \"courier-flex courier-flex-col courier-items-center courier-justify-center courier-text-ring\",\n className\n )}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"courier-w-6 courier-h-6 courier-animate-spin\"\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n </div>\n );\n};\n", "import { z } from \"zod\";\n\nexport const imageBlockSchema = z.object({\n sourcePath: z.string(),\n link: z.string().optional(),\n alt: z.string().optional(),\n alignment: z.enum([\"left\", \"center\", \"right\"]),\n width: z.number().min(1).max(100),\n borderWidth: z.number(),\n borderRadius: z.number(),\n borderColor: z.string(),\n isUploading: z.boolean().optional(),\n imageNaturalWidth: z.number(),\n});\n\nexport interface ImageBlockProps {\n sourcePath: string;\n link?: string;\n alt?: string;\n alignment: \"left\" | \"center\" | \"right\";\n width: number;\n borderWidth: number;\n borderRadius: number;\n borderColor: string;\n isUploading?: boolean;\n imageNaturalWidth: number;\n}\n", "import {\n Button,\n Divider,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormMessage,\n Input,\n InputColor,\n Slider,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n ToggleGroup,\n ToggleGroupItem,\n} from \"@/components/ui-kit\";\nimport { BorderRadiusIcon, BorderWidthIcon } from \"@/components/ui-kit/Icon\";\nimport { uploadImage } from \"@/lib/api/uploadImage\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport type { Editor } from \"@tiptap/react\";\nimport { ArrowUp } from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport type { z } from \"zod\";\nimport { FormHeader } from \"../../../ui/FormHeader\";\nimport { TextInput } from \"../../../ui/TextInput\";\nimport { useNodeAttributes } from \"../../../hooks\";\nimport { getFlattenedVariables } from \"../../../utils/getFlattenedVariables\";\nimport { useAtomValue } from \"jotai\";\nimport { apiUrlAtom, clientKeyAtom, tenantIdAtom, tokenAtom } from \"../../../Providers/store\";\nimport {\n ButtonAlignCenterIcon,\n ButtonAlignLeftIcon,\n ButtonAlignRightIcon,\n} from \"../../Button/ButtonIcon\";\nimport { defaultImageProps } from \"../ImageBlock\";\nimport { imageBlockSchema } from \"../ImageBlock.types\";\n\nexport interface ImageBlockFormProps {\n element?: ProseMirrorNode;\n editor: Editor | null;\n}\n\nexport const ImageBlockForm = ({ element, editor }: ImageBlockFormProps) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLFormElement>(null);\n const [rawWidthInput, setRawWidthInput] = useState<string>(\"\");\n const [isEditing, setIsEditing] = useState(false);\n const [imageNaturalWidth, setImageNaturalWidth] = useState<number>(\n element?.attrs?.imageNaturalWidth || 0\n );\n const [isUploading, setIsUploading] = useState(false);\n\n // Get the API configuration\n const apiUrl = useAtomValue(apiUrlAtom);\n const token = useAtomValue(tokenAtom);\n const tenantId = useAtomValue(tenantIdAtom);\n const clientKey = useAtomValue(clientKeyAtom);\n\n const form = useForm<z.infer<typeof imageBlockSchema>>({\n resolver: zodResolver(imageBlockSchema),\n defaultValues: {\n ...defaultImageProps,\n ...(element?.attrs as z.infer<typeof imageBlockSchema>),\n },\n mode: \"onChange\",\n });\n\n const { updateNodeAttributes } = useNodeAttributes({\n editor,\n element,\n form,\n nodeType: \"imageBlock\",\n });\n\n // Load image and update natural width if needed\n useEffect(() => {\n const sourcePath = element?.attrs?.sourcePath;\n if (sourcePath && !imageNaturalWidth) {\n const img = new Image();\n img.onload = () => {\n setImageNaturalWidth(img.naturalWidth);\n const updatedValues = {\n ...form.getValues(),\n imageNaturalWidth: img.naturalWidth,\n };\n\n form.setValue(\"imageNaturalWidth\", img.naturalWidth);\n updateNodeAttributes(updatedValues);\n };\n img.src = sourcePath;\n }\n }, [element?.attrs?.sourcePath, imageNaturalWidth, form, updateNodeAttributes]);\n\n const calculateWidthPercentage = useCallback(\n (naturalWidth: number) => {\n // Get the editor's container width\n const editorContainer = editor?.view?.dom?.closest(\".ProseMirror\");\n const containerWidth = editorContainer?.clientWidth || 1000;\n\n if (!naturalWidth) {\n naturalWidth = imageNaturalWidth;\n }\n\n if (!naturalWidth) {\n return 0;\n }\n\n const percentage = Math.min(100, (naturalWidth / containerWidth) * 100);\n const roundedPercentage = Math.round(percentage);\n\n return roundedPercentage;\n },\n [editor, imageNaturalWidth]\n );\n\n const handleUploadClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault(); // Prevent form submission\n fileInputRef.current?.click();\n }, []);\n\n const handleImageLoad = useCallback(\n (img: HTMLImageElement, sourcePath: string) => {\n // Always calculate the new width based on the uploaded image\n const calculatedWidth = calculateWidthPercentage(img.naturalWidth);\n\n // Update the raw input value to match the new width\n setRawWidthInput(`${calculatedWidth}%`);\n setIsEditing(false);\n\n form.setValue(\"sourcePath\", sourcePath);\n form.setValue(\"imageNaturalWidth\", img.naturalWidth);\n form.setValue(\"width\", calculatedWidth);\n\n const updatedValues = {\n ...form.getValues(),\n sourcePath: sourcePath,\n width: calculatedWidth,\n imageNaturalWidth: img.naturalWidth,\n };\n\n updateNodeAttributes(updatedValues);\n },\n [form, updateNodeAttributes, calculateWidthPercentage]\n );\n\n const handleSourcePathChange = useCallback(\n (value: string) => {\n if (!value) return;\n\n const img = new Image();\n img.onload = () => {\n const widthPercentage = calculateWidthPercentage(img.naturalWidth);\n\n form.setValue(\"sourcePath\", value);\n form.setValue(\"imageNaturalWidth\", img.naturalWidth);\n form.setValue(\"width\", widthPercentage);\n\n const updatedValues = {\n ...form.getValues(),\n sourcePath: value,\n width: widthPercentage,\n imageNaturalWidth: img.naturalWidth,\n };\n\n updateNodeAttributes(updatedValues);\n };\n img.src = value;\n },\n [form, updateNodeAttributes, calculateWidthPercentage]\n );\n\n const variables =\n editor?.extensionManager.extensions.find((ext) => ext.name === \"variableSuggestion\")?.options\n ?.variables || {};\n\n const variableKeys = getFlattenedVariables(variables);\n const sourcePath = form.getValues().sourcePath;\n\n if (!element) {\n return null;\n }\n\n return (\n <Form {...form}>\n <FormHeader type=\"image\" />\n\n <form\n ref={containerRef}\n onChange={() => {\n const values = form.getValues();\n updateNodeAttributes(values);\n }}\n >\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Image</h4>\n <Tabs defaultValue=\"file\" className=\"courier-mb-3 courier-w-full\">\n <TabsList className=\"courier-w-full courier-flex courier-justify-stretch courier-mb-3\">\n <TabsTrigger value=\"file\" className=\"courier-flex-1\">\n From file\n </TabsTrigger>\n <TabsTrigger value=\"url\" className=\"courier-flex-1\">\n From URL\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"file\">\n <div className=\"courier-flex courier-flex-col courier-gap-2\">\n <Button\n onClick={handleUploadClick}\n className=\"courier-w-full\"\n variant=\"outline\"\n type=\"button\"\n disabled={isUploading}\n >\n {isUploading ? (\n <>Uploading...</>\n ) : (\n <>\n <ArrowUp\n strokeWidth={1.25}\n className=\"courier-w-4 courier-h-4 courier-ml-2 courier-text-foreground\"\n />\n Upload image\n </>\n )}\n </Button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"courier-hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) {\n setIsUploading(true);\n\n // First validate the image can be read\n const reader = new FileReader();\n reader.onload = async () => {\n try {\n if (!apiUrl || !token || !tenantId) {\n toast.error(\"Missing configuration for image upload\");\n setIsUploading(false);\n return;\n }\n\n // Upload the image to server\n const imageUrl = await uploadImage(file, {\n apiUrl,\n token,\n tenantId,\n clientKey,\n });\n\n // Load the image to get dimensions\n const img = new Image();\n img.onload = () => {\n handleImageLoad(img, imageUrl);\n setIsUploading(false);\n };\n img.onerror = () => {\n toast.error(\"Failed to load uploaded image\");\n setIsUploading(false);\n };\n img.src = imageUrl;\n } catch (error) {\n console.error(\"Error uploading image:\", error);\n toast.error(\"Failed to upload image\");\n setIsUploading(false);\n }\n };\n\n reader.onerror = () => {\n toast.error(\"Failed to read image file\");\n setIsUploading(false);\n };\n\n reader.readAsDataURL(file);\n }\n }}\n />\n </div>\n </TabsContent>\n <TabsContent value=\"url\">\n <FormField\n control={form.control}\n name=\"sourcePath\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-3\">\n <FormControl>\n <TextInput\n as=\"Textarea\"\n {...field}\n autoResize\n className=\"courier-max-h-[88px]\"\n variables={variableKeys}\n onChange={(e) => handleSourcePathChange(e.target.value)}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </TabsContent>\n </Tabs>\n <FormField\n control={form.control}\n name=\"link\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-3\">\n <FormControl>\n <TextInput\n as=\"Textarea\"\n placeholder=\"Link\"\n {...field}\n variables={variableKeys}\n onChange={(e) => {\n field.onChange(e);\n updateNodeAttributes({\n ...form.getValues(),\n link: e.target.value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"alt\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <TextInput\n as=\"Textarea\"\n {...field}\n placeholder=\"Alt text...\"\n variables={variableKeys}\n onChange={(e) => {\n field.onChange(e);\n updateNodeAttributes({\n ...form.getValues(),\n alt: e.target.value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Divider className=\"courier-mt-6 courier-mb-4\" />\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Width</h4>\n {(() => {\n const currentWidth = form.getValues().width;\n const originalWidth = calculateWidthPercentage(imageNaturalWidth);\n const isOriginalWidth = currentWidth === originalWidth;\n const currentValue = isOriginalWidth ? \"original\" : \"fill\";\n\n return (\n <ToggleGroup\n type=\"single\"\n value={sourcePath ? currentValue : \"original\"}\n onValueChange={(value) => {\n // If value is undefined (clicking same toggle) or same as current, do nothing\n if (!value || value === currentValue) return;\n\n const newWidth =\n value === \"fill\" ? 100 : calculateWidthPercentage(imageNaturalWidth);\n\n // Only update if we have a valid width\n if (newWidth > 0) {\n form.setValue(\"width\", newWidth);\n updateNodeAttributes({\n ...form.getValues(),\n width: newWidth,\n });\n }\n }}\n className=\"courier-w-full courier-border courier-rounded-md courier-border-border courier-p-0.5 courier-mb-3 courier-shadow-sm\"\n disabled={!sourcePath}\n >\n <ToggleGroupItem size=\"sm\" value=\"original\" className=\"courier-w-full courier-h-7\">\n Original\n </ToggleGroupItem>\n <ToggleGroupItem\n size=\"sm\"\n value=\"fill\"\n className=\"courier-w-full courier-h-7\"\n disabled={isOriginalWidth || !sourcePath}\n >\n Fill\n </ToggleGroupItem>\n </ToggleGroup>\n );\n })()}\n <FormField\n control={form.control}\n name=\"width\"\n render={({ field }) => (\n <FormItem className=\"courier-flex-1 courier-mb-3\">\n <FormControl>\n <Input\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n min={1}\n max={100}\n {...field}\n value={\n !form.getValues().sourcePath\n ? \"0%\"\n : isEditing\n ? rawWidthInput\n : `${field.value}%`\n }\n className=\"courier-text-2xl courier-font-normal\"\n disabled={!form.getValues().sourcePath}\n onFocus={(e) => {\n setIsEditing(true);\n setRawWidthInput(e.target.value);\n }}\n onChange={(e) => {\n setRawWidthInput(e.target.value);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n e.currentTarget.blur();\n }\n }}\n onBlur={(e) => {\n setIsEditing(false);\n const value = parseFloat(e.target.value.replace(\"%\", \"\"));\n if (!isNaN(value)) {\n const clampedValue = Math.min(100, Math.max(1, value));\n field.onChange(clampedValue);\n updateNodeAttributes({\n ...form.getValues(),\n width: Math.round(clampedValue),\n });\n }\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"width\"\n render={({ field }) => (\n <FormItem className=\"courier-flex-1 courier-mb-3\">\n <FormControl>\n <Slider\n min={1}\n max={100}\n value={[sourcePath ? field.value : 0]}\n disabled={!sourcePath}\n onValueChange={(value) => {\n field.onChange(value[0]);\n updateNodeAttributes({\n ...form.getValues(),\n width: value[0],\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"alignment\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <ToggleGroup\n disabled={!sourcePath}\n type=\"single\"\n value={field.value}\n onValueChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n alignment: value,\n });\n }}\n className=\"courier-w-full courier-border courier-rounded-md courier-border-border courier-p-0.5\"\n >\n <ToggleGroupItem size=\"sm\" value=\"left\" className=\"courier-w-full\">\n <ButtonAlignLeftIcon className=\"courier-h-4 courier-w-4\" />\n </ToggleGroupItem>\n <ToggleGroupItem size=\"sm\" value=\"center\" className=\"courier-w-full\">\n <ButtonAlignCenterIcon className=\"courier-h-4 courier-w-4\" />\n </ToggleGroupItem>\n <ToggleGroupItem size=\"sm\" value=\"right\" className=\"courier-w-full\">\n <ButtonAlignRightIcon className=\"courier-h-4 courier-w-4\" />\n </ToggleGroupItem>\n </ToggleGroup>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Divider className=\"courier-mt-6 courier-mb-4\" />\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Border</h4>\n <div className=\"courier-flex courier-flex-row courier-gap-3 courier-mb-3\">\n <FormField\n control={form.control}\n name=\"borderWidth\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input\n startAdornment={<BorderWidthIcon />}\n type=\"number\"\n disabled={!sourcePath}\n min={0}\n {...field}\n onChange={(e) => {\n const value = parseInt(e.target.value) || 0;\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n borderWidth: value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"borderRadius\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input\n startAdornment={<BorderRadiusIcon />}\n type=\"number\"\n disabled={!sourcePath}\n min={0}\n {...field}\n onChange={(e) => {\n const value = parseInt(e.target.value) || 0;\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n borderRadius: value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n <FormField\n control={form.control}\n name=\"borderColor\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <InputColor\n {...field}\n disabled={!sourcePath}\n defaultValue={defaultImageProps.borderColor}\n onChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n [field.name]: value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </form>\n </Form>\n );\n};\n", "import { getMarkRange, mergeAttributes } from \"@tiptap/core\";\nimport TiptapLink from \"@tiptap/extension-link\";\nimport { Plugin, TextSelection } from \"@tiptap/pm/state\";\nimport type { EditorView } from \"@tiptap/pm/view\";\n\nexport const Link = TiptapLink.extend({\n inclusive: true,\n\n addAttributes() {\n return {\n ...this.parent?.(),\n hasVariables: {\n default: false,\n },\n originalHref: {\n default: null,\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'a[href]:not([data-type=\"button\"]):not([href *= \"javascript:\" i])',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n // Check if this link has variables in its URL\n if (HTMLAttributes.hasVariables && HTMLAttributes.originalHref) {\n // Use the original href with the variable syntax intact\n HTMLAttributes.href = HTMLAttributes.originalHref;\n\n // Clean up attributes we don't want to render\n delete HTMLAttributes.hasVariables;\n delete HTMLAttributes.originalHref;\n } else if (HTMLAttributes.href) {\n // Restore variable placeholders in URLs if present\n const href = HTMLAttributes.href as string;\n if (href.includes(\"__VAR_\")) {\n // Convert __VAR_name__ back to {{name}}\n HTMLAttributes.href = href.replace(/__VAR_([^_]+)__/g, \"{{$1}}\");\n }\n }\n\n return [\n \"a\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n class: \"link cursor-pointer\",\n }),\n 0,\n ];\n },\n\n addProseMirrorPlugins() {\n const plugins = [\n ...(this.parent?.() || []),\n new Plugin({\n props: {\n handleClick: (view: EditorView, pos: number, event: MouseEvent) => {\n if (event.button !== 0) return false;\n\n const { state } = view;\n const { doc } = state;\n const $pos = doc.resolve(pos);\n\n // Try to find link mark at current position or adjacent positions\n let linkMark = $pos.marks().find((mark) => mark.type.name === \"link\");\n\n if (!linkMark) {\n // Check one position before\n if (pos > 0) {\n const before = doc.resolve(pos - 1);\n linkMark = before.marks().find((mark) => mark.type.name === \"link\");\n }\n }\n\n if (!linkMark) {\n // Check one position after\n if (pos < doc.content.size) {\n const after = doc.resolve(pos + 1);\n linkMark = after.marks().find((mark) => mark.type.name === \"link\");\n }\n }\n\n if (linkMark) {\n // First try to get the mark range\n const range = getMarkRange($pos, linkMark.type);\n\n // If range exists, use it\n if (range) {\n view.dispatch(\n state.tr.setSelection(TextSelection.create(doc, range.from, range.to))\n );\n\n view.dispatch(\n view.state.tr.setMeta(\"showLinkForm\", {\n from: range.from,\n to: range.to,\n href: linkMark.attrs.originalHref || linkMark.attrs.href,\n })\n );\n return true;\n }\n\n // Fallback for single character - use the position where we found the mark\n view.dispatch(state.tr.setSelection(TextSelection.create(doc, pos, pos + 1)));\n\n view.dispatch(\n view.state.tr.setMeta(\"showLinkForm\", {\n from: pos,\n to: pos + 1,\n href: linkMark.attrs.originalHref || linkMark.attrs.href,\n })\n );\n return true;\n }\n\n return false;\n },\n },\n }),\n // Add a plugin to detect and fix link URL variables\n new Plugin({\n appendTransaction(transactions, _, newState) {\n // Only proceed if there were actual changes\n if (!transactions.some((tr) => tr.docChanged)) return null;\n\n const tr = newState.tr;\n let modified = false;\n\n // Find all link marks with variable placeholders\n newState.doc.descendants((node, pos) => {\n // Check all marks on this node\n node.marks.forEach((mark) => {\n if (mark.type.name === \"link\" && mark.attrs.href) {\n const href = mark.attrs.href;\n\n // Check if href contains variable placeholders\n if (href.includes(\"__VAR_\")) {\n // Replace placeholder with actual variable syntax\n const newHref = href.replace(/__VAR_([^_]+)__/g, \"{{$1}}\");\n\n // If the href has changed, update the mark\n if (newHref !== href) {\n const range = getMarkRange(newState.doc.resolve(pos), mark.type);\n if (range) {\n tr.removeMark(range.from, range.to, mark.type);\n tr.addMark(\n range.from,\n range.to,\n mark.type.create({\n ...mark.attrs,\n href: newHref,\n hasVariables: true,\n originalHref: newHref,\n })\n );\n modified = true;\n }\n }\n }\n }\n });\n\n return true;\n });\n\n return modified ? tr : null;\n },\n }),\n ];\n\n return plugins;\n },\n});\n\nexport default Link;\n", "import {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from \"@/components/ui-kit\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport type { Mark } from \"@tiptap/pm/model\";\nimport type { Editor } from \"@tiptap/react\";\nimport { useSetAtom } from \"jotai\";\nimport { useRef, useEffect } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport { TextInput } from \"../../ui/TextInput\";\nimport { setPendingLinkAtom } from \"../../ui/TextMenu/store\";\nimport { getFlattenedVariables } from \"../../utils/getFlattenedVariables\";\n\nconst linkSchema = z.object({\n href: z.string(), // Remove the min(1) validation to allow empty strings\n openInNewTab: z.boolean().default(false),\n});\n\ninterface LinkFormProps {\n editor: Editor | null;\n mark?: Mark;\n pendingLink?: {\n from: number;\n to: number;\n };\n}\n\nexport const LinkForm = ({ editor, mark, pendingLink }: LinkFormProps) => {\n const setPendingLink = useSetAtom(setPendingLinkAtom);\n const textareaRef = useRef<HTMLTextAreaElement | HTMLInputElement | null>(null);\n\n const form = useForm<z.infer<typeof linkSchema>>({\n resolver: zodResolver(linkSchema),\n defaultValues: {\n href: mark?.attrs.href || \"\",\n openInNewTab: mark?.attrs.target === \"_blank\" || false,\n },\n });\n\n // Reset form values when mark changes\n useEffect(() => {\n form.reset({\n href: mark?.attrs.href || \"\",\n openInNewTab: mark?.attrs.target === \"_blank\" || false,\n });\n }, [mark, form]);\n\n // Get variables from editor storage\n const variables =\n editor?.extensionManager.extensions.find((ext) => ext.name === \"variableSuggestion\")?.options\n ?.variables || {};\n\n const variableKeys = getFlattenedVariables(variables);\n\n const updateLink = async (values: z.infer<typeof linkSchema>) => {\n const url = values.href.trim();\n\n // If URL is empty, remove the link and close form\n if (!url) {\n if (pendingLink) {\n editor?.commands.setTextSelection({\n from: pendingLink.from,\n to: pendingLink.to,\n });\n }\n editor?.commands.unsetLink();\n setPendingLink(null);\n return;\n }\n\n if (pendingLink) {\n editor?.commands.setTextSelection({\n from: pendingLink.from,\n to: pendingLink.to,\n });\n }\n\n await editor\n ?.chain()\n .focus()\n .unsetLink()\n .setTextSelection({ from: pendingLink?.from || 0, to: pendingLink?.to || 0 })\n .setLink({ href: url, target: values.openInNewTab ? \"_blank\" : null })\n .run();\n\n // Remove text selection but keep focus by moving cursor to end of link\n editor?.commands.setTextSelection(pendingLink?.to || 0);\n\n setPendingLink(null);\n };\n\n return (\n <Form {...form}>\n <p className=\"courier-font-medium courier-mb-4\">Link</p>\n <div className=\"courier-space-y-4\">\n <FormField\n control={form.control}\n name=\"href\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>URL</FormLabel>\n <FormControl>\n <TextInput\n as=\"Textarea\"\n autoResize\n {...field}\n variables={variableKeys}\n ref={(element) => {\n if (typeof field.ref === \"function\") {\n field.ref(element);\n }\n textareaRef.current = element;\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n form.handleSubmit(updateLink)();\n }\n }}\n onBlur={() => {\n field.onBlur();\n form.handleSubmit(updateLink)();\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n </Form>\n );\n};\n", "import { mergeAttributes, Node } from '@tiptap/core'\n\nexport interface ParagraphOptions {\n /**\n * The HTML attributes for a paragraph node.\n * @default {}\n * @example { class: 'foo' }\n */\n HTMLAttributes: Record<string, any>,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n paragraph: {\n /**\n * Toggle a paragraph\n * @example editor.commands.toggleParagraph()\n */\n setParagraph: () => ReturnType,\n }\n }\n}\n\n/**\n * This extension allows you to create paragraphs.\n * @see https://www.tiptap.dev/api/nodes/paragraph\n */\nexport const Paragraph = Node.create<ParagraphOptions>({\n name: 'paragraph',\n\n priority: 1000,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n }\n },\n\n group: 'block',\n\n content: 'inline*',\n\n parseHTML() {\n return [\n { tag: 'p' },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['p', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n setParagraph: () => ({ commands }) => {\n return commands.setNode(this.name)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Alt-0': () => this.editor.commands.setParagraph(),\n }\n },\n})\n", "import type { Editor } from \"@tiptap/core\";\nimport TiptapParagraph from \"@tiptap/extension-paragraph\";\nimport { mergeAttributes, ReactNodeViewRenderer } from \"@tiptap/react\";\nimport type { Transaction } from \"prosemirror-state\";\nimport { TextSelection } from \"prosemirror-state\";\nimport { keymap } from \"prosemirror-keymap\";\nimport { generateNodeIds } from \"../../utils\";\nimport { defaultTextBlockProps, TextBlockComponentNode } from \"../TextBlock\";\nimport { v4 as uuidv4 } from \"uuid\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n paragraph: {\n setParagraph: () => ReturnType;\n };\n textAlign: {\n setTextAlign: (alignment: string) => ReturnType;\n unsetTextAlign: () => ReturnType;\n };\n }\n}\n\nexport const Paragraph = TiptapParagraph.extend({\n addOptions() {\n return {\n ...this.parent?.(),\n HTMLAttributes: {\n class: \"\",\n },\n };\n },\n\n onCreate() {\n generateNodeIds(this.editor, this.name);\n },\n\n // Add onTransaction hook to ensure all paragraphs have IDs\n onTransaction() {\n // Check all paragraph nodes and ensure they have IDs\n const tr = this.editor.state.tr;\n let needsUpdate = false;\n\n this.editor.state.doc.descendants((node, pos) => {\n if (node.type.name === this.name && !node.attrs.id) {\n const id = `node-${uuidv4()}`;\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, id });\n needsUpdate = true;\n }\n return true;\n });\n\n if (needsUpdate) {\n this.editor.view.dispatch(tr);\n }\n },\n\n addAttributes() {\n return {\n paddingVertical: {\n default: defaultTextBlockProps.paddingVertical,\n parseHTML: (element) =>\n element.style.paddingTop\n ? parseInt(element.style.paddingTop)\n : defaultTextBlockProps.paddingVertical,\n renderHTML: (attributes) => ({\n \"data-padding-vertical\": attributes.paddingVertical,\n }),\n },\n paddingHorizontal: {\n default: defaultTextBlockProps.paddingHorizontal,\n parseHTML: (element) =>\n element.style.paddingLeft\n ? parseInt(element.style.paddingLeft)\n : defaultTextBlockProps.paddingHorizontal,\n renderHTML: (attributes) => ({\n \"data-padding-horizontal\": attributes.paddingHorizontal,\n }),\n },\n textAlign: {\n default: defaultTextBlockProps.textAlign,\n parseHTML: (element) => element.style.textAlign || defaultTextBlockProps.textAlign,\n renderHTML: (attributes) => ({\n \"data-text-align\": attributes.textAlign,\n }),\n },\n backgroundColor: {\n default: defaultTextBlockProps.backgroundColor,\n parseHTML: (element) =>\n element.style.backgroundColor || defaultTextBlockProps.backgroundColor,\n renderHTML: (attributes) => ({\n \"data-background-color\": attributes.backgroundColor,\n }),\n },\n borderWidth: {\n default: defaultTextBlockProps.borderWidth,\n parseHTML: (element) =>\n element.style.borderWidth\n ? parseInt(element.style.borderWidth)\n : defaultTextBlockProps.borderWidth,\n renderHTML: (attributes) => ({\n \"data-border-width\": attributes.borderWidth,\n }),\n },\n borderRadius: {\n default: defaultTextBlockProps.borderRadius,\n parseHTML: (element) =>\n element.style.borderRadius\n ? parseInt(element.style.borderRadius)\n : defaultTextBlockProps.borderRadius,\n renderHTML: (attributes) => ({\n \"data-border-radius\": attributes.borderRadius,\n }),\n },\n borderColor: {\n default: defaultTextBlockProps.borderColor,\n parseHTML: (element) => element.style.borderColor || defaultTextBlockProps.borderColor,\n renderHTML: (attributes) => ({\n \"data-border-color\": attributes.borderColor,\n }),\n },\n textColor: {\n default: defaultTextBlockProps.textColor,\n parseHTML: (element) => element.style.color || defaultTextBlockProps.textColor,\n renderHTML: (attributes) => ({\n \"data-text-color\": attributes.textColor,\n }),\n },\n id: {\n default: undefined,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => ({\n \"data-id\": attributes.id,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"paragraph\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n \"data-type\": \"paragraph\",\n }),\n 0,\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(TextBlockComponentNode);\n },\n\n addProseMirrorPlugins() {\n return [\n keymap({\n \"Mod-a\": ({ selection, tr }) => {\n // Let the default Cmd+A behavior work first\n document.execCommand(\"selectAll\");\n\n // Then check if we need to constrain the selection to the current node\n const { $from } = selection;\n let depth = $from.depth;\n let currentNode = null;\n\n // Find the current paragraph or heading node\n while (depth > 0) {\n const node = $from.node(depth);\n if (node.type.name === \"paragraph\" || node.type.name === \"heading\") {\n currentNode = node;\n break;\n }\n depth--;\n }\n\n if (currentNode) {\n const start = $from.start(depth);\n const end = $from.end(depth);\n\n // Only modify selection if it's different from the node boundaries\n if (selection.from !== start || selection.to !== end) {\n tr.setSelection(TextSelection.create(tr.doc, start, end));\n return true;\n }\n }\n\n // Return false to allow default behavior if we didn't modify anything\n return false;\n },\n }),\n ];\n },\n\n addKeyboardShortcuts() {\n // Helper function to handle both Backspace and Delete\n const handleDeletion = (editor: Editor, isBackspace = true) => {\n const { empty, $anchor, $head } = editor.state.selection;\n\n // Find the current paragraph or heading node\n let depth = $anchor.depth;\n let currentNode = null;\n\n // Traverse up the tree to find the closest paragraph or heading\n while (depth > 0) {\n const node = $anchor.node(depth);\n if (node.type.name === \"paragraph\" || node.type.name === \"heading\") {\n currentNode = node;\n break;\n }\n depth--;\n }\n\n if (!currentNode) {\n return false;\n }\n\n // For backspace, check if we're at the start; for delete, check if we're at the end\n const isAtBoundary = isBackspace\n ? $anchor.pos === $head.pos && $anchor.parentOffset === 0\n : $anchor.pos === $head.pos && $anchor.parentOffset === currentNode.textContent.length;\n\n const isEmpty = currentNode.textContent.length === 0;\n\n if (isAtBoundary || isEmpty) {\n return true; // Prevent deletion\n }\n\n // Handle selection deletion\n if (!empty) {\n editor.commands.command(\n ({\n tr,\n dispatch,\n }: {\n tr: Transaction;\n dispatch: ((tr: Transaction) => void) | undefined;\n }) => {\n if (dispatch) {\n tr.insertText(\"\", editor.state.selection.from, editor.state.selection.to);\n return true;\n }\n return false;\n }\n );\n return true;\n }\n\n // Let Tiptap handle other cases\n return false;\n };\n\n return {\n Enter: ({ editor }) => {\n // Don't handle Enter if variable suggestion is active\n const isVariableSuggestionActive = editor.view.dom.querySelector(\".variable-suggestion\");\n if (isVariableSuggestionActive) {\n return false;\n }\n\n if (editor.view.state.selection.$from.node().type.spec.code) {\n return false;\n }\n\n const { state, dispatch } = editor.view;\n const { tr } = state;\n\n // Insert a line break instead of a new paragraph\n tr.replaceSelectionWith(state.schema.nodes.hardBreak.create()).scrollIntoView();\n dispatch(tr);\n return true;\n },\n \"Mod-a\": ({ editor }) => {\n const { $from } = editor.state.selection;\n let depth = $from.depth;\n\n // Find the current paragraph or heading node\n while (depth > 0) {\n const node = $from.node(depth);\n if (node.type.name === \"paragraph\" || node.type.name === \"heading\") {\n const start = $from.start(depth);\n const end = $from.end(depth);\n\n // Create a text selection for the entire node content\n editor.commands.setTextSelection({ from: start, to: end });\n return true;\n }\n depth--;\n }\n\n // If no paragraph found, let default behavior happen\n return false;\n },\n Backspace: ({ editor }) => {\n return handleDeletion(editor, true);\n },\n Delete: ({ editor }) => {\n return handleDeletion(editor, false);\n },\n Tab: () => true, // Prevent default tab behavior\n \"Shift-Tab\": () => true, // Prevent default shift+tab behavior\n };\n },\n\n addCommands() {\n return {\n // setParagraph:\n // () =>\n // ({ chain }) => {\n // return chain()\n // .setParagraph()\n // .updateAttributes(this.name, {\n // ...defaultTextBlockProps,\n // id: `node-${uuidv4()}`\n // })\n // .run();\n // },\n setTextAlign:\n (alignment) =>\n ({ chain }) => {\n return chain().updateAttributes(this.name, { textAlign: alignment }).run();\n },\n };\n },\n});\n\nexport default Paragraph;\n", "export var base = {\n 8: \"Backspace\",\n 9: \"Tab\",\n 10: \"Enter\",\n 12: \"NumLock\",\n 13: \"Enter\",\n 16: \"Shift\",\n 17: \"Control\",\n 18: \"Alt\",\n 20: \"CapsLock\",\n 27: \"Escape\",\n 32: \" \",\n 33: \"PageUp\",\n 34: \"PageDown\",\n 35: \"End\",\n 36: \"Home\",\n 37: \"ArrowLeft\",\n 38: \"ArrowUp\",\n 39: \"ArrowRight\",\n 40: \"ArrowDown\",\n 44: \"PrintScreen\",\n 45: \"Insert\",\n 46: \"Delete\",\n 59: \";\",\n 61: \"=\",\n 91: \"Meta\",\n 92: \"Meta\",\n 106: \"*\",\n 107: \"+\",\n 108: \",\",\n 109: \"-\",\n 110: \".\",\n 111: \"/\",\n 144: \"NumLock\",\n 145: \"ScrollLock\",\n 160: \"Shift\",\n 161: \"Shift\",\n 162: \"Control\",\n 163: \"Control\",\n 164: \"Alt\",\n 165: \"Alt\",\n 173: \"-\",\n 186: \";\",\n 187: \"=\",\n 188: \",\",\n 189: \"-\",\n 190: \".\",\n 191: \"/\",\n 192: \"`\",\n 219: \"[\",\n 220: \"\\\\\",\n 221: \"]\",\n 222: \"'\"\n}\n\nexport var shift = {\n 48: \")\",\n 49: \"!\",\n 50: \"@\",\n 51: \"#\",\n 52: \"$\",\n 53: \"%\",\n 54: \"^\",\n 55: \"&\",\n 56: \"*\",\n 57: \"(\",\n 59: \":\",\n 61: \"+\",\n 173: \"_\",\n 186: \":\",\n 187: \"+\",\n 188: \"<\",\n 189: \"_\",\n 190: \">\",\n 191: \"?\",\n 192: \"~\",\n 219: \"{\",\n 220: \"|\",\n 221: \"}\",\n 222: \"\\\"\"\n}\n\nvar mac = typeof navigator != \"undefined\" && /Mac/.test(navigator.platform)\nvar ie = typeof navigator != \"undefined\" && /MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent)\n\n// Fill in the digit keys\nfor (var i = 0; i < 10; i++) base[48 + i] = base[96 + i] = String(i)\n\n// The function keys\nfor (var i = 1; i <= 24; i++) base[i + 111] = \"F\" + i\n\n// And the alphabetic keys\nfor (var i = 65; i <= 90; i++) {\n base[i] = String.fromCharCode(i + 32)\n shift[i] = String.fromCharCode(i)\n}\n\n// For each code that doesn't have a shift-equivalent, copy the base name\nfor (var code in base) if (!shift.hasOwnProperty(code)) shift[code] = base[code]\n\nexport function keyName(event) {\n // On macOS, keys held with Shift and Cmd don't reflect the effect of Shift in `.key`.\n // On IE, shift effect is never included in `.key`.\n var ignoreKey = mac && event.metaKey && event.shiftKey && !event.ctrlKey && !event.altKey ||\n ie && event.shiftKey && event.key && event.key.length == 1 ||\n event.key == \"Unidentified\"\n var name = (!ignoreKey && event.key) ||\n (event.shiftKey ? shift : base)[event.keyCode] ||\n event.key || \"Unidentified\"\n // Edge sometimes produces wrong names (Issue #3)\n if (name == \"Esc\") name = \"Escape\"\n if (name == \"Del\") name = \"Delete\"\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/\n if (name == \"Left\") name = \"ArrowLeft\"\n if (name == \"Up\") name = \"ArrowUp\"\n if (name == \"Right\") name = \"ArrowRight\"\n if (name == \"Down\") name = \"ArrowDown\"\n return name\n}\n", "import { keyName, base } from 'w3c-keyname';\nimport { Plugin } from 'prosemirror-state';\n\nconst mac = typeof navigator != \"undefined\" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform) : false;\nfunction normalizeKeyName(name) {\n let parts = name.split(/-(?!$)/), result = parts[parts.length - 1];\n if (result == \"Space\")\n result = \" \";\n let alt, ctrl, shift, meta;\n for (let i = 0; i < parts.length - 1; i++) {\n let mod = parts[i];\n if (/^(cmd|meta|m)$/i.test(mod))\n meta = true;\n else if (/^a(lt)?$/i.test(mod))\n alt = true;\n else if (/^(c|ctrl|control)$/i.test(mod))\n ctrl = true;\n else if (/^s(hift)?$/i.test(mod))\n shift = true;\n else if (/^mod$/i.test(mod)) {\n if (mac)\n meta = true;\n else\n ctrl = true;\n }\n else\n throw new Error(\"Unrecognized modifier name: \" + mod);\n }\n if (alt)\n result = \"Alt-\" + result;\n if (ctrl)\n result = \"Ctrl-\" + result;\n if (meta)\n result = \"Meta-\" + result;\n if (shift)\n result = \"Shift-\" + result;\n return result;\n}\nfunction normalize(map) {\n let copy = Object.create(null);\n for (let prop in map)\n copy[normalizeKeyName(prop)] = map[prop];\n return copy;\n}\nfunction modifiers(name, event, shift = true) {\n if (event.altKey)\n name = \"Alt-\" + name;\n if (event.ctrlKey)\n name = \"Ctrl-\" + name;\n if (event.metaKey)\n name = \"Meta-\" + name;\n if (shift && event.shiftKey)\n name = \"Shift-\" + name;\n return name;\n}\n/**\nCreate a keymap plugin for the given set of bindings.\n\nBindings should map key names to [command](https://prosemirror.net/docs/ref/#commands)-style\nfunctions, which will be called with `(EditorState, dispatch,\nEditorView)` arguments, and should return true when they've handled\nthe key. Note that the view argument isn't part of the command\nprotocol, but can be used as an escape hatch if a binding needs to\ndirectly interact with the UI.\n\nKey names may be strings like `\"Shift-Ctrl-Enter\"`\u2014a key\nidentifier prefixed with zero or more modifiers. Key identifiers\nare based on the strings that can appear in\n[`KeyEvent.key`](https:developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).\nUse lowercase letters to refer to letter keys (or uppercase letters\nif you want shift to be held). You may use `\"Space\"` as an alias\nfor the `\" \"` name.\n\nModifiers can be given in any order. `Shift-` (or `s-`), `Alt-` (or\n`a-`), `Ctrl-` (or `c-` or `Control-`) and `Cmd-` (or `m-` or\n`Meta-`) are recognized. For characters that are created by holding\nshift, the `Shift-` prefix is implied, and should not be added\nexplicitly.\n\nYou can use `Mod-` as a shorthand for `Cmd-` on Mac and `Ctrl-` on\nother platforms.\n\nYou can add multiple keymap plugins to an editor. The order in\nwhich they appear determines their precedence (the ones early in\nthe array get to dispatch first).\n*/\nfunction keymap(bindings) {\n return new Plugin({ props: { handleKeyDown: keydownHandler(bindings) } });\n}\n/**\nGiven a set of bindings (using the same format as\n[`keymap`](https://prosemirror.net/docs/ref/#keymap.keymap)), return a [keydown\nhandler](https://prosemirror.net/docs/ref/#view.EditorProps.handleKeyDown) that handles them.\n*/\nfunction keydownHandler(bindings) {\n let map = normalize(bindings);\n return function (view, event) {\n let name = keyName(event), baseName, direct = map[modifiers(name, event)];\n if (direct && direct(view.state, view.dispatch, view))\n return true;\n // A character key\n if (name.length == 1 && name != \" \") {\n if (event.shiftKey) {\n // In case the name was already modified by shift, try looking\n // it up without its shift modifier\n let noShift = map[modifiers(name, event, false)];\n if (noShift && noShift(view.state, view.dispatch, view))\n return true;\n }\n if ((event.shiftKey || event.altKey || event.metaKey || name.charCodeAt(0) > 127) &&\n (baseName = base[event.keyCode]) && baseName != name) {\n // Try falling back to the keyCode when there's a modifier\n // active or the character produced isn't ASCII, and our table\n // produces a different name from the the keyCode. See #668,\n // #1060\n let fromCode = map[modifiers(baseName, event)];\n if (fromCode && fromCode(view.state, view.dispatch, view))\n return true;\n }\n }\n return false;\n };\n}\n\nexport { keydownHandler, keymap };\n", "import type { Node } from \"@tiptap/pm/model\";\nimport { Extension } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\n\nexport interface SelectionOptions {\n HTMLAttributes: Record<string, unknown>;\n setSelectedNode: (node: Node) => void;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n selection: {\n updateSelectionState: (node: Node | null) => ReturnType;\n };\n }\n}\n\nexport const SelectionPlugin = new PluginKey(\"selection\");\n\nexport const Selection = Extension.create<SelectionOptions>({\n name: \"selection\",\n\n addOptions() {\n return {\n HTMLAttributes: {},\n setSelectedNode: () => {},\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: [\"paragraph\", \"heading\", \"button\", \"spacer\", \"divider\", \"imageBlock\", \"blockquote\"],\n attributes: {\n isSelected: {\n default: false,\n parseHTML: () => false,\n renderHTML: (attributes) => {\n if (!attributes.isSelected) {\n return {};\n }\n\n return {\n class: \"selected-element\",\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n updateSelectionState:\n (node: Node | null) =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n tr.doc.descendants((nodeItem, pos) => {\n // Only set attributes on block-level nodes that support attributes\n if (\n nodeItem.type.name !== \"text\" &&\n nodeItem.type.spec.attrs?.isSelected !== undefined\n ) {\n if (nodeItem === node) {\n tr.setNodeAttribute(pos, \"isSelected\", true);\n } else {\n tr.setNodeAttribute(pos, \"isSelected\", false);\n }\n }\n return true;\n });\n }\n return true;\n },\n };\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: SelectionPlugin,\n props: {\n handleClick: (view, _, event) => {\n const { state } = view;\n\n if (!this.editor.isEditable) {\n return false;\n }\n\n // Handle click outside of text nodes that puts the caret in the nearest text node but doesn't select the node\n try {\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const caretElement = range.startContainer.parentElement;\n\n if (\n caretElement &&\n ([\"P\", \"H1\", \"H2\", \"H3\", \"BLOCKQUOTE\"].includes(caretElement.tagName) ||\n [\"P\", \"H1\", \"H2\", \"H3\", \"BLOCKQUOTE\"].some((tag) => caretElement.closest(tag)))\n ) {\n const caretPos = view.posAtDOM(caretElement, 0);\n const $pos = state.doc.resolve(caretPos);\n\n if ($pos.node(1)?.type.name === \"blockquote\") {\n this.options.setSelectedNode($pos.node(1));\n return true;\n }\n\n const caretNode = $pos.node();\n if (\n caretNode &&\n [\"paragraph\", \"heading\", \"blockquote\"].includes(caretNode.type.name)\n ) {\n this.options.setSelectedNode(caretNode);\n return true;\n }\n }\n }\n } catch (error) {\n console.error(\"Error handling click:\", error);\n }\n\n const target = event.target as HTMLElement;\n const targetPos = view.posAtDOM(target, 0);\n const targetNode = state.doc.resolve(targetPos).node();\n\n if (\n targetNode &&\n [\"paragraph\", \"heading\", \"blockquote\"].includes(targetNode.type.name)\n ) {\n this.options.setSelectedNode(targetNode);\n return true;\n }\n\n return false;\n },\n },\n }),\n ];\n },\n});\n", "export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];", "export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}", "export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}", "import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };", "import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};", "import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}", "export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;", "export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}", "import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}", "import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}", "import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}", "import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}", "import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}", "import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}", "import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}", "import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}", "import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}", "export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}", "import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}", "export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}", "import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}", "export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}", "import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};", "export default function getVariation(placement) {\n return placement.split('-')[1];\n}", "import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};", "import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};", "var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}", "var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}", "import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}", "import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on <html>\n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}", "import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}", "import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}", "import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}", "import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}", "import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}", "export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}", "import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}", "import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}", "import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}", "import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}", "import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases \u2013 research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};", "import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};", "import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};", "import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};", "export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}", "import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};", "export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}", "import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}", "import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}", "import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}", "export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}", "export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}", "import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update \u2013 it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update \u2013 it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };", "import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";", "export const ROUND_ARROW =\n '<svg width=\"16\" height=\"6\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 6s1.796-.013 4.67-3.615C5.851.9 6.93.006 8 0c1.07-.006 2.148.887 3.343 2.385C14.233 6.005 16 6 16 6H0z\"></svg>';\n\nexport const BOX_CLASS = `__NAMESPACE_PREFIX__-box`;\nexport const CONTENT_CLASS = `__NAMESPACE_PREFIX__-content`;\nexport const BACKDROP_CLASS = `__NAMESPACE_PREFIX__-backdrop`;\nexport const ARROW_CLASS = `__NAMESPACE_PREFIX__-arrow`;\nexport const SVG_ARROW_CLASS = `__NAMESPACE_PREFIX__-svg-arrow`;\n\nexport const TOUCH_OPTIONS = {passive: true, capture: true};\n\nexport const TIPPY_DEFAULT_APPEND_TO = () => document.body;\n", "import {BasePlacement, Placement} from './types';\n\nexport function hasOwnProperty(\n obj: Record<string, unknown>,\n key: string\n): boolean {\n return {}.hasOwnProperty.call(obj, key);\n}\n\nexport function getValueAtIndexOrReturn<T>(\n value: T | [T | null, T | null],\n index: number,\n defaultValue: T | [T, T]\n): T {\n if (Array.isArray(value)) {\n const v = value[index];\n return v == null\n ? Array.isArray(defaultValue)\n ? defaultValue[index]\n : defaultValue\n : v;\n }\n\n return value;\n}\n\nexport function isType(value: any, type: string): boolean {\n const str = {}.toString.call(value);\n return str.indexOf('[object') === 0 && str.indexOf(`${type}]`) > -1;\n}\n\nexport function invokeWithArgsOrReturn(value: any, args: any[]): any {\n return typeof value === 'function' ? value(...args) : value;\n}\n\nexport function debounce<T>(\n fn: (arg: T) => void,\n ms: number\n): (arg: T) => void {\n // Avoid wrapping in `setTimeout` if ms is 0 anyway\n if (ms === 0) {\n return fn;\n }\n\n let timeout: any;\n\n return (arg): void => {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n fn(arg);\n }, ms);\n };\n}\n\nexport function removeProperties<T>(obj: T, keys: string[]): Partial<T> {\n const clone = {...obj};\n keys.forEach((key) => {\n delete (clone as any)[key];\n });\n return clone;\n}\n\nexport function splitBySpaces(value: string): string[] {\n return value.split(/\\s+/).filter(Boolean);\n}\n\nexport function normalizeToArray<T>(value: T | T[]): T[] {\n return ([] as T[]).concat(value);\n}\n\nexport function pushIfUnique<T>(arr: T[], value: T): void {\n if (arr.indexOf(value) === -1) {\n arr.push(value);\n }\n}\n\nexport function appendPxIfNumber(value: string | number): string {\n return typeof value === 'number' ? `${value}px` : value;\n}\n\nexport function unique<T>(arr: T[]): T[] {\n return arr.filter((item, index) => arr.indexOf(item) === index);\n}\n\nexport function getNumber(value: string | number): number {\n return typeof value === 'number' ? value : parseFloat(value);\n}\n\nexport function getBasePlacement(placement: Placement): BasePlacement {\n return placement.split('-')[0] as BasePlacement;\n}\n\nexport function arrayFrom(value: ArrayLike<any>): any[] {\n return [].slice.call(value);\n}\n\nexport function removeUndefinedProps(\n obj: Record<string, unknown>\n): Partial<Record<string, unknown>> {\n return Object.keys(obj).reduce((acc, key) => {\n if (obj[key] !== undefined) {\n (acc as any)[key] = obj[key];\n }\n\n return acc;\n }, {});\n}\n", "import {ReferenceElement, Targets} from './types';\nimport {PopperTreeData} from './types-internal';\nimport {arrayFrom, isType, normalizeToArray, getBasePlacement} from './utils';\n\nexport function div(): HTMLDivElement {\n return document.createElement('div');\n}\n\nexport function isElement(value: unknown): value is Element | DocumentFragment {\n return ['Element', 'Fragment'].some((type) => isType(value, type));\n}\n\nexport function isNodeList(value: unknown): value is NodeList {\n return isType(value, 'NodeList');\n}\n\nexport function isMouseEvent(value: unknown): value is MouseEvent {\n return isType(value, 'MouseEvent');\n}\n\nexport function isReferenceElement(value: any): value is ReferenceElement {\n return !!(value && value._tippy && value._tippy.reference === value);\n}\n\nexport function getArrayOfElements(value: Targets): Element[] {\n if (isElement(value)) {\n return [value];\n }\n\n if (isNodeList(value)) {\n return arrayFrom(value);\n }\n\n if (Array.isArray(value)) {\n return value;\n }\n\n return arrayFrom(document.querySelectorAll(value));\n}\n\nexport function setTransitionDuration(\n els: (HTMLDivElement | null)[],\n value: number\n): void {\n els.forEach((el) => {\n if (el) {\n el.style.transitionDuration = `${value}ms`;\n }\n });\n}\n\nexport function setVisibilityState(\n els: (HTMLDivElement | null)[],\n state: 'visible' | 'hidden'\n): void {\n els.forEach((el) => {\n if (el) {\n el.setAttribute('data-state', state);\n }\n });\n}\n\nexport function getOwnerDocument(\n elementOrElements: Element | Element[]\n): Document {\n const [element] = normalizeToArray(elementOrElements);\n\n // Elements created via a <template> have an ownerDocument with no reference to the body\n return element?.ownerDocument?.body ? element.ownerDocument : document;\n}\n\nexport function isCursorOutsideInteractiveBorder(\n popperTreeData: PopperTreeData[],\n event: MouseEvent\n): boolean {\n const {clientX, clientY} = event;\n\n return popperTreeData.every(({popperRect, popperState, props}) => {\n const {interactiveBorder} = props;\n const basePlacement = getBasePlacement(popperState.placement);\n const offsetData = popperState.modifiersData.offset;\n\n if (!offsetData) {\n return true;\n }\n\n const topDistance = basePlacement === 'bottom' ? offsetData.top!.y : 0;\n const bottomDistance = basePlacement === 'top' ? offsetData.bottom!.y : 0;\n const leftDistance = basePlacement === 'right' ? offsetData.left!.x : 0;\n const rightDistance = basePlacement === 'left' ? offsetData.right!.x : 0;\n\n const exceedsTop =\n popperRect.top - clientY + topDistance > interactiveBorder;\n const exceedsBottom =\n clientY - popperRect.bottom - bottomDistance > interactiveBorder;\n const exceedsLeft =\n popperRect.left - clientX + leftDistance > interactiveBorder;\n const exceedsRight =\n clientX - popperRect.right - rightDistance > interactiveBorder;\n\n return exceedsTop || exceedsBottom || exceedsLeft || exceedsRight;\n });\n}\n\nexport function updateTransitionEndListener(\n box: HTMLDivElement,\n action: 'add' | 'remove',\n listener: (event: TransitionEvent) => void\n): void {\n const method = `${action}EventListener` as\n | 'addEventListener'\n | 'removeEventListener';\n\n // some browsers apparently support `transition` (unprefixed) but only fire\n // `webkitTransitionEnd`...\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n box[method](event, listener as EventListener);\n });\n}\n\n/**\n * Compared to xxx.contains, this function works for dom structures with shadow\n * dom\n */\nexport function actualContains(parent: Element, child: Element): boolean {\n let target = child;\n while (target) {\n if (parent.contains(target)) {\n return true;\n }\n target = (target.getRootNode?.() as any)?.host;\n }\n return false;\n}\n", "import {TOUCH_OPTIONS} from './constants';\nimport {isReferenceElement} from './dom-utils';\n\nexport const currentInput = {isTouch: false};\nlet lastMouseMoveTime = 0;\n\n/**\n * When a `touchstart` event is fired, it's assumed the user is using touch\n * input. We'll bind a `mousemove` event listener to listen for mouse input in\n * the future. This way, the `isTouch` property is fully dynamic and will handle\n * hybrid devices that use a mix of touch + mouse input.\n */\nexport function onDocumentTouchStart(): void {\n if (currentInput.isTouch) {\n return;\n }\n\n currentInput.isTouch = true;\n\n if (window.performance) {\n document.addEventListener('mousemove', onDocumentMouseMove);\n }\n}\n\n/**\n * When two `mousemove` event are fired consecutively within 20ms, it's assumed\n * the user is using mouse input again. `mousemove` can fire on touch devices as\n * well, but very rarely that quickly.\n */\nexport function onDocumentMouseMove(): void {\n const now = performance.now();\n\n if (now - lastMouseMoveTime < 20) {\n currentInput.isTouch = false;\n\n document.removeEventListener('mousemove', onDocumentMouseMove);\n }\n\n lastMouseMoveTime = now;\n}\n\n/**\n * When an element is in focus and has a tippy, leaving the tab/window and\n * returning causes it to show again. For mouse users this is unexpected, but\n * for keyboard use it makes sense.\n * TODO: find a better technique to solve this problem\n */\nexport function onWindowBlur(): void {\n const activeElement = document.activeElement as HTMLElement | null;\n\n if (isReferenceElement(activeElement)) {\n const instance = activeElement._tippy!;\n\n if (activeElement.blur && !instance.state.isVisible) {\n activeElement.blur();\n }\n }\n}\n\nexport default function bindGlobalEventListeners(): void {\n document.addEventListener('touchstart', onDocumentTouchStart, TOUCH_OPTIONS);\n window.addEventListener('blur', onWindowBlur);\n}\n", "export const isBrowser =\n typeof window !== 'undefined' && typeof document !== 'undefined';\n\nexport const isIE11 = isBrowser\n ? // @ts-ignore\n !!window.msCrypto\n : false;\n", "import {Targets} from './types';\n\nexport function createMemoryLeakWarning(method: string): string {\n const txt = method === 'destroy' ? 'n already-' : ' ';\n\n return [\n `${method}() was called on a${txt}destroyed instance. This is a no-op but`,\n 'indicates a potential memory leak.',\n ].join(' ');\n}\n\nexport function clean(value: string): string {\n const spacesAndTabs = /[ \\t]{2,}/g;\n const lineStartWithSpaces = /^[ \\t]*/gm;\n\n return value\n .replace(spacesAndTabs, ' ')\n .replace(lineStartWithSpaces, '')\n .trim();\n}\n\nfunction getDevMessage(message: string): string {\n return clean(`\n %ctippy.js\n\n %c${clean(message)}\n\n %c👷 This is a development-only message. It will be removed in production.\n `);\n}\n\nexport function getFormattedMessage(message: string): string[] {\n return [\n getDevMessage(message),\n // title\n 'color: #00C584; font-size: 1.3em; font-weight: bold;',\n // message\n 'line-height: 1.5',\n // footer\n 'color: #a6a095;',\n ];\n}\n\n// Assume warnings and errors never have the same message\nlet visitedMessages: Set<string>;\nif (__DEV__) {\n resetVisitedMessages();\n}\n\nexport function resetVisitedMessages(): void {\n visitedMessages = new Set();\n}\n\nexport function warnWhen(condition: boolean, message: string): void {\n if (condition && !visitedMessages.has(message)) {\n visitedMessages.add(message);\n console.warn(...getFormattedMessage(message));\n }\n}\n\nexport function errorWhen(condition: boolean, message: string): void {\n if (condition && !visitedMessages.has(message)) {\n visitedMessages.add(message);\n console.error(...getFormattedMessage(message));\n }\n}\n\nexport function validateTargets(targets: Targets): void {\n const didPassFalsyValue = !targets;\n const didPassPlainObject =\n Object.prototype.toString.call(targets) === '[object Object]' &&\n !(targets as any).addEventListener;\n\n errorWhen(\n didPassFalsyValue,\n [\n 'tippy() was passed',\n '`' + String(targets) + '`',\n 'as its targets (first) argument. Valid types are: String, Element,',\n 'Element[], or NodeList.',\n ].join(' ')\n );\n\n errorWhen(\n didPassPlainObject,\n [\n 'tippy() was passed a plain object which is not supported as an argument',\n 'for virtual positioning. Use props.getReferenceClientRect instead.',\n ].join(' ')\n );\n}\n", "import {DefaultProps, Plugin, Props, ReferenceElement, Tippy} from './types';\nimport {\n hasOwnProperty,\n removeProperties,\n invokeWithArgsOrReturn,\n} from './utils';\nimport {warnWhen} from './validation';\nimport {TIPPY_DEFAULT_APPEND_TO} from './constants';\n\nconst pluginProps = {\n animateFill: false,\n followCursor: false,\n inlinePositioning: false,\n sticky: false,\n};\n\nconst renderProps = {\n allowHTML: false,\n animation: 'fade',\n arrow: true,\n content: '',\n inertia: false,\n maxWidth: 350,\n role: 'tooltip',\n theme: '',\n zIndex: 9999,\n};\n\nexport const defaultProps: DefaultProps = {\n appendTo: TIPPY_DEFAULT_APPEND_TO,\n aria: {\n content: 'auto',\n expanded: 'auto',\n },\n delay: 0,\n duration: [300, 250],\n getReferenceClientRect: null,\n hideOnClick: true,\n ignoreAttributes: false,\n interactive: false,\n interactiveBorder: 2,\n interactiveDebounce: 0,\n moveTransition: '',\n offset: [0, 10],\n onAfterUpdate() {},\n onBeforeUpdate() {},\n onCreate() {},\n onDestroy() {},\n onHidden() {},\n onHide() {},\n onMount() {},\n onShow() {},\n onShown() {},\n onTrigger() {},\n onUntrigger() {},\n onClickOutside() {},\n placement: 'top',\n plugins: [],\n popperOptions: {},\n render: null,\n showOnCreate: false,\n touch: true,\n trigger: 'mouseenter focus',\n triggerTarget: null,\n ...pluginProps,\n ...renderProps,\n};\n\nconst defaultKeys = Object.keys(defaultProps);\n\nexport const setDefaultProps: Tippy['setDefaultProps'] = (partialProps) => {\n /* istanbul ignore else */\n if (__DEV__) {\n validateProps(partialProps, []);\n }\n\n const keys = Object.keys(partialProps) as Array<keyof DefaultProps>;\n keys.forEach((key) => {\n (defaultProps as any)[key] = partialProps[key];\n });\n};\n\nexport function getExtendedPassedProps(\n passedProps: Partial<Props> & Record<string, unknown>\n): Partial<Props> {\n const plugins = passedProps.plugins || [];\n const pluginProps = plugins.reduce<Record<string, unknown>>((acc, plugin) => {\n const {name, defaultValue} = plugin;\n\n if (name) {\n acc[name] =\n passedProps[name] !== undefined\n ? passedProps[name]\n : (defaultProps as any)[name] ?? defaultValue;\n }\n\n return acc;\n }, {});\n\n return {\n ...passedProps,\n ...pluginProps,\n };\n}\n\nexport function getDataAttributeProps(\n reference: ReferenceElement,\n plugins: Plugin[]\n): Record<string, unknown> {\n const propKeys = plugins\n ? Object.keys(getExtendedPassedProps({...defaultProps, plugins}))\n : defaultKeys;\n\n const props = propKeys.reduce(\n (acc: Partial<Props> & Record<string, unknown>, key) => {\n const valueAsString = (\n reference.getAttribute(`data-tippy-${key}`) || ''\n ).trim();\n\n if (!valueAsString) {\n return acc;\n }\n\n if (key === 'content') {\n acc[key] = valueAsString;\n } else {\n try {\n acc[key] = JSON.parse(valueAsString);\n } catch (e) {\n acc[key] = valueAsString;\n }\n }\n\n return acc;\n },\n {}\n );\n\n return props;\n}\n\nexport function evaluateProps(\n reference: ReferenceElement,\n props: Props\n): Props {\n const out = {\n ...props,\n content: invokeWithArgsOrReturn(props.content, [reference]),\n ...(props.ignoreAttributes\n ? {}\n : getDataAttributeProps(reference, props.plugins)),\n };\n\n out.aria = {\n ...defaultProps.aria,\n ...out.aria,\n };\n\n out.aria = {\n expanded:\n out.aria.expanded === 'auto' ? props.interactive : out.aria.expanded,\n content:\n out.aria.content === 'auto'\n ? props.interactive\n ? null\n : 'describedby'\n : out.aria.content,\n };\n\n return out;\n}\n\nexport function validateProps(\n partialProps: Partial<Props> = {},\n plugins: Plugin[] = []\n): void {\n const keys = Object.keys(partialProps) as Array<keyof Props>;\n keys.forEach((prop) => {\n const nonPluginProps = removeProperties(\n defaultProps,\n Object.keys(pluginProps)\n );\n\n let didPassUnknownProp = !hasOwnProperty(nonPluginProps, prop);\n\n // Check if the prop exists in `plugins`\n if (didPassUnknownProp) {\n didPassUnknownProp =\n plugins.filter((plugin) => plugin.name === prop).length === 0;\n }\n\n warnWhen(\n didPassUnknownProp,\n [\n `\\`${prop}\\``,\n \"is not a valid prop. You may have spelled it incorrectly, or if it's\",\n 'a plugin, forgot to pass it in an array as props.plugins.',\n '\\n\\n',\n 'All props: https://atomiks.github.io/tippyjs/v6/all-props/\\n',\n 'Plugins: https://atomiks.github.io/tippyjs/v6/plugins/',\n ].join(' ')\n );\n });\n}\n", "import {\n ARROW_CLASS,\n BACKDROP_CLASS,\n BOX_CLASS,\n CONTENT_CLASS,\n SVG_ARROW_CLASS,\n} from './constants';\nimport {div, isElement} from './dom-utils';\nimport {Instance, PopperElement, Props} from './types';\nimport {PopperChildren} from './types-internal';\nimport {arrayFrom} from './utils';\n\n// Firefox extensions don't allow .innerHTML = \"...\" property. This tricks it.\nconst innerHTML = (): 'innerHTML' => 'innerHTML';\n\nfunction dangerouslySetInnerHTML(element: Element, html: string): void {\n element[innerHTML()] = html;\n}\n\nfunction createArrowElement(value: Props['arrow']): HTMLDivElement {\n const arrow = div();\n\n if (value === true) {\n arrow.className = ARROW_CLASS;\n } else {\n arrow.className = SVG_ARROW_CLASS;\n\n if (isElement(value)) {\n arrow.appendChild(value);\n } else {\n dangerouslySetInnerHTML(arrow, value as string);\n }\n }\n\n return arrow;\n}\n\nexport function setContent(content: HTMLDivElement, props: Props): void {\n if (isElement(props.content)) {\n dangerouslySetInnerHTML(content, '');\n content.appendChild(props.content);\n } else if (typeof props.content !== 'function') {\n if (props.allowHTML) {\n dangerouslySetInnerHTML(content, props.content);\n } else {\n content.textContent = props.content;\n }\n }\n}\n\nexport function getChildren(popper: PopperElement): PopperChildren {\n const box = popper.firstElementChild as HTMLDivElement;\n const boxChildren = arrayFrom(box.children);\n\n return {\n box,\n content: boxChildren.find((node) => node.classList.contains(CONTENT_CLASS)),\n arrow: boxChildren.find(\n (node) =>\n node.classList.contains(ARROW_CLASS) ||\n node.classList.contains(SVG_ARROW_CLASS)\n ),\n backdrop: boxChildren.find((node) =>\n node.classList.contains(BACKDROP_CLASS)\n ),\n };\n}\n\nexport function render(\n instance: Instance\n): {\n popper: PopperElement;\n onUpdate?: (prevProps: Props, nextProps: Props) => void;\n} {\n const popper = div();\n\n const box = div();\n box.className = BOX_CLASS;\n box.setAttribute('data-state', 'hidden');\n box.setAttribute('tabindex', '-1');\n\n const content = div();\n content.className = CONTENT_CLASS;\n content.setAttribute('data-state', 'hidden');\n\n setContent(content, instance.props);\n\n popper.appendChild(box);\n box.appendChild(content);\n\n onUpdate(instance.props, instance.props);\n\n function onUpdate(prevProps: Props, nextProps: Props): void {\n const {box, content, arrow} = getChildren(popper);\n\n if (nextProps.theme) {\n box.setAttribute('data-theme', nextProps.theme);\n } else {\n box.removeAttribute('data-theme');\n }\n\n if (typeof nextProps.animation === 'string') {\n box.setAttribute('data-animation', nextProps.animation);\n } else {\n box.removeAttribute('data-animation');\n }\n\n if (nextProps.inertia) {\n box.setAttribute('data-inertia', '');\n } else {\n box.removeAttribute('data-inertia');\n }\n\n box.style.maxWidth =\n typeof nextProps.maxWidth === 'number'\n ? `${nextProps.maxWidth}px`\n : nextProps.maxWidth;\n\n if (nextProps.role) {\n box.setAttribute('role', nextProps.role);\n } else {\n box.removeAttribute('role');\n }\n\n if (\n prevProps.content !== nextProps.content ||\n prevProps.allowHTML !== nextProps.allowHTML\n ) {\n setContent(content, instance.props);\n }\n\n if (nextProps.arrow) {\n if (!arrow) {\n box.appendChild(createArrowElement(nextProps.arrow));\n } else if (prevProps.arrow !== nextProps.arrow) {\n box.removeChild(arrow);\n box.appendChild(createArrowElement(nextProps.arrow));\n }\n } else if (arrow) {\n box.removeChild(arrow!);\n }\n }\n\n return {\n popper,\n onUpdate,\n };\n}\n\n// Runtime check to identify if the render function is the default one; this\n// way we can apply default CSS transitions logic and it can be tree-shaken away\nrender.$$tippy = true;\n", "import {createPopper, StrictModifiers, Modifier} from '@popperjs/core';\nimport {currentInput} from './bindGlobalEventListeners';\nimport {isIE11} from './browser';\nimport {TIPPY_DEFAULT_APPEND_TO, TOUCH_OPTIONS} from './constants';\nimport {\n actualContains,\n div,\n getOwnerDocument,\n isCursorOutsideInteractiveBorder,\n isMouseEvent,\n setTransitionDuration,\n setVisibilityState,\n updateTransitionEndListener,\n} from './dom-utils';\nimport {defaultProps, evaluateProps, getExtendedPassedProps} from './props';\nimport {getChildren} from './template';\nimport {\n Content,\n Instance,\n LifecycleHooks,\n PopperElement,\n Props,\n ReferenceElement,\n} from './types';\nimport {ListenerObject, PopperTreeData, PopperChildren} from './types-internal';\nimport {\n arrayFrom,\n debounce,\n getValueAtIndexOrReturn,\n invokeWithArgsOrReturn,\n normalizeToArray,\n pushIfUnique,\n splitBySpaces,\n unique,\n removeUndefinedProps,\n} from './utils';\nimport {createMemoryLeakWarning, errorWhen, warnWhen} from './validation';\n\nlet idCounter = 1;\nlet mouseMoveListeners: ((event: MouseEvent) => void)[] = [];\n\n// Used by `hideAll()`\nexport let mountedInstances: Instance[] = [];\n\nexport default function createTippy(\n reference: ReferenceElement,\n passedProps: Partial<Props>\n): Instance {\n const props = evaluateProps(reference, {\n ...defaultProps,\n ...getExtendedPassedProps(removeUndefinedProps(passedProps)),\n });\n\n // ===========================================================================\n // 🔒 Private members\n // ===========================================================================\n let showTimeout: any;\n let hideTimeout: any;\n let scheduleHideAnimationFrame: number;\n let isVisibleFromClick = false;\n let didHideDueToDocumentMouseDown = false;\n let didTouchMove = false;\n let ignoreOnFirstUpdate = false;\n let lastTriggerEvent: Event | undefined;\n let currentTransitionEndListener: (event: TransitionEvent) => void;\n let onFirstUpdate: () => void;\n let listeners: ListenerObject[] = [];\n let debouncedOnMouseMove = debounce(onMouseMove, props.interactiveDebounce);\n let currentTarget: Element;\n\n // ===========================================================================\n // 🔑 Public members\n // ===========================================================================\n const id = idCounter++;\n const popperInstance = null;\n const plugins = unique(props.plugins);\n\n const state = {\n // Is the instance currently enabled?\n isEnabled: true,\n // Is the tippy currently showing and not transitioning out?\n isVisible: false,\n // Has the instance been destroyed?\n isDestroyed: false,\n // Is the tippy currently mounted to the DOM?\n isMounted: false,\n // Has the tippy finished transitioning in?\n isShown: false,\n };\n\n const instance: Instance = {\n // properties\n id,\n reference,\n popper: div(),\n popperInstance,\n props,\n state,\n plugins,\n // methods\n clearDelayTimeouts,\n setProps,\n setContent,\n show,\n hide,\n hideWithInteractivity,\n enable,\n disable,\n unmount,\n destroy,\n };\n\n // TODO: Investigate why this early return causes a TDZ error in the tests —\n // it doesn't seem to happen in the browser\n /* istanbul ignore if */\n if (!props.render) {\n if (__DEV__) {\n errorWhen(true, 'render() function has not been supplied.');\n }\n\n return instance;\n }\n\n // ===========================================================================\n // Initial mutations\n // ===========================================================================\n const {popper, onUpdate} = props.render(instance);\n\n popper.setAttribute('data-__NAMESPACE_PREFIX__-root', '');\n popper.id = `__NAMESPACE_PREFIX__-${instance.id}`;\n\n instance.popper = popper;\n reference._tippy = instance;\n popper._tippy = instance;\n\n const pluginsHooks = plugins.map((plugin) => plugin.fn(instance));\n const hasAriaExpanded = reference.hasAttribute('aria-expanded');\n\n addListeners();\n handleAriaExpandedAttribute();\n handleStyles();\n\n invokeHook('onCreate', [instance]);\n\n if (props.showOnCreate) {\n scheduleShow();\n }\n\n // Prevent a tippy with a delay from hiding if the cursor left then returned\n // before it started hiding\n popper.addEventListener('mouseenter', () => {\n if (instance.props.interactive && instance.state.isVisible) {\n instance.clearDelayTimeouts();\n }\n });\n\n popper.addEventListener('mouseleave', () => {\n if (\n instance.props.interactive &&\n instance.props.trigger.indexOf('mouseenter') >= 0\n ) {\n getDocument().addEventListener('mousemove', debouncedOnMouseMove);\n }\n });\n\n return instance;\n\n // ===========================================================================\n // 🔒 Private methods\n // ===========================================================================\n function getNormalizedTouchSettings(): [string | boolean, number] {\n const {touch} = instance.props;\n return Array.isArray(touch) ? touch : [touch, 0];\n }\n\n function getIsCustomTouchBehavior(): boolean {\n return getNormalizedTouchSettings()[0] === 'hold';\n }\n\n function getIsDefaultRenderFn(): boolean {\n // @ts-ignore\n return !!instance.props.render?.$$tippy;\n }\n\n function getCurrentTarget(): Element {\n return currentTarget || reference;\n }\n\n function getDocument(): Document {\n const parent = getCurrentTarget().parentNode as Element;\n return parent ? getOwnerDocument(parent) : document;\n }\n\n function getDefaultTemplateChildren(): PopperChildren {\n return getChildren(popper);\n }\n\n function getDelay(isShow: boolean): number {\n // For touch or keyboard input, force `0` delay for UX reasons\n // Also if the instance is mounted but not visible (transitioning out),\n // ignore delay\n if (\n (instance.state.isMounted && !instance.state.isVisible) ||\n currentInput.isTouch ||\n (lastTriggerEvent && lastTriggerEvent.type === 'focus')\n ) {\n return 0;\n }\n\n return getValueAtIndexOrReturn(\n instance.props.delay,\n isShow ? 0 : 1,\n defaultProps.delay\n );\n }\n\n function handleStyles(fromHide = false): void {\n popper.style.pointerEvents =\n instance.props.interactive && !fromHide ? '' : 'none';\n popper.style.zIndex = `${instance.props.zIndex}`;\n }\n\n function invokeHook(\n hook: keyof LifecycleHooks,\n args: [Instance, any?],\n shouldInvokePropsHook = true\n ): void {\n pluginsHooks.forEach((pluginHooks) => {\n if (pluginHooks[hook]) {\n pluginHooks[hook]!(...args);\n }\n });\n\n if (shouldInvokePropsHook) {\n instance.props[hook](...args);\n }\n }\n\n function handleAriaContentAttribute(): void {\n const {aria} = instance.props;\n\n if (!aria.content) {\n return;\n }\n\n const attr = `aria-${aria.content}`;\n const id = popper.id;\n const nodes = normalizeToArray(instance.props.triggerTarget || reference);\n\n nodes.forEach((node) => {\n const currentValue = node.getAttribute(attr);\n\n if (instance.state.isVisible) {\n node.setAttribute(attr, currentValue ? `${currentValue} ${id}` : id);\n } else {\n const nextValue = currentValue && currentValue.replace(id, '').trim();\n\n if (nextValue) {\n node.setAttribute(attr, nextValue);\n } else {\n node.removeAttribute(attr);\n }\n }\n });\n }\n\n function handleAriaExpandedAttribute(): void {\n if (hasAriaExpanded || !instance.props.aria.expanded) {\n return;\n }\n\n const nodes = normalizeToArray(instance.props.triggerTarget || reference);\n\n nodes.forEach((node) => {\n if (instance.props.interactive) {\n node.setAttribute(\n 'aria-expanded',\n instance.state.isVisible && node === getCurrentTarget()\n ? 'true'\n : 'false'\n );\n } else {\n node.removeAttribute('aria-expanded');\n }\n });\n }\n\n function cleanupInteractiveMouseListeners(): void {\n getDocument().removeEventListener('mousemove', debouncedOnMouseMove);\n mouseMoveListeners = mouseMoveListeners.filter(\n (listener) => listener !== debouncedOnMouseMove\n );\n }\n\n function onDocumentPress(event: MouseEvent | TouchEvent): void {\n // Moved finger to scroll instead of an intentional tap outside\n if (currentInput.isTouch) {\n if (didTouchMove || event.type === 'mousedown') {\n return;\n }\n }\n\n const actualTarget =\n (event.composedPath && event.composedPath()[0]) || event.target;\n\n // Clicked on interactive popper\n if (\n instance.props.interactive &&\n actualContains(popper, actualTarget as Element)\n ) {\n return;\n }\n\n // Clicked on the event listeners target\n if (\n normalizeToArray(instance.props.triggerTarget || reference).some((el) =>\n actualContains(el, actualTarget as Element)\n )\n ) {\n if (currentInput.isTouch) {\n return;\n }\n\n if (\n instance.state.isVisible &&\n instance.props.trigger.indexOf('click') >= 0\n ) {\n return;\n }\n } else {\n invokeHook('onClickOutside', [instance, event]);\n }\n\n if (instance.props.hideOnClick === true) {\n instance.clearDelayTimeouts();\n instance.hide();\n\n // `mousedown` event is fired right before `focus` if pressing the\n // currentTarget. This lets a tippy with `focus` trigger know that it\n // should not show\n didHideDueToDocumentMouseDown = true;\n setTimeout(() => {\n didHideDueToDocumentMouseDown = false;\n });\n\n // The listener gets added in `scheduleShow()`, but this may be hiding it\n // before it shows, and hide()'s early bail-out behavior can prevent it\n // from being cleaned up\n if (!instance.state.isMounted) {\n removeDocumentPress();\n }\n }\n }\n\n function onTouchMove(): void {\n didTouchMove = true;\n }\n\n function onTouchStart(): void {\n didTouchMove = false;\n }\n\n function addDocumentPress(): void {\n const doc = getDocument();\n doc.addEventListener('mousedown', onDocumentPress, true);\n doc.addEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n doc.addEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n doc.addEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n }\n\n function removeDocumentPress(): void {\n const doc = getDocument();\n doc.removeEventListener('mousedown', onDocumentPress, true);\n doc.removeEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n doc.removeEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n doc.removeEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n }\n\n function onTransitionedOut(duration: number, callback: () => void): void {\n onTransitionEnd(duration, () => {\n if (\n !instance.state.isVisible &&\n popper.parentNode &&\n popper.parentNode.contains(popper)\n ) {\n callback();\n }\n });\n }\n\n function onTransitionedIn(duration: number, callback: () => void): void {\n onTransitionEnd(duration, callback);\n }\n\n function onTransitionEnd(duration: number, callback: () => void): void {\n const box = getDefaultTemplateChildren().box;\n\n function listener(event: TransitionEvent): void {\n if (event.target === box) {\n updateTransitionEndListener(box, 'remove', listener);\n callback();\n }\n }\n\n // Make callback synchronous if duration is 0\n // `transitionend` won't fire otherwise\n if (duration === 0) {\n return callback();\n }\n\n updateTransitionEndListener(box, 'remove', currentTransitionEndListener);\n updateTransitionEndListener(box, 'add', listener);\n\n currentTransitionEndListener = listener;\n }\n\n function on(\n eventType: string,\n handler: EventListener,\n options: boolean | Record<string, unknown> = false\n ): void {\n const nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach((node) => {\n node.addEventListener(eventType, handler, options);\n listeners.push({node, eventType, handler, options});\n });\n }\n\n function addListeners(): void {\n if (getIsCustomTouchBehavior()) {\n on('touchstart', onTrigger, {passive: true});\n on('touchend', onMouseLeave as EventListener, {passive: true});\n }\n\n splitBySpaces(instance.props.trigger).forEach((eventType) => {\n if (eventType === 'manual') {\n return;\n }\n\n on(eventType, onTrigger);\n\n switch (eventType) {\n case 'mouseenter':\n on('mouseleave', onMouseLeave as EventListener);\n break;\n case 'focus':\n on(isIE11 ? 'focusout' : 'blur', onBlurOrFocusOut as EventListener);\n break;\n case 'focusin':\n on('focusout', onBlurOrFocusOut as EventListener);\n break;\n }\n });\n }\n\n function removeListeners(): void {\n listeners.forEach(({node, eventType, handler, options}: ListenerObject) => {\n node.removeEventListener(eventType, handler, options);\n });\n listeners = [];\n }\n\n function onTrigger(event: Event): void {\n let shouldScheduleClickHide = false;\n\n if (\n !instance.state.isEnabled ||\n isEventListenerStopped(event) ||\n didHideDueToDocumentMouseDown\n ) {\n return;\n }\n\n const wasFocused = lastTriggerEvent?.type === 'focus';\n\n lastTriggerEvent = event;\n currentTarget = event.currentTarget as Element;\n\n handleAriaExpandedAttribute();\n\n if (!instance.state.isVisible && isMouseEvent(event)) {\n // If scrolling, `mouseenter` events can be fired if the cursor lands\n // over a new target, but `mousemove` events don't get fired. This\n // causes interactive tooltips to get stuck open until the cursor is\n // moved\n mouseMoveListeners.forEach((listener) => listener(event));\n }\n\n // Toggle show/hide when clicking click-triggered tooltips\n if (\n event.type === 'click' &&\n (instance.props.trigger.indexOf('mouseenter') < 0 ||\n isVisibleFromClick) &&\n instance.props.hideOnClick !== false &&\n instance.state.isVisible\n ) {\n shouldScheduleClickHide = true;\n } else {\n scheduleShow(event);\n }\n\n if (event.type === 'click') {\n isVisibleFromClick = !shouldScheduleClickHide;\n }\n\n if (shouldScheduleClickHide && !wasFocused) {\n scheduleHide(event);\n }\n }\n\n function onMouseMove(event: MouseEvent): void {\n const target = event.target as Node;\n const isCursorOverReferenceOrPopper =\n getCurrentTarget().contains(target) || popper.contains(target);\n\n if (event.type === 'mousemove' && isCursorOverReferenceOrPopper) {\n return;\n }\n\n const popperTreeData = getNestedPopperTree()\n .concat(popper)\n .map((popper) => {\n const instance = popper._tippy!;\n const state = instance.popperInstance?.state;\n\n if (state) {\n return {\n popperRect: popper.getBoundingClientRect(),\n popperState: state,\n props,\n };\n }\n\n return null;\n })\n .filter(Boolean) as PopperTreeData[];\n\n if (isCursorOutsideInteractiveBorder(popperTreeData, event)) {\n cleanupInteractiveMouseListeners();\n scheduleHide(event);\n }\n }\n\n function onMouseLeave(event: MouseEvent): void {\n const shouldBail =\n isEventListenerStopped(event) ||\n (instance.props.trigger.indexOf('click') >= 0 && isVisibleFromClick);\n\n if (shouldBail) {\n return;\n }\n\n if (instance.props.interactive) {\n instance.hideWithInteractivity(event);\n return;\n }\n\n scheduleHide(event);\n }\n\n function onBlurOrFocusOut(event: FocusEvent): void {\n if (\n instance.props.trigger.indexOf('focusin') < 0 &&\n event.target !== getCurrentTarget()\n ) {\n return;\n }\n\n // If focus was moved to within the popper\n if (\n instance.props.interactive &&\n event.relatedTarget &&\n popper.contains(event.relatedTarget as Element)\n ) {\n return;\n }\n\n scheduleHide(event);\n }\n\n function isEventListenerStopped(event: Event): boolean {\n return currentInput.isTouch\n ? getIsCustomTouchBehavior() !== event.type.indexOf('touch') >= 0\n : false;\n }\n\n function createPopperInstance(): void {\n destroyPopperInstance();\n\n const {\n popperOptions,\n placement,\n offset,\n getReferenceClientRect,\n moveTransition,\n } = instance.props;\n\n const arrow = getIsDefaultRenderFn() ? getChildren(popper).arrow : null;\n\n const computedReference = getReferenceClientRect\n ? {\n getBoundingClientRect: getReferenceClientRect,\n contextElement:\n getReferenceClientRect.contextElement || getCurrentTarget(),\n }\n : reference;\n\n const tippyModifier: Modifier<'$$tippy', Record<string, unknown>> = {\n name: '$$tippy',\n enabled: true,\n phase: 'beforeWrite',\n requires: ['computeStyles'],\n fn({state}) {\n if (getIsDefaultRenderFn()) {\n const {box} = getDefaultTemplateChildren();\n\n ['placement', 'reference-hidden', 'escaped'].forEach((attr) => {\n if (attr === 'placement') {\n box.setAttribute('data-placement', state.placement);\n } else {\n if (state.attributes.popper[`data-popper-${attr}`]) {\n box.setAttribute(`data-${attr}`, '');\n } else {\n box.removeAttribute(`data-${attr}`);\n }\n }\n });\n\n state.attributes.popper = {};\n }\n },\n };\n\n type TippyModifier = Modifier<'$$tippy', Record<string, unknown>>;\n type ExtendedModifiers = StrictModifiers | Partial<TippyModifier>;\n\n const modifiers: Array<ExtendedModifiers> = [\n {\n name: 'offset',\n options: {\n offset,\n },\n },\n {\n name: 'preventOverflow',\n options: {\n padding: {\n top: 2,\n bottom: 2,\n left: 5,\n right: 5,\n },\n },\n },\n {\n name: 'flip',\n options: {\n padding: 5,\n },\n },\n {\n name: 'computeStyles',\n options: {\n adaptive: !moveTransition,\n },\n },\n tippyModifier,\n ];\n\n if (getIsDefaultRenderFn() && arrow) {\n modifiers.push({\n name: 'arrow',\n options: {\n element: arrow,\n padding: 3,\n },\n });\n }\n\n modifiers.push(...(popperOptions?.modifiers || []));\n\n instance.popperInstance = createPopper<ExtendedModifiers>(\n computedReference,\n popper,\n {\n ...popperOptions,\n placement,\n onFirstUpdate,\n modifiers,\n }\n );\n }\n\n function destroyPopperInstance(): void {\n if (instance.popperInstance) {\n instance.popperInstance.destroy();\n instance.popperInstance = null;\n }\n }\n\n function mount(): void {\n const {appendTo} = instance.props;\n\n let parentNode: any;\n\n // By default, we'll append the popper to the triggerTargets's parentNode so\n // it's directly after the reference element so the elements inside the\n // tippy can be tabbed to\n // If there are clipping issues, the user can specify a different appendTo\n // and ensure focus management is handled correctly manually\n const node = getCurrentTarget();\n\n if (\n (instance.props.interactive && appendTo === TIPPY_DEFAULT_APPEND_TO) ||\n appendTo === 'parent'\n ) {\n parentNode = node.parentNode;\n } else {\n parentNode = invokeWithArgsOrReturn(appendTo, [node]);\n }\n\n // The popper element needs to exist on the DOM before its position can be\n // updated as Popper needs to read its dimensions\n if (!parentNode.contains(popper)) {\n parentNode.appendChild(popper);\n }\n\n instance.state.isMounted = true;\n\n createPopperInstance();\n\n /* istanbul ignore else */\n if (__DEV__) {\n // Accessibility check\n warnWhen(\n instance.props.interactive &&\n appendTo === defaultProps.appendTo &&\n node.nextElementSibling !== popper,\n [\n 'Interactive tippy element may not be accessible via keyboard',\n 'navigation because it is not directly after the reference element',\n 'in the DOM source order.',\n '\\n\\n',\n 'Using a wrapper <div> or <span> tag around the reference element',\n 'solves this by creating a new parentNode context.',\n '\\n\\n',\n 'Specifying `appendTo: document.body` silences this warning, but it',\n 'assumes you are using a focus management solution to handle',\n 'keyboard navigation.',\n '\\n\\n',\n 'See: https://atomiks.github.io/tippyjs/v6/accessibility/#interactivity',\n ].join(' ')\n );\n }\n }\n\n function getNestedPopperTree(): PopperElement[] {\n return arrayFrom(\n popper.querySelectorAll('[data-__NAMESPACE_PREFIX__-root]')\n );\n }\n\n function scheduleShow(event?: Event): void {\n instance.clearDelayTimeouts();\n\n if (event) {\n invokeHook('onTrigger', [instance, event]);\n }\n\n addDocumentPress();\n\n let delay = getDelay(true);\n const [touchValue, touchDelay] = getNormalizedTouchSettings();\n\n if (currentInput.isTouch && touchValue === 'hold' && touchDelay) {\n delay = touchDelay;\n }\n\n if (delay) {\n showTimeout = setTimeout(() => {\n instance.show();\n }, delay);\n } else {\n instance.show();\n }\n }\n\n function scheduleHide(event: Event): void {\n instance.clearDelayTimeouts();\n\n invokeHook('onUntrigger', [instance, event]);\n\n if (!instance.state.isVisible) {\n removeDocumentPress();\n\n return;\n }\n\n // For interactive tippies, scheduleHide is added to a document.body handler\n // from onMouseLeave so must intercept scheduled hides from mousemove/leave\n // events when trigger contains mouseenter and click, and the tip is\n // currently shown as a result of a click.\n if (\n instance.props.trigger.indexOf('mouseenter') >= 0 &&\n instance.props.trigger.indexOf('click') >= 0 &&\n ['mouseleave', 'mousemove'].indexOf(event.type) >= 0 &&\n isVisibleFromClick\n ) {\n return;\n }\n\n const delay = getDelay(false);\n\n if (delay) {\n hideTimeout = setTimeout(() => {\n if (instance.state.isVisible) {\n instance.hide();\n }\n }, delay);\n } else {\n // Fixes a `transitionend` problem when it fires 1 frame too\n // late sometimes, we don't want hide() to be called.\n scheduleHideAnimationFrame = requestAnimationFrame(() => {\n instance.hide();\n });\n }\n }\n\n // ===========================================================================\n // 🔑 Public methods\n // ===========================================================================\n function enable(): void {\n instance.state.isEnabled = true;\n }\n\n function disable(): void {\n // Disabling the instance should also hide it\n // https://github.com/atomiks/tippy.js-react/issues/106\n instance.hide();\n instance.state.isEnabled = false;\n }\n\n function clearDelayTimeouts(): void {\n clearTimeout(showTimeout);\n clearTimeout(hideTimeout);\n cancelAnimationFrame(scheduleHideAnimationFrame);\n }\n\n function setProps(partialProps: Partial<Props>): void {\n /* istanbul ignore else */\n if (__DEV__) {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('setProps'));\n }\n\n if (instance.state.isDestroyed) {\n return;\n }\n\n invokeHook('onBeforeUpdate', [instance, partialProps]);\n\n removeListeners();\n\n const prevProps = instance.props;\n const nextProps = evaluateProps(reference, {\n ...prevProps,\n ...removeUndefinedProps(partialProps),\n ignoreAttributes: true,\n });\n\n instance.props = nextProps;\n\n addListeners();\n\n if (prevProps.interactiveDebounce !== nextProps.interactiveDebounce) {\n cleanupInteractiveMouseListeners();\n debouncedOnMouseMove = debounce(\n onMouseMove,\n nextProps.interactiveDebounce\n );\n }\n\n // Ensure stale aria-expanded attributes are removed\n if (prevProps.triggerTarget && !nextProps.triggerTarget) {\n normalizeToArray(prevProps.triggerTarget).forEach((node) => {\n node.removeAttribute('aria-expanded');\n });\n } else if (nextProps.triggerTarget) {\n reference.removeAttribute('aria-expanded');\n }\n\n handleAriaExpandedAttribute();\n handleStyles();\n\n if (onUpdate) {\n onUpdate(prevProps, nextProps);\n }\n\n if (instance.popperInstance) {\n createPopperInstance();\n\n // Fixes an issue with nested tippies if they are all getting re-rendered,\n // and the nested ones get re-rendered first.\n // https://github.com/atomiks/tippyjs-react/issues/177\n // TODO: find a cleaner / more efficient solution(!)\n getNestedPopperTree().forEach((nestedPopper) => {\n // React (and other UI libs likely) requires a rAF wrapper as it flushes\n // its work in one\n requestAnimationFrame(nestedPopper._tippy!.popperInstance!.forceUpdate);\n });\n }\n\n invokeHook('onAfterUpdate', [instance, partialProps]);\n }\n\n function setContent(content: Content): void {\n instance.setProps({content});\n }\n\n function show(): void {\n /* istanbul ignore else */\n if (__DEV__) {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('show'));\n }\n\n // Early bail-out\n const isAlreadyVisible = instance.state.isVisible;\n const isDestroyed = instance.state.isDestroyed;\n const isDisabled = !instance.state.isEnabled;\n const isTouchAndTouchDisabled =\n currentInput.isTouch && !instance.props.touch;\n const duration = getValueAtIndexOrReturn(\n instance.props.duration,\n 0,\n defaultProps.duration\n );\n\n if (\n isAlreadyVisible ||\n isDestroyed ||\n isDisabled ||\n isTouchAndTouchDisabled\n ) {\n return;\n }\n\n // Normalize `disabled` behavior across browsers.\n // Firefox allows events on disabled elements, but Chrome doesn't.\n // Using a wrapper element (i.e. <span>) is recommended.\n if (getCurrentTarget().hasAttribute('disabled')) {\n return;\n }\n\n invokeHook('onShow', [instance], false);\n if (instance.props.onShow(instance) === false) {\n return;\n }\n\n instance.state.isVisible = true;\n\n if (getIsDefaultRenderFn()) {\n popper.style.visibility = 'visible';\n }\n\n handleStyles();\n addDocumentPress();\n\n if (!instance.state.isMounted) {\n popper.style.transition = 'none';\n }\n\n // If flipping to the opposite side after hiding at least once, the\n // animation will use the wrong placement without resetting the duration\n if (getIsDefaultRenderFn()) {\n const {box, content} = getDefaultTemplateChildren();\n setTransitionDuration([box, content], 0);\n }\n\n onFirstUpdate = (): void => {\n if (!instance.state.isVisible || ignoreOnFirstUpdate) {\n return;\n }\n\n ignoreOnFirstUpdate = true;\n\n // reflow\n void popper.offsetHeight;\n\n popper.style.transition = instance.props.moveTransition;\n\n if (getIsDefaultRenderFn() && instance.props.animation) {\n const {box, content} = getDefaultTemplateChildren();\n setTransitionDuration([box, content], duration);\n setVisibilityState([box, content], 'visible');\n }\n\n handleAriaContentAttribute();\n handleAriaExpandedAttribute();\n\n pushIfUnique(mountedInstances, instance);\n\n // certain modifiers (e.g. `maxSize`) require a second update after the\n // popper has been positioned for the first time\n instance.popperInstance?.forceUpdate();\n\n invokeHook('onMount', [instance]);\n\n if (instance.props.animation && getIsDefaultRenderFn()) {\n onTransitionedIn(duration, () => {\n instance.state.isShown = true;\n invokeHook('onShown', [instance]);\n });\n }\n };\n\n mount();\n }\n\n function hide(): void {\n /* istanbul ignore else */\n if (__DEV__) {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('hide'));\n }\n\n // Early bail-out\n const isAlreadyHidden = !instance.state.isVisible;\n const isDestroyed = instance.state.isDestroyed;\n const isDisabled = !instance.state.isEnabled;\n const duration = getValueAtIndexOrReturn(\n instance.props.duration,\n 1,\n defaultProps.duration\n );\n\n if (isAlreadyHidden || isDestroyed || isDisabled) {\n return;\n }\n\n invokeHook('onHide', [instance], false);\n if (instance.props.onHide(instance) === false) {\n return;\n }\n\n instance.state.isVisible = false;\n instance.state.isShown = false;\n ignoreOnFirstUpdate = false;\n isVisibleFromClick = false;\n\n if (getIsDefaultRenderFn()) {\n popper.style.visibility = 'hidden';\n }\n\n cleanupInteractiveMouseListeners();\n removeDocumentPress();\n handleStyles(true);\n\n if (getIsDefaultRenderFn()) {\n const {box, content} = getDefaultTemplateChildren();\n\n if (instance.props.animation) {\n setTransitionDuration([box, content], duration);\n setVisibilityState([box, content], 'hidden');\n }\n }\n\n handleAriaContentAttribute();\n handleAriaExpandedAttribute();\n\n if (instance.props.animation) {\n if (getIsDefaultRenderFn()) {\n onTransitionedOut(duration, instance.unmount);\n }\n } else {\n instance.unmount();\n }\n }\n\n function hideWithInteractivity(event: MouseEvent): void {\n /* istanbul ignore else */\n if (__DEV__) {\n warnWhen(\n instance.state.isDestroyed,\n createMemoryLeakWarning('hideWithInteractivity')\n );\n }\n\n getDocument().addEventListener('mousemove', debouncedOnMouseMove);\n pushIfUnique(mouseMoveListeners, debouncedOnMouseMove);\n debouncedOnMouseMove(event);\n }\n\n function unmount(): void {\n /* istanbul ignore else */\n if (__DEV__) {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('unmount'));\n }\n\n if (instance.state.isVisible) {\n instance.hide();\n }\n\n if (!instance.state.isMounted) {\n return;\n }\n\n destroyPopperInstance();\n\n // If a popper is not interactive, it will be appended outside the popper\n // tree by default. This seems mainly for interactive tippies, but we should\n // find a workaround if possible\n getNestedPopperTree().forEach((nestedPopper) => {\n nestedPopper._tippy!.unmount();\n });\n\n if (popper.parentNode) {\n popper.parentNode.removeChild(popper);\n }\n\n mountedInstances = mountedInstances.filter((i) => i !== instance);\n\n instance.state.isMounted = false;\n invokeHook('onHidden', [instance]);\n }\n\n function destroy(): void {\n /* istanbul ignore else */\n if (__DEV__) {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('destroy'));\n }\n\n if (instance.state.isDestroyed) {\n return;\n }\n\n instance.clearDelayTimeouts();\n instance.unmount();\n\n removeListeners();\n\n delete reference._tippy;\n\n instance.state.isDestroyed = true;\n\n invokeHook('onDestroy', [instance]);\n }\n}\n", "import bindGlobalEventListeners, {\n currentInput,\n} from './bindGlobalEventListeners';\nimport createTippy, {mountedInstances} from './createTippy';\nimport {getArrayOfElements, isElement, isReferenceElement} from './dom-utils';\nimport {defaultProps, setDefaultProps, validateProps} from './props';\nimport {HideAll, HideAllOptions, Instance, Props, Targets} from './types';\nimport {validateTargets, warnWhen} from './validation';\n\nfunction tippy(\n targets: Targets,\n optionalProps: Partial<Props> = {}\n): Instance | Instance[] {\n const plugins = defaultProps.plugins.concat(optionalProps.plugins || []);\n\n /* istanbul ignore else */\n if (__DEV__) {\n validateTargets(targets);\n validateProps(optionalProps, plugins);\n }\n\n bindGlobalEventListeners();\n\n const passedProps: Partial<Props> = {...optionalProps, plugins};\n\n const elements = getArrayOfElements(targets);\n\n /* istanbul ignore else */\n if (__DEV__) {\n const isSingleContentElement = isElement(passedProps.content);\n const isMoreThanOneReferenceElement = elements.length > 1;\n warnWhen(\n isSingleContentElement && isMoreThanOneReferenceElement,\n [\n 'tippy() was passed an Element as the `content` prop, but more than',\n 'one tippy instance was created by this invocation. This means the',\n 'content element will only be appended to the last tippy instance.',\n '\\n\\n',\n 'Instead, pass the .innerHTML of the element, or use a function that',\n 'returns a cloned version of the element instead.',\n '\\n\\n',\n '1) content: element.innerHTML\\n',\n '2) content: () => element.cloneNode(true)',\n ].join(' ')\n );\n }\n\n const instances = elements.reduce<Instance[]>(\n (acc, reference): Instance[] => {\n const instance = reference && createTippy(reference, passedProps);\n\n if (instance) {\n acc.push(instance);\n }\n\n return acc;\n },\n []\n );\n\n return isElement(targets) ? instances[0] : instances;\n}\n\ntippy.defaultProps = defaultProps;\ntippy.setDefaultProps = setDefaultProps;\ntippy.currentInput = currentInput;\n\nexport default tippy;\n\nexport const hideAll: HideAll = ({\n exclude: excludedReferenceOrInstance,\n duration,\n}: HideAllOptions = {}) => {\n mountedInstances.forEach((instance) => {\n let isExcluded = false;\n\n if (excludedReferenceOrInstance) {\n isExcluded = isReferenceElement(excludedReferenceOrInstance)\n ? instance.reference === excludedReferenceOrInstance\n : instance.popper === (excludedReferenceOrInstance as Instance).popper;\n }\n\n if (!isExcluded) {\n const originalDuration = instance.props.duration;\n\n instance.setProps({duration});\n instance.hide();\n\n if (!instance.state.isDestroyed) {\n instance.setProps({duration: originalDuration});\n }\n }\n });\n};\n", "import tippy from '..';\nimport {div} from '../dom-utils';\nimport {\n CreateSingleton,\n Plugin,\n CreateSingletonProps,\n ReferenceElement,\n CreateSingletonInstance,\n Instance,\n Props,\n} from '../types';\nimport {normalizeToArray, removeProperties} from '../utils';\nimport {errorWhen} from '../validation';\nimport {applyStyles, Modifier} from '@popperjs/core';\n\n// The default `applyStyles` modifier has a cleanup function that gets called\n// every time the popper is destroyed (i.e. a new target), removing the styles\n// and causing transitions to break for singletons when the console is open, but\n// most notably for non-transform styles being used, `gpuAcceleration: false`.\nconst applyStylesModifier: Modifier<'applyStyles', Record<string, unknown>> = {\n ...applyStyles,\n effect({state}) {\n const initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0',\n },\n arrow: {\n position: 'absolute',\n },\n reference: {},\n };\n\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n // intentionally return no cleanup function\n // return () => { ... }\n },\n};\n\nconst createSingleton: CreateSingleton = (\n tippyInstances,\n optionalProps = {}\n) => {\n /* istanbul ignore else */\n if (__DEV__) {\n errorWhen(\n !Array.isArray(tippyInstances),\n [\n 'The first argument passed to createSingleton() must be an array of',\n 'tippy instances. The passed value was',\n String(tippyInstances),\n ].join(' ')\n );\n }\n\n let individualInstances = tippyInstances;\n let references: Array<ReferenceElement> = [];\n let triggerTargets: Array<Element> = [];\n let currentTarget: Element | null;\n let overrides = optionalProps.overrides;\n let interceptSetPropsCleanups: Array<() => void> = [];\n let shownOnCreate = false;\n\n function setTriggerTargets(): void {\n triggerTargets = individualInstances\n .map((instance) =>\n normalizeToArray(instance.props.triggerTarget || instance.reference)\n )\n .reduce((acc, item) => acc.concat(item), []);\n }\n\n function setReferences(): void {\n references = individualInstances.map((instance) => instance.reference);\n }\n\n function enableInstances(isEnabled: boolean): void {\n individualInstances.forEach((instance) => {\n if (isEnabled) {\n instance.enable();\n } else {\n instance.disable();\n }\n });\n }\n\n function interceptSetProps(singleton: Instance): Array<() => void> {\n return individualInstances.map((instance) => {\n const originalSetProps = instance.setProps;\n\n instance.setProps = (props): void => {\n originalSetProps(props);\n\n if (instance.reference === currentTarget) {\n singleton.setProps(props);\n }\n };\n\n return (): void => {\n instance.setProps = originalSetProps;\n };\n });\n }\n\n // have to pass singleton, as it maybe undefined on first call\n function prepareInstance(\n singleton: Instance,\n target: ReferenceElement\n ): void {\n const index = triggerTargets.indexOf(target);\n\n // bail-out\n if (target === currentTarget) {\n return;\n }\n\n currentTarget = target;\n\n const overrideProps: Partial<Props> = (overrides || [])\n .concat('content')\n .reduce((acc, prop) => {\n (acc as any)[prop] = individualInstances[index].props[prop];\n return acc;\n }, {});\n\n singleton.setProps({\n ...overrideProps,\n getReferenceClientRect:\n typeof overrideProps.getReferenceClientRect === 'function'\n ? overrideProps.getReferenceClientRect\n : (): ClientRect => references[index]?.getBoundingClientRect(),\n });\n }\n\n enableInstances(false);\n setReferences();\n setTriggerTargets();\n\n const plugin: Plugin = {\n fn() {\n return {\n onDestroy(): void {\n enableInstances(true);\n },\n onHidden(): void {\n currentTarget = null;\n },\n onClickOutside(instance): void {\n if (instance.props.showOnCreate && !shownOnCreate) {\n shownOnCreate = true;\n currentTarget = null;\n }\n },\n onShow(instance): void {\n if (instance.props.showOnCreate && !shownOnCreate) {\n shownOnCreate = true;\n prepareInstance(instance, references[0]);\n }\n },\n onTrigger(instance, event): void {\n prepareInstance(instance, event.currentTarget as Element);\n },\n };\n },\n };\n\n const singleton = tippy(div(), {\n ...removeProperties(optionalProps, ['overrides']),\n plugins: [plugin, ...(optionalProps.plugins || [])],\n triggerTarget: triggerTargets,\n popperOptions: {\n ...optionalProps.popperOptions,\n modifiers: [\n ...(optionalProps.popperOptions?.modifiers || []),\n applyStylesModifier,\n ],\n },\n }) as CreateSingletonInstance<CreateSingletonProps>;\n\n const originalShow = singleton.show;\n\n singleton.show = (target?: ReferenceElement | Instance | number): void => {\n originalShow();\n\n // first time, showOnCreate or programmatic call with no params\n // default to showing first instance\n if (!currentTarget && target == null) {\n return prepareInstance(singleton, references[0]);\n }\n\n // triggered from event (do nothing as prepareInstance already called by onTrigger)\n // programmatic call with no params when already visible (do nothing again)\n if (currentTarget && target == null) {\n return;\n }\n\n // target is index of instance\n if (typeof target === 'number') {\n return (\n references[target] && prepareInstance(singleton, references[target])\n );\n }\n\n // target is a child tippy instance\n if (individualInstances.indexOf(target as Instance) >= 0) {\n const ref = (target as Instance).reference;\n return prepareInstance(singleton, ref);\n }\n\n // target is a ReferenceElement\n if (references.indexOf(target as ReferenceElement) >= 0) {\n return prepareInstance(singleton, target as ReferenceElement);\n }\n };\n\n singleton.showNext = (): void => {\n const first = references[0];\n if (!currentTarget) {\n return singleton.show(0);\n }\n const index = references.indexOf(currentTarget);\n singleton.show(references[index + 1] || first);\n };\n\n singleton.showPrevious = (): void => {\n const last = references[references.length - 1];\n if (!currentTarget) {\n return singleton.show(last);\n }\n const index = references.indexOf(currentTarget);\n const target = references[index - 1] || last;\n singleton.show(target);\n };\n\n const originalSetProps = singleton.setProps;\n\n singleton.setProps = (props): void => {\n overrides = props.overrides || overrides;\n originalSetProps(props);\n };\n\n singleton.setInstances = (nextInstances): void => {\n enableInstances(true);\n interceptSetPropsCleanups.forEach((fn) => fn());\n\n individualInstances = nextInstances;\n\n enableInstances(false);\n setReferences();\n setTriggerTargets();\n interceptSetPropsCleanups = interceptSetProps(singleton);\n\n singleton.setProps({triggerTarget: triggerTargets});\n };\n\n interceptSetPropsCleanups = interceptSetProps(singleton);\n\n return singleton;\n};\n\nexport default createSingleton;\n", "import tippy from '..';\nimport {TOUCH_OPTIONS} from '../constants';\nimport {defaultProps} from '../props';\nimport {Instance, Props, Targets} from '../types';\nimport {ListenerObject} from '../types-internal';\nimport {normalizeToArray, removeProperties} from '../utils';\nimport {errorWhen} from '../validation';\n\nconst BUBBLING_EVENTS_MAP = {\n mouseover: 'mouseenter',\n focusin: 'focus',\n click: 'click',\n};\n\n/**\n * Creates a delegate instance that controls the creation of tippy instances\n * for child elements (`target` CSS selector).\n */\nfunction delegate(\n targets: Targets,\n props: Partial<Props> & {target: string}\n): Instance | Instance[] {\n /* istanbul ignore else */\n if (__DEV__) {\n errorWhen(\n !(props && props.target),\n [\n 'You must specity a `target` prop indicating a CSS selector string matching',\n 'the target elements that should receive a tippy.',\n ].join(' ')\n );\n }\n\n let listeners: ListenerObject[] = [];\n let childTippyInstances: Instance[] = [];\n let disabled = false;\n\n const {target} = props;\n\n const nativeProps = removeProperties(props, ['target']);\n const parentProps = {...nativeProps, trigger: 'manual', touch: false};\n const childProps = {\n touch: defaultProps.touch,\n ...nativeProps,\n showOnCreate: true,\n };\n\n const returnValue = tippy(targets, parentProps);\n const normalizedReturnValue = normalizeToArray(returnValue);\n\n function onTrigger(event: Event): void {\n if (!event.target || disabled) {\n return;\n }\n\n const targetNode = (event.target as Element).closest(target);\n\n if (!targetNode) {\n return;\n }\n\n // Get relevant trigger with fallbacks:\n // 1. Check `data-tippy-trigger` attribute on target node\n // 2. Fallback to `trigger` passed to `delegate()`\n // 3. Fallback to `defaultProps.trigger`\n const trigger =\n targetNode.getAttribute('data-tippy-trigger') ||\n props.trigger ||\n defaultProps.trigger;\n\n // @ts-ignore\n if (targetNode._tippy) {\n return;\n }\n\n if (event.type === 'touchstart' && typeof childProps.touch === 'boolean') {\n return;\n }\n\n if (\n event.type !== 'touchstart' &&\n trigger.indexOf((BUBBLING_EVENTS_MAP as any)[event.type]) < 0\n ) {\n return;\n }\n\n const instance = tippy(targetNode, childProps);\n\n if (instance) {\n childTippyInstances = childTippyInstances.concat(instance);\n }\n }\n\n function on(\n node: Element,\n eventType: string,\n handler: EventListener,\n options: boolean | Record<string, unknown> = false\n ): void {\n node.addEventListener(eventType, handler, options);\n listeners.push({node, eventType, handler, options});\n }\n\n function addEventListeners(instance: Instance): void {\n const {reference} = instance;\n\n on(reference, 'touchstart', onTrigger, TOUCH_OPTIONS);\n on(reference, 'mouseover', onTrigger);\n on(reference, 'focusin', onTrigger);\n on(reference, 'click', onTrigger);\n }\n\n function removeEventListeners(): void {\n listeners.forEach(({node, eventType, handler, options}: ListenerObject) => {\n node.removeEventListener(eventType, handler, options);\n });\n listeners = [];\n }\n\n function applyMutations(instance: Instance): void {\n const originalDestroy = instance.destroy;\n const originalEnable = instance.enable;\n const originalDisable = instance.disable;\n\n instance.destroy = (shouldDestroyChildInstances = true): void => {\n if (shouldDestroyChildInstances) {\n childTippyInstances.forEach((instance) => {\n instance.destroy();\n });\n }\n\n childTippyInstances = [];\n\n removeEventListeners();\n originalDestroy();\n };\n\n instance.enable = (): void => {\n originalEnable();\n childTippyInstances.forEach((instance) => instance.enable());\n disabled = false;\n };\n\n instance.disable = (): void => {\n originalDisable();\n childTippyInstances.forEach((instance) => instance.disable());\n disabled = true;\n };\n\n addEventListeners(instance);\n }\n\n normalizedReturnValue.forEach(applyMutations);\n\n return returnValue;\n}\n\nexport default delegate;\n", "import {BACKDROP_CLASS} from '../constants';\nimport {div, setVisibilityState} from '../dom-utils';\nimport {getChildren} from '../template';\nimport {AnimateFill} from '../types';\nimport {errorWhen} from '../validation';\n\nconst animateFill: AnimateFill = {\n name: 'animateFill',\n defaultValue: false,\n fn(instance) {\n // @ts-ignore\n if (!instance.props.render?.$$tippy) {\n if (__DEV__) {\n errorWhen(\n instance.props.animateFill,\n 'The `animateFill` plugin requires the default render function.'\n );\n }\n\n return {};\n }\n\n const {box, content} = getChildren(instance.popper);\n\n const backdrop = instance.props.animateFill\n ? createBackdropElement()\n : null;\n\n return {\n onCreate(): void {\n if (backdrop) {\n box.insertBefore(backdrop, box.firstElementChild!);\n box.setAttribute('data-animatefill', '');\n box.style.overflow = 'hidden';\n\n instance.setProps({arrow: false, animation: 'shift-away'});\n }\n },\n onMount(): void {\n if (backdrop) {\n const {transitionDuration} = box.style;\n const duration = Number(transitionDuration.replace('ms', ''));\n\n // The content should fade in after the backdrop has mostly filled the\n // tooltip element. `clip-path` is the other alternative but is not\n // well-supported and is buggy on some devices.\n content.style.transitionDelay = `${Math.round(duration / 10)}ms`;\n\n backdrop.style.transitionDuration = transitionDuration;\n setVisibilityState([backdrop], 'visible');\n }\n },\n onShow(): void {\n if (backdrop) {\n backdrop.style.transitionDuration = '0ms';\n }\n },\n onHide(): void {\n if (backdrop) {\n setVisibilityState([backdrop], 'hidden');\n }\n },\n };\n },\n};\n\nexport default animateFill;\n\nfunction createBackdropElement(): HTMLDivElement {\n const backdrop = div();\n backdrop.className = BACKDROP_CLASS;\n setVisibilityState([backdrop], 'hidden');\n return backdrop;\n}\n", "import {getOwnerDocument, isMouseEvent} from '../dom-utils';\nimport {FollowCursor, Instance} from '../types';\n\nlet mouseCoords = {clientX: 0, clientY: 0};\nlet activeInstances: Array<{instance: Instance; doc: Document}> = [];\n\nfunction storeMouseCoords({clientX, clientY}: MouseEvent): void {\n mouseCoords = {clientX, clientY};\n}\n\nfunction addMouseCoordsListener(doc: Document): void {\n doc.addEventListener('mousemove', storeMouseCoords);\n}\n\nfunction removeMouseCoordsListener(doc: Document): void {\n doc.removeEventListener('mousemove', storeMouseCoords);\n}\n\nconst followCursor: FollowCursor = {\n name: 'followCursor',\n defaultValue: false,\n fn(instance) {\n const reference = instance.reference;\n const doc = getOwnerDocument(instance.props.triggerTarget || reference);\n\n let isInternalUpdate = false;\n let wasFocusEvent = false;\n let isUnmounted = true;\n let prevProps = instance.props;\n\n function getIsInitialBehavior(): boolean {\n return (\n instance.props.followCursor === 'initial' && instance.state.isVisible\n );\n }\n\n function addListener(): void {\n doc.addEventListener('mousemove', onMouseMove);\n }\n\n function removeListener(): void {\n doc.removeEventListener('mousemove', onMouseMove);\n }\n\n function unsetGetReferenceClientRect(): void {\n isInternalUpdate = true;\n instance.setProps({getReferenceClientRect: null});\n isInternalUpdate = false;\n }\n\n function onMouseMove(event: MouseEvent): void {\n // If the instance is interactive, avoid updating the position unless it's\n // over the reference element\n const isCursorOverReference = event.target\n ? reference.contains(event.target as Node)\n : true;\n const {followCursor} = instance.props;\n const {clientX, clientY} = event;\n\n const rect = reference.getBoundingClientRect();\n const relativeX = clientX - rect.left;\n const relativeY = clientY - rect.top;\n\n if (isCursorOverReference || !instance.props.interactive) {\n instance.setProps({\n // @ts-ignore - unneeded DOMRect properties\n getReferenceClientRect() {\n const rect = reference.getBoundingClientRect();\n\n let x = clientX;\n let y = clientY;\n\n if (followCursor === 'initial') {\n x = rect.left + relativeX;\n y = rect.top + relativeY;\n }\n\n const top = followCursor === 'horizontal' ? rect.top : y;\n const right = followCursor === 'vertical' ? rect.right : x;\n const bottom = followCursor === 'horizontal' ? rect.bottom : y;\n const left = followCursor === 'vertical' ? rect.left : x;\n\n return {\n width: right - left,\n height: bottom - top,\n top,\n right,\n bottom,\n left,\n };\n },\n });\n }\n }\n\n function create(): void {\n if (instance.props.followCursor) {\n activeInstances.push({instance, doc});\n addMouseCoordsListener(doc);\n }\n }\n\n function destroy(): void {\n activeInstances = activeInstances.filter(\n (data) => data.instance !== instance\n );\n\n if (activeInstances.filter((data) => data.doc === doc).length === 0) {\n removeMouseCoordsListener(doc);\n }\n }\n\n return {\n onCreate: create,\n onDestroy: destroy,\n onBeforeUpdate(): void {\n prevProps = instance.props;\n },\n onAfterUpdate(_, {followCursor}): void {\n if (isInternalUpdate) {\n return;\n }\n\n if (\n followCursor !== undefined &&\n prevProps.followCursor !== followCursor\n ) {\n destroy();\n\n if (followCursor) {\n create();\n\n if (\n instance.state.isMounted &&\n !wasFocusEvent &&\n !getIsInitialBehavior()\n ) {\n addListener();\n }\n } else {\n removeListener();\n unsetGetReferenceClientRect();\n }\n }\n },\n onMount(): void {\n if (instance.props.followCursor && !wasFocusEvent) {\n if (isUnmounted) {\n onMouseMove(mouseCoords as MouseEvent);\n isUnmounted = false;\n }\n\n if (!getIsInitialBehavior()) {\n addListener();\n }\n }\n },\n onTrigger(_, event): void {\n if (isMouseEvent(event)) {\n mouseCoords = {clientX: event.clientX, clientY: event.clientY};\n }\n wasFocusEvent = event.type === 'focus';\n },\n onHidden(): void {\n if (instance.props.followCursor) {\n unsetGetReferenceClientRect();\n removeListener();\n isUnmounted = true;\n }\n },\n };\n },\n};\n\nexport default followCursor;\n", "import {Modifier, Placement} from '@popperjs/core';\nimport {isMouseEvent} from '../dom-utils';\nimport {BasePlacement, InlinePositioning, Props} from '../types';\nimport {arrayFrom, getBasePlacement} from '../utils';\n\nfunction getProps(props: Props, modifier: Modifier<any, any>): Partial<Props> {\n return {\n popperOptions: {\n ...props.popperOptions,\n modifiers: [\n ...(props.popperOptions?.modifiers || []).filter(\n ({name}) => name !== modifier.name\n ),\n modifier,\n ],\n },\n };\n}\n\nconst inlinePositioning: InlinePositioning = {\n name: 'inlinePositioning',\n defaultValue: false,\n fn(instance) {\n const {reference} = instance;\n\n function isEnabled(): boolean {\n return !!instance.props.inlinePositioning;\n }\n\n let placement: Placement;\n let cursorRectIndex = -1;\n let isInternalUpdate = false;\n let triedPlacements: Array<string> = [];\n\n const modifier: Modifier<\n 'tippyInlinePositioning',\n Record<string, unknown>\n > = {\n name: 'tippyInlinePositioning',\n enabled: true,\n phase: 'afterWrite',\n fn({state}) {\n if (isEnabled()) {\n if (triedPlacements.indexOf(state.placement) !== -1) {\n triedPlacements = [];\n }\n\n if (\n placement !== state.placement &&\n triedPlacements.indexOf(state.placement) === -1\n ) {\n triedPlacements.push(state.placement);\n instance.setProps({\n // @ts-ignore - unneeded DOMRect properties\n getReferenceClientRect: () =>\n getReferenceClientRect(state.placement),\n });\n }\n\n placement = state.placement;\n }\n },\n };\n\n function getReferenceClientRect(placement: Placement): Partial<DOMRect> {\n return getInlineBoundingClientRect(\n getBasePlacement(placement),\n reference.getBoundingClientRect(),\n arrayFrom(reference.getClientRects()),\n cursorRectIndex\n );\n }\n\n function setInternalProps(partialProps: Partial<Props>): void {\n isInternalUpdate = true;\n instance.setProps(partialProps);\n isInternalUpdate = false;\n }\n\n function addModifier(): void {\n if (!isInternalUpdate) {\n setInternalProps(getProps(instance.props, modifier));\n }\n }\n\n return {\n onCreate: addModifier,\n onAfterUpdate: addModifier,\n onTrigger(_, event): void {\n if (isMouseEvent(event)) {\n const rects = arrayFrom(instance.reference.getClientRects());\n const cursorRect = rects.find(\n (rect) =>\n rect.left - 2 <= event.clientX &&\n rect.right + 2 >= event.clientX &&\n rect.top - 2 <= event.clientY &&\n rect.bottom + 2 >= event.clientY\n );\n const index = rects.indexOf(cursorRect);\n cursorRectIndex = index > -1 ? index : cursorRectIndex;\n }\n },\n onHidden(): void {\n cursorRectIndex = -1;\n },\n };\n },\n};\n\nexport default inlinePositioning;\n\nexport function getInlineBoundingClientRect(\n currentBasePlacement: BasePlacement | null,\n boundingRect: DOMRect,\n clientRects: DOMRect[],\n cursorRectIndex: number\n): {\n top: number;\n bottom: number;\n left: number;\n right: number;\n width: number;\n height: number;\n} {\n // Not an inline element, or placement is not yet known\n if (clientRects.length < 2 || currentBasePlacement === null) {\n return boundingRect;\n }\n\n // There are two rects and they are disjoined\n if (\n clientRects.length === 2 &&\n cursorRectIndex >= 0 &&\n clientRects[0].left > clientRects[1].right\n ) {\n return clientRects[cursorRectIndex] || boundingRect;\n }\n\n switch (currentBasePlacement) {\n case 'top':\n case 'bottom': {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = currentBasePlacement === 'top';\n\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n\n return {top, bottom, left, right, width, height};\n }\n case 'left':\n case 'right': {\n const minLeft = Math.min(...clientRects.map((rects) => rects.left));\n const maxRight = Math.max(...clientRects.map((rects) => rects.right));\n const measureRects = clientRects.filter((rect) =>\n currentBasePlacement === 'left'\n ? rect.left === minLeft\n : rect.right === maxRight\n );\n\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n\n return {top, bottom, left, right, width, height};\n }\n default: {\n return boundingRect;\n }\n }\n}\n", "import {VirtualElement} from '@popperjs/core';\nimport {ReferenceElement, Sticky} from '../types';\n\nconst sticky: Sticky = {\n name: 'sticky',\n defaultValue: false,\n fn(instance) {\n const {reference, popper} = instance;\n\n function getReference(): ReferenceElement | VirtualElement {\n return instance.popperInstance\n ? instance.popperInstance.state.elements.reference\n : reference;\n }\n\n function shouldCheck(value: 'reference' | 'popper'): boolean {\n return instance.props.sticky === true || instance.props.sticky === value;\n }\n\n let prevRefRect: ClientRect | null = null;\n let prevPopRect: ClientRect | null = null;\n\n function updatePosition(): void {\n const currentRefRect = shouldCheck('reference')\n ? getReference().getBoundingClientRect()\n : null;\n const currentPopRect = shouldCheck('popper')\n ? popper.getBoundingClientRect()\n : null;\n\n if (\n (currentRefRect && areRectsDifferent(prevRefRect, currentRefRect)) ||\n (currentPopRect && areRectsDifferent(prevPopRect, currentPopRect))\n ) {\n if (instance.popperInstance) {\n instance.popperInstance.update();\n }\n }\n\n prevRefRect = currentRefRect;\n prevPopRect = currentPopRect;\n\n if (instance.state.isMounted) {\n requestAnimationFrame(updatePosition);\n }\n }\n\n return {\n onMount(): void {\n if (instance.props.sticky) {\n updatePosition();\n }\n },\n };\n },\n};\n\nexport default sticky;\n\nfunction areRectsDifferent(\n rectA: ClientRect | null,\n rectB: ClientRect | null\n): boolean {\n if (rectA && rectB) {\n return (\n rectA.top !== rectB.top ||\n rectA.right !== rectB.right ||\n rectA.bottom !== rectB.bottom ||\n rectA.left !== rectB.left\n );\n }\n\n return true;\n}\n", "import tippy from '../src';\nimport {render} from '../src/template';\n\ntippy.setDefaultProps({render});\n\nexport {default, hideAll} from '../src';\nexport {default as createSingleton} from '../src/addons/createSingleton';\nexport {default as delegate} from '../src/addons/delegate';\nexport {default as animateFill} from '../src/plugins/animateFill';\nexport {default as followCursor} from '../src/plugins/followCursor';\nexport {default as inlinePositioning} from '../src/plugins/inlinePositioning';\nexport {default as sticky} from '../src/plugins/sticky';\nexport {ROUND_ARROW as roundArrow} from '../src/constants';\n", "import { cn } from \"@/lib\";\nimport type { HTMLProps } from \"react\";\nimport { forwardRef } from \"react\";\n\nexport type SurfaceProps = HTMLProps<HTMLDivElement> & {\n withShadow?: boolean;\n withBorder?: boolean;\n};\n\nexport const Surface = forwardRef<HTMLDivElement, SurfaceProps>(\n ({ children, className, withShadow = true, withBorder = true, ...props }, ref) => {\n const surfaceClass = cn(\n \"courier-bg-white courier-rounded-lg dark:courier-bg-black\",\n withShadow ? \"courier-shadow-sm\" : \"\",\n withBorder ? \"courier-border courier-border-border dark:courier-border-neutral-800\" : \"\",\n className\n );\n\n return (\n <div className={surfaceClass} {...props} ref={ref}>\n {children}\n </div>\n );\n }\n);\n\nSurface.displayName = \"Surface\";\n", "import { Extension, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { Suggestion } from \"@tiptap/suggestion\";\nimport { suggestion } from \"./suggestion\";\nimport type { VariableNodeOptions, VariableOptions } from \"./Variable.types\";\nimport { VariableView } from \"./VariableView\";\n\nexport const VariableNode = Node.create<VariableNodeOptions>({\n name: \"variable\",\n group: \"inline\",\n inline: true,\n selectable: false,\n atom: true,\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n return {\n \"data-id\": attributes.id,\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"span[data-variable]\",\n },\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(VariableView);\n },\n});\n\nexport const Variable = Extension.create<VariableOptions>({\n name: \"variableSuggestion\",\n\n addOptions() {\n return {\n HTMLAttributes: {},\n suggestion: {\n char: \"{{\",\n ...suggestion,\n },\n };\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion,\n }),\n ];\n },\n});\n", "import type { Editor, Range } from \"@tiptap/core\";\nimport { ReactRenderer } from \"@tiptap/react\";\nimport type {\n SuggestionKeyDownProps,\n SuggestionOptions,\n SuggestionProps,\n} from \"@tiptap/suggestion\";\nimport type { Instance as TippyInstance } from \"tippy.js\";\nimport tippy from \"tippy.js\";\nimport type { VariableSuggestionsProps } from \"./Variable.types\";\nimport { VariableSuggestions } from \"./VariableSuggestions\";\nimport { getFlattenedVariables } from \"../../utils/getFlattenedVariables\";\n\nexport const suggestion: Partial<SuggestionOptions> = {\n items: ({ query, editor }: { query: string; editor: Editor }) => {\n const variables =\n editor.extensionManager.extensions.find((ext) => ext.name === \"variableSuggestion\")?.options\n ?.variables || {};\n\n const suggestions = getFlattenedVariables(variables);\n return suggestions.filter((item) => item.toLowerCase().includes(query.toLowerCase()));\n },\n\n char: \"{{\",\n allowSpaces: false,\n allowedPrefixes: null,\n startOfLine: false,\n decorationTag: \"span\",\n decorationClass: \"variable-suggestion\",\n\n command: ({ editor, range, props }: { editor: Editor; range: Range; props: string }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .insertContent([\n { type: \"variable\", attrs: { id: props } },\n { type: \"text\", text: \" \" },\n ])\n .run();\n },\n\n render: () => {\n let component: ReactRenderer<VariableSuggestionsProps> | null = null;\n let popup: TippyInstance | null = null;\n let currentProps: SuggestionProps | null = null;\n\n const updateComponent = (props: SuggestionProps, index: number) => {\n component?.updateProps({\n ...props,\n selected: index,\n });\n };\n\n const selectItem = (index: number) => {\n if (!currentProps) return false;\n\n const items = suggestion.items?.({\n query: (component?.props as VariableSuggestionsProps).query || \"\",\n editor: (component?.props as VariableSuggestionsProps).editor,\n }) as string[];\n\n const item = items[index];\n if (item) {\n suggestion.command?.({\n editor: currentProps.editor,\n range: currentProps.range,\n props: item,\n });\n return true;\n }\n return false;\n };\n\n return {\n onStart: (props: SuggestionProps) => {\n currentProps = props;\n component = new ReactRenderer(VariableSuggestions, {\n props: {\n ...props,\n selected: 0,\n },\n editor: props.editor,\n });\n\n if (!props.clientRect) return;\n\n popup = tippy(props.editor.options.element, {\n getReferenceClientRect: () => props.clientRect?.() || new DOMRect(),\n appendTo: () => props.editor.options.element,\n content: component?.element,\n showOnCreate: true,\n interactive: true,\n trigger: \"manual\",\n placement: \"bottom-start\",\n theme: \"variable\",\n });\n\n // Focus the popup element\n if (component?.element) {\n (component.element as HTMLElement).focus();\n }\n },\n\n onUpdate(props: SuggestionProps) {\n currentProps = props;\n\n component?.updateProps({\n ...props,\n selected: (component.props as VariableSuggestionsProps).selected,\n });\n\n if (!props.clientRect) return;\n\n popup?.setProps({\n getReferenceClientRect: () => props.clientRect?.() || new DOMRect(),\n });\n },\n\n onKeyDown(props: SuggestionKeyDownProps) {\n if (!component || !currentProps) {\n return false;\n }\n\n const items = suggestion.items?.({\n query: (component.props as VariableSuggestionsProps).query || \"\",\n editor: (component.props as VariableSuggestionsProps).editor,\n }) as string[];\n\n const currentIndex = (component.props as VariableSuggestionsProps).selected;\n\n if (props.event.key === \"ArrowUp\") {\n const newIndex = (currentIndex - 1 + items.length) % items.length;\n updateComponent(currentProps, newIndex);\n return true;\n }\n\n if (props.event.key === \"ArrowDown\") {\n const newIndex = (currentIndex + 1) % items.length;\n updateComponent(currentProps, newIndex);\n return true;\n }\n\n if (props.event.key === \"Enter\") {\n props.event.preventDefault();\n return selectItem(currentIndex);\n }\n\n if (props.event.key === \"Escape\") {\n // Replicate the cleanup that happens in command()\n currentProps.editor.chain().focus().deleteRange(currentProps.range).run();\n return true;\n }\n\n return false;\n },\n\n onExit() {\n popup?.destroy();\n component?.destroy();\n currentProps = null;\n },\n };\n },\n};\n", "import type { NodeViewProps } from \"@tiptap/core\";\nimport { NodeViewWrapper } from \"@tiptap/react\";\nimport { Braces } from \"lucide-react\";\nimport React from \"react\";\n\nexport const VariableView: React.FC<NodeViewProps> = ({ node }) => {\n return (\n <NodeViewWrapper className=\"courier-inline-block\">\n <span className=\"courier-group courier-text-sm courier-variable-node courier-bg-gray-200 courier-pl-2 courier-pr-3 courier-py-[1px] courier-rounded courier-border courier-border-gray-400 hover:courier-bg-accent-foreground hover:courier-border-accent-foreground hover:courier-text-secondary-foreground courier-flex courier-items-center courier-gap-1\">\n <Braces size={16} className=\"courier-text-gray-500 group-hover:courier-stroke-primary\" />\n {node.attrs.id}\n </span>\n </NodeViewWrapper>\n );\n};\n", "import type { Editor } from \"@tiptap/react\";\nimport { ImageBlock } from \"../extensions\";\n\nexport const isTableGripSelected = (node: HTMLElement) => {\n let container = node;\n\n while (container && ![\"TD\", \"TH\"].includes(container.tagName)) {\n container = container.parentElement!;\n }\n\n const gripColumn =\n container && container.querySelector && container.querySelector(\"a.grip-column.selected\");\n const gripRow =\n container && container.querySelector && container.querySelector(\"a.grip-row.selected\");\n\n if (gripColumn || gripRow) {\n return true;\n }\n\n return false;\n};\n\nexport const isCustomNodeSelected = (editor: Editor, node: HTMLElement) => {\n const customNodes = [ImageBlock.name];\n\n return customNodes.some((type) => editor.isActive(type)) || isTableGripSelected(node);\n};\n\nexport default isCustomNodeSelected;\n", "import type { Editor } from \"@tiptap/react\";\nimport { isTextSelection } from \"@tiptap/core\";\n\nexport const isTextSelected = ({ editor }: { editor: Editor }) => {\n const {\n state: {\n doc,\n selection,\n selection: { empty, from, to },\n },\n } = editor;\n\n // Sometime check for `empty` is not enough.\n // Doubleclick an empty paragraph returns a node size of 2.\n // So we check also for an empty text size.\n const isEmptyTextBlock = !doc.textBetween(from, to).length && isTextSelection(selection);\n\n if (empty || isEmptyTextBlock || !editor.isEditable) {\n return false;\n }\n\n return true;\n};\n\nexport default isTextSelected;\n", "import type { Fragment, Node } from \"@tiptap/pm/model\";\nimport type { Editor as TiptapEditor } from \"@tiptap/react\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { defaultButtonProps } from \"../extensions/Button/Button\";\nimport { defaultDividerProps, defaultSpacerProps } from \"../extensions/Divider/Divider\";\nimport { defaultImageProps } from \"../extensions/ImageBlock/ImageBlock\";\nimport { defaultTextBlockProps } from \"../extensions/TextBlock\";\n\n// Helper function to find a node position by its ID\nexport const findNodePositionById = (editor: TiptapEditor, id: string): number | null => {\n let foundPos: number | null = null;\n\n editor.state.doc.descendants((node, pos) => {\n if (node.attrs.id === id) {\n foundPos = pos;\n return false; // Stop traversal\n }\n return true; // Continue traversal\n });\n\n return foundPos;\n};\n\n// Helper function to create a new node or duplicate an existing one\nexport const createOrDuplicateNode = (\n editor: TiptapEditor,\n nodeType: string,\n insertPos: number,\n sourceNodeAttrs?: Record<string, unknown>,\n setSelectedNode?: (node: unknown) => void,\n sourceNodeContent?: unknown\n): string => {\n // Generate a new unique ID\n const id = `node-${uuidv4()}`;\n\n // Define node creation functions with default props\n const nodeTypes: Record<string, () => unknown> = {\n heading: () => {\n const node = editor.schema.nodes.heading.create(\n {\n ...defaultTextBlockProps,\n ...sourceNodeAttrs,\n id,\n },\n sourceNodeContent as Node | Fragment | readonly Node[] | null | undefined\n );\n return node;\n },\n paragraph: () => {\n const node = editor.schema.nodes.paragraph.create(\n {\n ...defaultTextBlockProps,\n ...sourceNodeAttrs,\n id,\n },\n sourceNodeContent as Node | Fragment | readonly Node[] | null | undefined\n );\n return node;\n },\n text: () => {\n const node = editor.schema.nodes.paragraph.create(\n {\n ...defaultTextBlockProps,\n ...sourceNodeAttrs,\n id,\n },\n sourceNodeContent as Node | Fragment | readonly Node[] | null | undefined\n );\n return node;\n },\n spacer: () => {\n const node = editor.schema.nodes.divider.create({\n ...defaultSpacerProps,\n ...sourceNodeAttrs,\n id,\n });\n return node;\n },\n divider: () => {\n const node = editor.schema.nodes.divider.create({\n ...defaultDividerProps,\n ...sourceNodeAttrs,\n id,\n });\n return node;\n },\n button: () => {\n const node = editor.schema.nodes.button.create(\n {\n ...defaultButtonProps,\n ...sourceNodeAttrs,\n id,\n },\n sourceNodeContent as Node | Fragment | readonly Node[] | null | undefined\n );\n return node;\n },\n imageBlock: () => {\n const node = editor.schema.nodes.imageBlock.create({\n ...defaultImageProps,\n ...sourceNodeAttrs,\n id,\n });\n return node;\n },\n image: () => {\n // Fallback for image nodes (in case the type is 'image' instead of 'imageBlock')\n const node = editor.schema.nodes.imageBlock.create({\n ...defaultImageProps,\n ...sourceNodeAttrs,\n id,\n });\n return node;\n },\n };\n\n // Create the node\n const createNode = nodeTypes[nodeType];\n if (createNode) {\n try {\n // Create and insert the node\n const tr = editor.state.tr;\n const newNode = createNode();\n\n tr.insert(insertPos, newNode as Node | Fragment | readonly Node[]);\n editor.view.dispatch(tr);\n\n // Set selected node if callback provided\n if (setSelectedNode) {\n setSelectedNode(newNode);\n }\n\n // Focus on the newly created node if it's a text or heading\n if (nodeType === \"text\" || nodeType === \"paragraph\" || nodeType === \"heading\") {\n setTimeout(() => {\n // Find the node in the document by its ID\n const nodePos = findNodePositionById(editor, id);\n\n if (nodePos !== null) {\n // For text nodes, place cursor at the beginning of the node content\n editor.commands.setTextSelection(nodePos + 1);\n }\n editor.view.focus();\n }, 50);\n }\n\n // Dispatch a custom event to notify about the new node\n const customEvent = new CustomEvent(\"node-duplicated\", {\n detail: { newNodeId: id },\n });\n document.dispatchEvent(customEvent);\n } catch (error) {\n console.error(\"Error creating node:\", error);\n }\n } else {\n // Fallback for node types not explicitly defined\n try {\n // Check if the node type exists in the schema\n if (editor.schema.nodes[nodeType]) {\n const tr = editor.state.tr;\n const newNode = editor.schema.nodes[nodeType].create(\n {\n ...sourceNodeAttrs,\n id,\n },\n sourceNodeContent as Node | Fragment | readonly Node[] | null | undefined\n );\n\n tr.insert(insertPos, newNode as Node | Fragment | readonly Node[]);\n editor.view.dispatch(tr);\n\n // Set selected node if callback provided\n if (setSelectedNode) {\n setSelectedNode(newNode);\n }\n\n // Dispatch a custom event to notify about the new node\n const customEvent = new CustomEvent(\"node-duplicated\", {\n detail: { newNodeId: id },\n });\n document.dispatchEvent(customEvent);\n } else {\n console.error(`Cannot duplicate node: type \"${nodeType}\" not found in schema`);\n }\n } catch (error) {\n console.error(\"Error creating fallback node:\", error);\n }\n }\n\n return id;\n};\n", "import type { DroppableContainer, KeyboardCoordinateGetter } from \"@dnd-kit/core\";\nimport { closestCorners, getFirstCollision, KeyboardCode } from \"@dnd-kit/core\";\n\nconst directions: string[] = [\n KeyboardCode.Down,\n KeyboardCode.Right,\n KeyboardCode.Up,\n KeyboardCode.Left,\n];\n\nexport const coordinateGetter: KeyboardCoordinateGetter = (\n event,\n { context: { active, droppableRects, droppableContainers, collisionRect } }\n) => {\n if (directions.includes(event.code)) {\n event.preventDefault();\n\n if (!active || !collisionRect) {\n return;\n }\n\n const filteredContainers: DroppableContainer[] = [];\n\n droppableContainers.getEnabled().forEach((entry) => {\n if (!entry || entry?.disabled) {\n return;\n }\n\n const rect = droppableRects.get(entry.id);\n\n if (!rect) {\n return;\n }\n\n const data = entry.data.current;\n\n if (data) {\n const { type, children } = data;\n\n if (type === \"container\" && children?.length > 0) {\n if (active.data.current?.type !== \"container\") {\n return;\n }\n }\n }\n\n switch (event.code) {\n case KeyboardCode.Down:\n if (collisionRect.top < rect.top) {\n filteredContainers.push(entry);\n }\n break;\n case KeyboardCode.Up:\n if (collisionRect.top > rect.top) {\n filteredContainers.push(entry);\n }\n break;\n case KeyboardCode.Left:\n if (collisionRect.left >= rect.left + rect.width) {\n filteredContainers.push(entry);\n }\n break;\n case KeyboardCode.Right:\n if (collisionRect.left + collisionRect.width <= rect.left) {\n filteredContainers.push(entry);\n }\n break;\n }\n });\n\n const collisions = closestCorners({\n active,\n collisionRect: collisionRect,\n droppableRects,\n droppableContainers: filteredContainers,\n pointerCoordinates: null,\n });\n const closestId = getFirstCollision(collisions, \"id\");\n\n if (closestId != null) {\n const newDroppable = droppableContainers.get(closestId);\n const newNode = newDroppable?.node.current;\n const newRect = newDroppable?.rect.current;\n\n if (newNode && newRect) {\n if (newDroppable.id === \"placeholder\") {\n return {\n x: newRect.left + (newRect.width - collisionRect.width) / 2,\n y: newRect.top + (newRect.height - collisionRect.height) / 2,\n };\n }\n\n if (newDroppable.data.current?.type === \"container\") {\n return {\n x: newRect.left + 20,\n y: newRect.top + 74,\n };\n }\n\n return {\n x: newRect.left,\n y: newRect.top,\n };\n }\n }\n }\n\n return undefined;\n};\n", "import { cn } from \"@/lib\";\nimport { GripVertical } from \"lucide-react\";\nimport { forwardRef } from \"react\";\n\nexport const Handle = forwardRef<HTMLButtonElement, React.HTMLAttributes<HTMLButtonElement>>(\n (props, ref) => {\n return (\n <button\n {...props}\n ref={ref}\n data-cypress=\"draggable-handle\"\n className={cn(\n \"courier-flex-shrink-0 courier-p-1 courier-w-7 courier-h-7 courier-rounded-md courier-border courier-border-border courier-flex courier-items-center courier-justify-center courier-shadow-sm courier-bg-background hover:courier-bg-card courier-cursor-grab\",\n props.className\n )}\n >\n <GripVertical\n strokeWidth={1}\n className=\"courier-w-5 courier-stroke-ring courier-fill-ring\"\n />\n </button>\n );\n }\n);\n", "import type { Editor } from \"@tiptap/react\";\nimport { useAtomValue, useSetAtom } from \"jotai\";\nimport { useCallback } from \"react\";\nimport { selectedNodeAtom, setSelectedNodeAtom } from \"../store\";\n\nexport const useTextmenuCommands = (editor: Editor) => {\n const setSelectedNode = useSetAtom(setSelectedNodeAtom);\n const selectedNode = useAtomValue(selectedNodeAtom);\n\n // Helper function to find a node position by ID\n const findNodePositionById = useCallback(\n (id: string) => {\n let nodePos = -1;\n editor.state.doc.descendants((node, pos) => {\n if (node.attrs?.id === id) {\n nodePos = pos;\n return false; // Stop traversal\n }\n return true; // Continue traversal\n });\n return nodePos;\n },\n [editor]\n );\n\n // Helper function to update button attributes\n const updateButtonAttribute = useCallback(\n (attributeName: string, newValue: unknown) => {\n if (selectedNode?.type?.name === \"button\" && selectedNode.attrs?.id) {\n const nodeId = selectedNode.attrs.id;\n const nodePos = findNodePositionById(nodeId);\n\n if (nodePos >= 0) {\n // Update the node attributes\n const tr = editor.state.tr;\n tr.setNodeMarkup(nodePos, undefined, {\n ...editor.state.doc.nodeAt(nodePos)?.attrs,\n [attributeName]: newValue,\n });\n\n // Dispatch the transaction\n editor.view.dispatch(tr);\n\n // Ensure button remains selected\n setTimeout(() => {\n const updatedNodePos = findNodePositionById(nodeId);\n if (updatedNodePos >= 0) {\n const updatedNode = editor.state.doc.nodeAt(updatedNodePos);\n if (updatedNode) {\n setSelectedNode(updatedNode);\n }\n }\n }, 0);\n\n return true;\n }\n }\n\n return false;\n },\n [editor, selectedNode, findNodePositionById, setSelectedNode]\n );\n\n // Helper function to reset all button formatting\n const resetButtonFormatting = useCallback(() => {\n if (selectedNode?.type?.name === \"button\" && selectedNode.attrs?.id) {\n const nodeId = selectedNode.attrs.id;\n const nodePos = findNodePositionById(nodeId);\n\n if (nodePos >= 0) {\n const currentNode = editor.state.doc.nodeAt(nodePos);\n if (!currentNode) return false;\n\n // Create a new attributes object with formatting reset to defaults\n const newAttrs = {\n ...currentNode.attrs,\n fontWeight: \"normal\",\n fontStyle: \"normal\",\n isUnderline: false,\n isStrike: false,\n };\n\n // Update the node attributes\n const tr = editor.state.tr;\n tr.setNodeMarkup(nodePos, undefined, newAttrs);\n\n // Dispatch the transaction\n editor.view.dispatch(tr);\n\n // Ensure button remains selected\n setTimeout(() => {\n const updatedNodePos = findNodePositionById(nodeId);\n if (updatedNodePos >= 0) {\n const updatedNode = editor.state.doc.nodeAt(updatedNodePos);\n if (updatedNode) {\n setSelectedNode(updatedNode);\n }\n }\n }, 0);\n\n return true;\n }\n }\n\n return false;\n }, [editor, selectedNode, findNodePositionById, setSelectedNode]);\n\n const onBold = useCallback(() => {\n if (selectedNode?.type?.name === \"button\") {\n const newFontWeight = selectedNode.attrs.fontWeight === \"bold\" ? \"normal\" : \"bold\";\n const result = updateButtonAttribute(\"fontWeight\", newFontWeight);\n if (result) return true;\n }\n\n return editor.chain().focus().toggleBold().run();\n }, [editor, selectedNode, updateButtonAttribute]);\n\n const onItalic = useCallback(() => {\n if (selectedNode?.type?.name === \"button\") {\n const newFontStyle = selectedNode.attrs.fontStyle === \"italic\" ? \"normal\" : \"italic\";\n const result = updateButtonAttribute(\"fontStyle\", newFontStyle);\n if (result) return true;\n }\n\n return editor.chain().focus().toggleItalic().run();\n }, [editor, selectedNode, updateButtonAttribute]);\n\n const onStrike = useCallback(() => {\n if (selectedNode?.type?.name === \"button\") {\n const newIsStrike = !selectedNode.attrs.isStrike;\n const result = updateButtonAttribute(\"isStrike\", newIsStrike);\n if (result) return true;\n }\n\n return editor.chain().focus().toggleMark(\"strike\").run();\n }, [editor, selectedNode, updateButtonAttribute]);\n\n const onUnderline = useCallback(() => {\n if (selectedNode?.type?.name === \"button\") {\n const newIsUnderline = !selectedNode.attrs.isUnderline;\n const result = updateButtonAttribute(\"isUnderline\", newIsUnderline);\n if (result) return true;\n }\n\n return editor.chain().focus().toggleMark(\"underline\").run();\n }, [editor, selectedNode, updateButtonAttribute]);\n\n const onAlignLeft = useCallback(\n () => editor.chain().focus().setTextAlign(\"left\").run(),\n [editor]\n );\n const onAlignCenter = useCallback(\n () => editor.chain().focus().setTextAlign(\"center\").run(),\n [editor]\n );\n const onAlignRight = useCallback(\n () => editor.chain().focus().setTextAlign(\"right\").run(),\n [editor]\n );\n const onAlignJustify = useCallback(\n () => editor.chain().focus().setTextAlign(\"justify\").run(),\n [editor]\n );\n\n const onLink = useCallback(\n (url: string, inNewTab?: boolean) =>\n editor\n .chain()\n .focus()\n .setLink({ href: url, target: inNewTab ? \"_blank\" : \"\" })\n .run(),\n [editor]\n );\n\n const onQuote = useCallback(() => {\n const isActive = editor.isActive(\"blockquote\");\n const chain = editor.chain().focus().toggleBlockquote();\n const success = chain.run();\n\n if (success) {\n const { selection } = editor.state;\n const $pos = selection.$anchor;\n\n if (!isActive) {\n // Converting to blockquote - find the parent blockquote node\n for (let depth = $pos.depth; depth > 0; depth--) {\n const node = $pos.node(depth);\n if (node.type.name === \"blockquote\") {\n setSelectedNode(node);\n break;\n }\n }\n } else {\n // Converting from blockquote - select the inner node (paragraph/heading)\n const currentNode = $pos.node();\n if (currentNode.type.name === \"paragraph\" || currentNode.type.name === \"heading\") {\n setSelectedNode(currentNode);\n }\n }\n }\n }, [editor, setSelectedNode]);\n\n return {\n onBold,\n onItalic,\n onStrike,\n onUnderline,\n onAlignLeft,\n onAlignCenter,\n onAlignRight,\n onAlignJustify,\n onLink,\n onQuote,\n resetButtonFormatting,\n };\n};\n", "import { SortableItemWrapper } from \"@/components/ui/SortableItemWrapper\";\nimport { cn } from \"@/lib\";\nimport { NodeViewContent, type NodeViewProps } from \"@tiptap/react\";\nimport { useSetAtom } from \"jotai\";\nimport React, { useCallback } from \"react\";\nimport { setSelectedNodeAtom } from \"../../ui/TextMenu/store\";\nimport type { BlockquoteProps } from \"./Blockquote.types\";\n\nexport const BlockquoteComponent: React.FC<BlockquoteProps> = ({\n paddingHorizontal,\n paddingVertical,\n backgroundColor,\n borderLeftWidth,\n borderColor,\n}) => (\n <div className=\"courier-w-full node-element\">\n <div\n style={{\n zIndex: -15,\n position: \"relative\",\n padding: `${paddingVertical}px ${paddingHorizontal}px`,\n backgroundColor,\n borderLeftWidth: `${borderLeftWidth}px`,\n borderColor,\n borderStyle: borderLeftWidth > 0 ? \"solid\" : \"none\",\n whiteSpace: \"pre-wrap\",\n }}\n >\n <NodeViewContent />\n </div>\n </div>\n);\n\nexport const BlockquoteComponentNode = (props: NodeViewProps) => {\n const setSelectedNode = useSetAtom(setSelectedNodeAtom);\n\n const handleSelect = useCallback(() => {\n if (!props.editor.isEditable) {\n return;\n }\n\n const pos = props.getPos();\n const node = props.editor.state.doc.nodeAt(pos);\n if (node) {\n setSelectedNode(node);\n }\n }, [props, setSelectedNode]);\n\n const isEmpty = !props.node.content || props.node.content.size === 0;\n\n return (\n <SortableItemWrapper\n id={props.node.attrs.id}\n className={cn(props.node.attrs.isSelected && \"selected-element\", isEmpty && \"is-empty\")}\n onClick={handleSelect}\n editor={props.editor}\n >\n <BlockquoteComponent {...(props.node.attrs as BlockquoteProps)} />\n </SortableItemWrapper>\n );\n};\n", "import {\n Divider,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormMessage,\n Input,\n InputColor,\n} from \"@/components/ui-kit\";\nimport {\n BorderWidthIcon,\n PaddingHorizontalIcon,\n PaddingVerticalIcon,\n} from \"@/components/ui-kit/Icon\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport type { Editor } from \"@tiptap/react\";\nimport { useForm } from \"react-hook-form\";\nimport type { z } from \"zod\";\nimport { useNodeAttributes } from \"../../hooks\";\nimport { FormHeader } from \"../../ui/FormHeader\";\nimport { defaultBlockquoteProps } from \"./Blockquote\";\nimport { blockquoteSchema } from \"./Blockquote.types\";\n\ninterface BlockquoteFormProps {\n element?: ProseMirrorNode;\n editor: Editor | null;\n}\n\nexport const BlockquoteForm = ({ element, editor }: BlockquoteFormProps) => {\n const form = useForm<z.infer<typeof blockquoteSchema>>({\n resolver: zodResolver(blockquoteSchema),\n defaultValues: {\n ...defaultBlockquoteProps,\n ...(element?.attrs as z.infer<typeof blockquoteSchema>),\n },\n });\n\n const { updateNodeAttributes } = useNodeAttributes({\n editor,\n element,\n form,\n nodeType: element?.type.name || \"blockquote\",\n });\n\n if (!element) {\n return null;\n }\n\n return (\n <Form {...form}>\n <FormHeader type=\"blockquote\" />\n <form\n onChange={() => {\n updateNodeAttributes(form.getValues());\n }}\n >\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Frame</h4>\n <div className=\"courier-flex courier-flex-row courier-gap-3 courier-mb-3\">\n <FormField\n control={form.control}\n name=\"paddingHorizontal\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input\n startAdornment={<PaddingHorizontalIcon />}\n type=\"number\"\n min={0}\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"paddingVertical\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input\n startAdornment={<PaddingVerticalIcon />}\n type=\"number\"\n min={0}\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n <FormField\n control={form.control}\n name=\"backgroundColor\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-3\">\n <FormControl>\n <InputColor\n {...field}\n defaultValue={defaultBlockquoteProps.backgroundColor}\n onChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n [field.name]: value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Divider className=\"courier-mb-4\" />\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Border</h4>\n <FormField\n control={form.control}\n name=\"borderLeftWidth\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-3\">\n <FormControl>\n <Input startAdornment={<BorderWidthIcon />} type=\"number\" min={0} {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"borderColor\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-3\">\n <FormControl>\n <InputColor\n {...field}\n defaultValue={defaultBlockquoteProps.borderColor}\n onChange={(value) => {\n field.onChange(value);\n updateNodeAttributes({\n ...form.getValues(),\n [field.name]: value,\n });\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </form>\n </Form>\n );\n};\n", "import { z } from \"zod\";\n\nexport const blockquoteSchema = z.object({\n paddingHorizontal: z.coerce.number().min(0),\n paddingVertical: z.coerce.number().min(0),\n backgroundColor: z.string(),\n borderLeftWidth: z.coerce.number().min(0),\n borderColor: z.string(),\n id: z.string().optional(),\n});\n\nexport type BlockquoteProps = z.infer<typeof blockquoteSchema>;\n", "import { BlockquoteForm } from \"@/components/extensions/Blockquote\";\nimport { ButtonForm } from \"@/components/extensions/Button\";\nimport { DividerForm } from \"@/components/extensions/Divider\";\nimport { ImageBlockForm } from \"@/components/extensions/ImageBlock\";\nimport { LinkForm } from \"@/components/extensions/Link\";\nimport { TextBlockForm } from \"@/components/extensions/TextBlock\";\nimport { pendingLinkAtom } from \"@/components/ui/TextMenu/store\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport type { Editor } from \"@tiptap/react\";\nimport { useAtomValue } from \"jotai\";\n\ninterface SideBarItemDetailsProps {\n element?: ProseMirrorNode;\n editor: Editor | null;\n}\n\nexport const SideBarItemDetails = ({ element, editor }: SideBarItemDetailsProps) => {\n const pendingLink = useAtomValue(pendingLinkAtom);\n if (!element) {\n return null;\n }\n\n // If there's a pending link or existing link mark, show the link form\n if (pendingLink?.link || pendingLink?.mark?.type.name === \"link\") {\n return <LinkForm editor={editor} mark={pendingLink?.mark} pendingLink={pendingLink?.link} />;\n }\n\n // Check if the current element is inside a blockquote\n const isInBlockquote = editor?.isActive(\"blockquote\");\n\n // Get the blockquote element if we're inside one\n const getBlockquoteElement = () => {\n if (!editor) return;\n const { $anchor } = editor.state.selection;\n let depth = $anchor.depth;\n while (depth > 0) {\n const node = $anchor.node(depth);\n if (node.type.name === \"blockquote\") {\n return node;\n }\n depth--;\n }\n };\n\n // Otherwise show the appropriate node form\n return (\n <div className=\"courier-flex courier-flex-col courier-gap-4\">\n {element.type.name === \"button\" && (\n <ButtonForm element={element} editor={editor} key={element.attrs.id} />\n )}\n {element.type.name === \"divider\" && (\n <DividerForm element={element} editor={editor} key={element.attrs.id} />\n )}\n {[\"paragraph\", \"heading\"].includes(element.type.name) && !isInBlockquote && (\n <TextBlockForm element={element} editor={editor} key={element.attrs.id} />\n )}\n {element.type.name === \"imageBlock\" && (\n <ImageBlockForm element={element} editor={editor} key={element.attrs.id} />\n )}\n {(element.type.name === \"blockquote\" ||\n (element.type.name === \"paragraph\" && isInBlockquote) ||\n (element.type.name === \"heading\" && isInBlockquote)) && (\n <BlockquoteForm\n element={getBlockquoteElement() || element}\n editor={editor}\n key={element.attrs.id}\n />\n )}\n </div>\n );\n};\n", "import type { Editor } from \"@tiptap/react\";\nimport { useAtomValue } from \"jotai\";\nimport {\n AlignCenter,\n AlignJustify,\n AlignLeft,\n AlignRight,\n Bold,\n Braces,\n Italic,\n Link,\n Quote,\n Strikethrough,\n Underline,\n} from \"lucide-react\";\nimport type { ReactElement } from \"react\";\nimport { Fragment, memo, useMemo, useRef } from \"react\";\nimport { Toolbar } from \"../Toolbar\";\nimport { ContentTypePicker } from \"./components/ContentTypePicker\";\nimport { useTextmenuCommands } from \"./hooks/useTextmenuCommands\";\nimport { useTextmenuContentTypes } from \"./hooks/useTextmenuContentTypes\";\nimport { useTextmenuStates } from \"./hooks/useTextmenuStates\";\nimport { getNodeConfigAtom, lastActiveInputRefAtom, selectedNodeAtom } from \"./store\";\n\n// We memorize the button so each button is not rerendered\n// on every editor state change\nconst MemoButton = memo(Toolbar.Button);\nconst MemoContentTypePicker = memo(ContentTypePicker);\n\nexport interface TextMenuProps {\n editor: Editor;\n}\n\nexport const TextMenu = ({ editor }: TextMenuProps) => {\n const commands = useTextmenuCommands(editor);\n const states = useTextmenuStates(editor);\n const blockOptions = useTextmenuContentTypes(editor);\n const toolbarRef = useRef<HTMLDivElement>(null);\n const lastActiveInput = useAtomValue(lastActiveInputRefAtom);\n const selectedNode = useAtomValue(selectedNodeAtom);\n const currentNodeName = selectedNode?.type.name;\n\n const getNodeConfig = useAtomValue(getNodeConfigAtom);\n const menuConfig = useMemo(\n () => getNodeConfig(currentNodeName || \"\"),\n [getNodeConfig, currentNodeName]\n );\n\n const handleLinkToggle = () => {\n const { selection } = editor.state;\n if (selection.empty && !states.isLink) {\n return;\n }\n\n if (states.isLink) {\n // If link is already active, show the form to edit it\n const tr = editor.state.tr.setMeta(\"showLinkForm\", {\n from: selection.from,\n to: selection.to,\n });\n editor.view.dispatch(tr);\n } else {\n // Create new link\n const tr = editor.state.tr.setMeta(\"showLinkForm\", {\n from: selection.from,\n to: selection.to,\n });\n editor.view.dispatch(tr);\n }\n };\n\n const handleVariableClick = () => {\n // Case 1: TextInput is focused\n if (lastActiveInput.ref) {\n const element = lastActiveInput.ref;\n const value = element.value;\n const caretPos = lastActiveInput.caretPosition || element.selectionStart || 0;\n\n // Insert {{ at last known caret position\n const beforeCursor = value.substring(0, caretPos);\n const afterCursor = value.substring(caretPos);\n const newValue = `${beforeCursor}{{${afterCursor}`;\n const newCaretPosition = caretPos + 2; // Move caret after {{\n\n // Focus first\n element.focus();\n\n // Create and dispatch a proper change event\n const changeEvent = new Event(\"input\", { bubbles: true, cancelable: true });\n Object.defineProperty(changeEvent, \"target\", {\n writable: false,\n value: { ...element, value: newValue },\n });\n\n // Update value and trigger change\n element.value = newValue;\n element.dispatchEvent(changeEvent);\n\n // Set caret position after change event\n element.setSelectionRange(newCaretPosition, newCaretPosition);\n\n // Calculate cursor position for suggestions popup\n const containerRect = element.getBoundingClientRect();\n if (containerRect) {\n const textBeforeCursor = newValue.slice(0, newCaretPosition);\n const tempSpan = document.createElement(\"span\");\n tempSpan.style.font = window.getComputedStyle(element).font;\n tempSpan.style.whiteSpace = \"pre-wrap\";\n tempSpan.textContent = textBeforeCursor;\n document.body.appendChild(tempSpan);\n\n const textWidth = tempSpan.offsetWidth;\n document.body.removeChild(tempSpan);\n\n const lineHeight = parseInt(window.getComputedStyle(element).lineHeight);\n const lines = textBeforeCursor.split(\"\\n\").length - 1;\n\n // Dispatch a custom event to show suggestions\n const showSuggestionsEvent = new CustomEvent(\"showVariableSuggestions\", {\n detail: {\n cursorPosition: {\n left: Math.min(textWidth % element.offsetWidth, element.offsetWidth - 200),\n top: lines * lineHeight + 30,\n },\n },\n bubbles: true,\n });\n element.dispatchEvent(showSuggestionsEvent);\n }\n return;\n }\n\n // Case 2: Editor's Paragraph/Heading is focused\n const { state, dispatch } = editor.view;\n const { tr } = state;\n tr.insertText(\"{{\");\n dispatch(tr);\n editor.commands.focus();\n\n // Trigger variable suggestions in the editor\n const tr2 = editor.state.tr.setMeta(\"showVariableSuggestions\", {\n from: editor.state.selection.from,\n to: editor.state.selection.to,\n });\n editor.view.dispatch(tr2);\n };\n\n const renderButton = (\n key: keyof typeof menuConfig,\n icon: JSX.Element,\n tooltip: string,\n onClick: () => void,\n active: boolean,\n shortcut?: string[],\n dataAttributes?: Record<string, unknown>\n ) => {\n const config = menuConfig[key];\n if (!config || config.state === \"hidden\") return null;\n\n return (\n <MemoButton\n key={key}\n tooltip={tooltip}\n tooltipShortcut={shortcut}\n onClick={onClick}\n active={active}\n disabled={config.state === \"disabled\"}\n {...dataAttributes}\n >\n {icon}\n </MemoButton>\n );\n };\n\n const renderGroup = (items: (ReactElement | null | false)[], groupKey: string) => {\n const visibleItems = items.filter((item): item is ReactElement => Boolean(item));\n return visibleItems.length > 0 ? (\n <div key={groupKey} className=\"courier-flex courier-items-center courier-gap-0.5\">\n {visibleItems}\n </div>\n ) : null;\n };\n\n const contentTypeGroup = renderGroup(\n [\n menuConfig.contentType?.state === \"enabled\" && (\n <MemoContentTypePicker\n key=\"content-type\"\n options={blockOptions}\n containerRef={toolbarRef}\n />\n ),\n ],\n \"content-type-group\"\n );\n\n const textStyleGroup = renderGroup(\n [\n renderButton(\n \"bold\",\n <Bold strokeWidth={1.25} className=\"courier-w-4 courier-h-4\" />,\n \"Bold\",\n commands.onBold,\n states.isBold,\n [\"Mod\", \"B\"]\n ),\n renderButton(\n \"italic\",\n <Italic strokeWidth={1.25} className=\"courier-w-4 courier-h-4\" />,\n \"Italic\",\n commands.onItalic,\n states.isItalic,\n [\"Mod\", \"I\"]\n ),\n renderButton(\n \"underline\",\n <Underline strokeWidth={1.25} className=\"courier-w-4 courier-h-4\" />,\n \"Underline\",\n commands.onUnderline,\n states.isUnderline,\n [\"Mod\", \"U\"]\n ),\n renderButton(\n \"strike\",\n <Strikethrough strokeWidth={1.25} className=\"courier-w-4 courier-h-4\" />,\n \"Strikethrough\",\n commands.onStrike,\n states.isStrike,\n [\"Mod\", \"Shift\", \"S\"]\n ),\n ],\n \"text-style-group\"\n );\n\n const alignmentGroup = renderGroup(\n [\n renderButton(\n \"alignLeft\",\n <AlignLeft strokeWidth={1.25} className=\"courier-w-4 courier-h-4\" />,\n \"Align left\",\n commands.onAlignLeft,\n states.isAlignLeft,\n [\"Shift\", \"Mod\", \"L\"]\n ),\n renderButton(\n \"alignCenter\",\n <AlignCenter strokeWidth={1.25} className=\"courier-w-4 courier-h-4\" />,\n \"Align center\",\n commands.onAlignCenter,\n states.isAlignCenter,\n [\"Shift\", \"Mod\", \"E\"]\n ),\n renderButton(\n \"alignRight\",\n <AlignRight strokeWidth={1.25} className=\"courier-w-4 courier-h-4\" />,\n \"Align right\",\n commands.onAlignRight,\n states.isAlignRight,\n [\"Shift\", \"Mod\", \"R\"]\n ),\n renderButton(\n \"alignJustify\",\n <AlignJustify strokeWidth={1.25} className=\"courier-w-4 courier-h-4\" />,\n \"Justify\",\n commands.onAlignJustify,\n states.isAlignJustify,\n [\"Shift\", \"Mod\", \"J\"]\n ),\n ],\n \"alignment-group\"\n );\n\n const blockStyleGroup = renderGroup(\n [\n renderButton(\n \"quote\",\n <Quote strokeWidth={1.25} className=\"courier-w-4 courier-h-4\" />,\n \"Quote\",\n commands.onQuote,\n states.isQuote,\n [\"Mod\", \"Shift\", \"B\"]\n ),\n ],\n \"block-style-group\"\n );\n\n const insertGroup = renderGroup(\n [\n renderButton(\n \"link\",\n <Link strokeWidth={1.25} className=\"courier-w-4 courier-h-4\" />,\n \"Link\",\n handleLinkToggle,\n states.isLink,\n [\"Mod\", \"K\"]\n ),\n renderButton(\n \"variable\",\n <Braces strokeWidth={1.25} className=\"courier-w-4 courier-h-4\" />,\n \"Variable\",\n handleVariableClick,\n false,\n [\"Mod\", \"V\"],\n { \"data-variable-button\": \"true\" }\n ),\n ],\n \"insert-group\"\n );\n\n return (\n <div className=\"courier-z-30 courier-w-full courier-h-12 courier-sticky courier-top-0 courier-left-0 courier-right-0 courier-bottom-0\">\n <Toolbar.Wrapper\n ref={toolbarRef}\n className=\"courier-w-full courier-border-t-0 courier-border-l-0 courier-border-r-0 courier-border-b rounded-b-none rounded-t-sm courier-shadow-none courier-justify-center courier-rounded-none\"\n >\n {[contentTypeGroup, textStyleGroup, alignmentGroup, blockStyleGroup, insertGroup]\n .filter(Boolean)\n .map((item, index) => (\n <Fragment key={`item-${index}`}>\n {item}\n {index <\n [\n contentTypeGroup,\n textStyleGroup,\n alignmentGroup,\n blockStyleGroup,\n insertGroup,\n ].filter(Boolean).length -\n 1 && <Toolbar.Divider />}\n </Fragment>\n ))}\n </Toolbar.Wrapper>\n </div>\n );\n};\n", "import { Button, type ButtonProps } from \"@/components/ui-kit/Button\";\nimport { cn } from \"@/lib\";\nimport type { ButtonHTMLAttributes, HTMLProps } from \"react\";\nimport { forwardRef } from \"react\";\nimport { Surface } from \"./Surface\";\nimport { Tooltip } from \"./Tooltip\";\n\nexport type ToolbarWrapperProps = {\n shouldShowContent?: boolean;\n isVertical?: boolean;\n} & HTMLProps<HTMLDivElement>;\n\nconst ToolbarWrapper = forwardRef<HTMLDivElement, ToolbarWrapperProps>(\n ({ shouldShowContent = true, children, isVertical = false, className, ...rest }, ref) => {\n const toolbarClassName = cn(\n \"courier-text-foreground courier-inline-flex courier-h-full courier-leading-none courier-gap-0.5\",\n isVertical\n ? \"courier-flex-col courier-p-2\"\n : \"courier-flex-row courier-p-1 courier-items-center\",\n className\n );\n\n return (\n shouldShowContent && (\n <Surface className={toolbarClassName} {...rest} ref={ref}>\n {children}\n </Surface>\n )\n );\n }\n);\n\nToolbarWrapper.displayName = \"Toolbar\";\n\nexport type ToolbarDividerProps = {\n horizontal?: boolean;\n} & HTMLProps<HTMLDivElement>;\n\nconst ToolbarDivider = forwardRef<HTMLDivElement, ToolbarDividerProps>(\n ({ horizontal, className, ...rest }, ref) => {\n const dividerClassName = cn(\n \"courier-bg-neutral-200 dark:courier-bg-neutral-800\",\n horizontal\n ? \"courier-w-full courier-min-w-[1.5rem] courier-h-[1px] courier-my-1 first:courier-mt-0 last:courier-mt-0\"\n : \"courier-h-full courier-min-h-[1.5rem] courier-w-[1px] courier-mx-1 first:courier-ml-0 last:courier-mr-0\",\n className\n );\n\n return <div className={dividerClassName} ref={ref} {...rest} />;\n }\n);\n\nToolbarDivider.displayName = \"Toolbar.Divider\";\n\nexport type ToolbarButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n active?: boolean;\n tooltip?: string;\n tooltipShortcut?: string[];\n buttonSize?: ButtonProps[\"buttonSize\"];\n variant?: ButtonProps[\"variant\"];\n};\n\nconst ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n (\n {\n children,\n buttonSize = \"icon\",\n variant = \"ghost\",\n className,\n tooltip,\n tooltipShortcut,\n ...rest\n },\n ref\n ) => {\n const buttonClass = cn(\"courier-gap-1 courier-min-w-[2rem] courier-w-auto\", className);\n\n const content = (\n <Button className={buttonClass} variant={variant} buttonSize={buttonSize} ref={ref} {...rest}>\n {children}\n </Button>\n );\n\n if (tooltip) {\n return (\n <Tooltip title={tooltip} shortcut={tooltipShortcut}>\n {content}\n </Tooltip>\n );\n }\n\n return content;\n }\n);\n\nToolbarButton.displayName = \"ToolbarButton\";\n\nexport const Toolbar = {\n Wrapper: ToolbarWrapper,\n Divider: ToolbarDivider,\n Button: ToolbarButton,\n};\n", "import Tippy from \"@tippyjs/react\";\nimport { useCallback } from \"react\";\nimport type { TippyProps, TooltipProps } from \"./types\";\n\nconst isMac =\n typeof window !== \"undefined\" ? navigator.platform.toUpperCase().indexOf(\"MAC\") >= 0 : false;\n\nconst ShortcutKey = ({ children }: { children: string }): JSX.Element => {\n const className =\n \"courier-inline-flex courier-items-center courier-justify-center courier-w-5 courier-h-5 courier-p-1 courier-text-[0.625rem] courier-rounded courier-font-semibold courier-leading-none courier-border courier-border-border courier-text-neutral-500 courier-border-b-2\";\n\n if (children === \"Mod\") {\n return <kbd className={className}>{isMac ? \"\u2318\" : \"Ctrl\"}</kbd>; // \u2303\n }\n\n if (children === \"Shift\") {\n return <kbd className={className}>\u21E7</kbd>;\n }\n\n if (children === \"Alt\") {\n return <kbd className={className}>{isMac ? \"\u2325\" : \"Alt\"}</kbd>;\n }\n\n return <kbd className={className}>{children}</kbd>;\n};\n\nexport const Tooltip = ({\n children,\n enabled = true,\n title,\n shortcut,\n tippyOptions = {},\n}: TooltipProps): JSX.Element => {\n const renderTooltip = useCallback(\n (attrs: TippyProps) => (\n <span\n className=\"courier-flex courier-items-center courier-gap-2 courier-px-2.5 courier-py-1 courier-bg-white courier-border courier-border-neutral-100 courier-rounded-lg courier-shadow-sm courier-z-[999]\"\n tabIndex={-1}\n data-placement={attrs[\"data-placement\"]}\n data-reference-hidden={attrs[\"data-reference-hidden\"]}\n data-escaped={attrs[\"data-escaped\"]}\n >\n {title && (\n <span className=\"courier-text-xs courier-font-medium courier-text-neutral-500\">\n {title}\n </span>\n )}\n {shortcut && (\n <span className=\"courier-flex courier-items-center courier-gap-0.5\">\n {shortcut.map((shortcutKey) => (\n <ShortcutKey key={shortcutKey}>{shortcutKey}</ShortcutKey>\n ))}\n </span>\n )}\n </span>\n ),\n [shortcut, title]\n );\n\n if (enabled) {\n return (\n <Tippy\n delay={500}\n offset={[0, 8]}\n touch={false}\n zIndex={99999}\n appendTo={document.body}\n {...tippyOptions}\n render={renderTooltip}\n >\n <span>{children}</span>\n </Tippy>\n );\n }\n\n return <>{children}</>;\n};\n\nexport default Tooltip;\n", "import { Button } from \"@/components/ui-kit\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui-kit/DropdownMenu\";\nimport { ChevronDown } from \"lucide-react\";\nimport type { RefObject } from \"react\";\nimport { useMemo } from \"react\";\n\nexport interface ContentTypePickerOption {\n label: string;\n id: string;\n type: \"option\";\n disabled: () => boolean;\n isActive: () => boolean;\n onClick: () => void;\n icon?: keyof typeof ChevronDown;\n}\n\nexport interface ContentTypePickerCategory {\n label: string;\n id: string;\n type: \"category\";\n}\n\nexport type ContentPickerOptions = Array<ContentTypePickerOption | ContentTypePickerCategory>;\n\nexport interface ContentTypePickerProps {\n options: ContentPickerOptions;\n containerRef?: RefObject<HTMLDivElement>;\n}\n\nconst isOption = (\n option: ContentTypePickerOption | ContentTypePickerCategory\n): option is ContentTypePickerOption => option.type === \"option\";\n\nexport const ContentTypePicker = ({ options, containerRef }: ContentTypePickerProps) => {\n const activeItem = useMemo(\n () => options.find((option) => option.type === \"option\" && option.isActive()),\n [options]\n );\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n className=\"courier-flex courier-items-center courier-justify-center courier-font-normal\"\n >\n {activeItem?.label || \"Normal text\"}\n <ChevronDown className=\"courier-w-3 courier-h-3\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent portalProps={{ container: containerRef?.current || undefined }}>\n {options.map((option) => {\n if (isOption(option)) {\n return (\n <DropdownMenuItem\n key={option.id}\n onClick={option.onClick}\n className={option.isActive() ? \"courier-bg-accent courier-text-foreground\" : \"\"}\n >\n {option.id.startsWith(\"heading\") ? (\n <>\n {option.id === \"heading1\" ? (\n <h1 className=\"courier-text-2xl courier-font-bold\">{option.label}</h1>\n ) : option.id === \"heading2\" ? (\n <h2 className=\"courier-text-xl courier-font-bold\">{option.label}</h2>\n ) : option.id === \"heading3\" ? (\n <h3 className=\"courier-text-lg courier-font-bold\">{option.label}</h3>\n ) : (\n option.label\n )}\n </>\n ) : (\n option.label\n )}\n </DropdownMenuItem>\n );\n }\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n};\n", "import type { Editor } from \"@tiptap/react\";\nimport { useEditorState } from \"@tiptap/react\";\nimport type { ContentPickerOptions } from \"../components/ContentTypePicker\";\n\nexport const useTextmenuContentTypes = (editor: Editor) => {\n return useEditorState({\n editor,\n selector: (ctx): ContentPickerOptions => [\n {\n label: \"Normal text\",\n onClick: () => {\n ctx.editor.chain().focus().setNode(\"paragraph\").run();\n },\n id: \"paragraph\",\n disabled: () => !ctx.editor.can().setParagraph(),\n isActive: () => ctx.editor.isActive(\"paragraph\") && !ctx.editor.isActive(\"heading\"),\n type: \"option\",\n },\n {\n label: \"Heading 1\",\n onClick: () => {\n ctx.editor.chain().focus().setNode(\"heading\", { level: 1 }).run();\n },\n id: \"heading1\",\n disabled: () => !ctx.editor.can().setHeading({ level: 1 }),\n isActive: () => ctx.editor.isActive(\"heading\", { level: 1 }),\n type: \"option\",\n },\n {\n label: \"Heading 2\",\n onClick: () => {\n ctx.editor.chain().focus().setNode(\"heading\", { level: 2 }).run();\n },\n id: \"heading2\",\n disabled: () => !ctx.editor.can().setHeading({ level: 2 }),\n isActive: () => ctx.editor.isActive(\"heading\", { level: 2 }),\n type: \"option\",\n },\n {\n label: \"Heading 3\",\n onClick: () => {\n ctx.editor.chain().focus().setNode(\"heading\", { level: 3 }).run();\n },\n id: \"heading3\",\n disabled: () => !ctx.editor.can().setHeading({ level: 3 }),\n isActive: () => ctx.editor.isActive(\"heading\", { level: 3 }),\n type: \"option\",\n },\n ],\n });\n};\n", "import type { Editor } from \"@tiptap/react\";\nimport type { EditorView } from \"@tiptap/pm/view\";\nimport { useAtomValue } from \"jotai\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { isCustomNodeSelected, isTextSelected } from \"../../../utils\";\nimport { selectedNodeAtom } from \"../store\";\n\nexport const useTextmenuStates = (editor: Editor) => {\n const selectedNode = useAtomValue(selectedNodeAtom);\n const [states, setStates] = useState({\n isBold: false,\n isItalic: false,\n isUnderline: false,\n isStrike: false,\n isAlignLeft: false,\n isAlignCenter: false,\n isAlignRight: false,\n isAlignJustify: false,\n isQuote: false,\n isLink: false,\n });\n\n const updateStates = useCallback(() => {\n if (!editor) return;\n\n if (selectedNode?.type.name === \"button\") {\n setStates({\n isBold: selectedNode.attrs.fontWeight === \"bold\",\n isItalic: selectedNode.attrs.fontStyle === \"italic\",\n isUnderline: selectedNode.attrs.isUnderline,\n isStrike: selectedNode.attrs.isStrike,\n isAlignLeft: false,\n isAlignCenter: false,\n isAlignRight: false,\n isAlignJustify: false,\n isQuote: false,\n isLink: false,\n });\n return;\n }\n\n setStates({\n isBold: editor.isActive(\"bold\"),\n isItalic: editor.isActive(\"italic\"),\n isUnderline: editor.isActive(\"underline\"),\n isStrike: editor.isActive(\"strike\"),\n isAlignLeft: editor.isActive({ textAlign: \"left\" }),\n isAlignCenter: editor.isActive({ textAlign: \"center\" }),\n isAlignRight: editor.isActive({ textAlign: \"right\" }),\n isAlignJustify: editor.isActive({ textAlign: \"justify\" }),\n isQuote: editor.isActive(\"blockquote\"),\n isLink: editor.isActive(\"link\"),\n });\n }, [editor, selectedNode]);\n\n useEffect(() => {\n if (!editor) return;\n\n updateStates();\n\n editor.on(\"selectionUpdate\", updateStates);\n editor.on(\"transaction\", updateStates);\n\n return () => {\n editor.off(\"selectionUpdate\", updateStates);\n editor.off(\"transaction\", updateStates);\n };\n }, [editor, updateStates]);\n\n const shouldShow = useCallback(\n ({ view, from }: { view: EditorView; from: number }) => {\n if (!view || editor.view.dragging) {\n return false;\n }\n\n const domAtPos = view.domAtPos(from || 0).node as HTMLElement;\n const nodeDOM = view.nodeDOM(from || 0) as HTMLElement;\n const node = nodeDOM || domAtPos;\n\n if (isCustomNodeSelected(editor, node)) {\n return false;\n }\n\n return isTextSelected({ editor });\n },\n [editor]\n );\n\n return {\n shouldShow,\n ...states,\n };\n};\n", "import { useBrandActions } from \"@/components/Providers\";\nimport {\n isTenantLoadingAtom,\n isTenantPublishingAtom,\n isTenantSavingAtom,\n tenantDataAtom,\n tenantErrorAtom,\n tenantIdAtom,\n} from \"@/components/Providers/store\";\nimport { SideBarItemDetails } from \"@/components/TemplateEditor/Editor/SideBar/SideBarItemDetails\";\nimport { Button } from \"@/components/ui-kit/Button\";\nimport { TextMenu } from \"@/components/ui/TextMenu\";\nimport { selectedNodeAtom } from \"@/components/ui/TextMenu/store\";\nimport { useAutoSave } from \"@/hooks/useAutoSave\";\nimport { cn } from \"@/lib/utils\";\nimport type { Editor as TiptapEditor } from \"@tiptap/react\";\nimport { useAtom, useAtomValue, useSetAtom } from \"jotai\";\nimport { forwardRef, memo, useCallback, useEffect, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { pageAtom } from \"../../../store\";\nimport { Header } from \"../../ui/Header\";\nimport { Status } from \"../../ui/Status\";\nimport { type BrandEditorFormValues, defaultBrandEditorFormValues } from \"../BrandEditor.types\";\nimport { BrandEditorContentAtom, BrandEditorFormAtom } from \"../store\";\nimport { BrandFooter } from \"./BrandFooter\";\nimport { LogoUploader } from \"./LogoUploader\";\nimport { SideBar } from \"./SideBar\";\n\ninterface BrandSettings {\n colors?: {\n primary?: string;\n secondary?: string;\n tertiary?: string;\n };\n email?: {\n header?: {\n barColor?: string;\n logo?: {\n href?: string;\n image?: string;\n };\n };\n footer?: {\n markdown?: string;\n social?: {\n facebook?: { url?: string };\n instagram?: { url?: string };\n linkedin?: { url?: string };\n medium?: { url?: string };\n twitter?: { url?: string };\n };\n };\n };\n}\n\nexport interface EditorProps {\n hidePublish?: boolean;\n autoSaveDebounce?: number;\n autoSave?: boolean;\n templateEditor?: boolean;\n isVisible?: boolean;\n variables?: Record<string, unknown>;\n value?: BrandSettings;\n onChange?: (value: BrandSettings) => void;\n}\n\nconst EditorComponent = forwardRef<HTMLDivElement, EditorProps>(\n (\n {\n hidePublish = false,\n autoSaveDebounce = 200,\n autoSave,\n templateEditor,\n isVisible = true,\n variables,\n onChange,\n },\n ref\n ) => {\n const [brandValue, setBrandValue] = useState<BrandSettings | undefined>();\n const setPage = useSetAtom(pageAtom);\n const { saveBrand, publishBrand } = useBrandActions();\n const tenantData = useAtomValue(tenantDataAtom);\n const [form, setForm] = useState<BrandEditorFormValues>(\n tenantData?.data?.tenant?.brand?.settings as BrandEditorFormValues\n );\n const isTenantPublishing = useAtomValue(isTenantPublishingAtom);\n const isTenantSaving = useAtomValue(isTenantSavingAtom);\n const isTenantLoading = useAtomValue(isTenantLoadingAtom);\n const tenantId = useAtomValue(tenantIdAtom);\n const tenantError = useAtomValue(tenantErrorAtom);\n const [editor, setEditor] = useState<TiptapEditor | null>(null);\n const [footerContent, setFooterContent] = useState<string | undefined>(undefined);\n const previousSettingsRef = useRef<string>(\"\");\n const [selectedNode, setSelectedNode] = useAtom(selectedNodeAtom);\n const setBrandEditorForm = useSetAtom(BrandEditorFormAtom);\n const [brandEditorContent, setBrandEditorContent] = useAtom(BrandEditorContentAtom);\n const isResponseSetRef = useRef(false);\n\n const { handleAutoSave } = useAutoSave({\n onSave: async (data: BrandSettings) => {\n await saveBrand(data as BrandEditorFormValues);\n },\n enabled: isTenantLoading !== null && autoSave && brandEditorContent !== null,\n debounceMs: autoSaveDebounce,\n onError: () => toast.error(\"Error saving theme\"),\n });\n\n useEffect(() => {\n if (tenantData === null) {\n isResponseSetRef.current = false;\n setFooterContent(undefined);\n setBrandEditorForm(null);\n setBrandValue(undefined);\n }\n }, [tenantData, setBrandEditorContent, setBrandEditorForm, setBrandValue]);\n\n useEffect(() => {\n const brandSettings: BrandSettings = {\n colors: {\n primary: form?.brandColor,\n secondary: form?.textColor,\n tertiary: form?.subtleColor,\n },\n email: {\n header: {\n barColor: form?.headerStyle === \"border\" ? form?.brandColor : \"\",\n logo: { href: form?.link, image: form?.logo },\n },\n footer: {\n markdown: brandEditorContent ?? undefined,\n social: {\n facebook: { url: form?.facebookLink },\n instagram: { url: form?.instagramLink },\n linkedin: { url: form?.linkedinLink },\n medium: { url: form?.mediumLink },\n twitter: { url: form?.xLink },\n },\n },\n },\n };\n\n if (brandValue === undefined && brandEditorContent) {\n setBrandValue(brandSettings);\n }\n\n if (!brandEditorContent || !isResponseSetRef.current) {\n return;\n }\n\n setTimeout(() => {\n setFooterContent(brandEditorContent);\n }, 0);\n\n if (JSON.stringify(brandValue) === JSON.stringify(brandSettings)) {\n return;\n }\n\n setBrandValue(brandSettings);\n\n if (onChange) {\n onChange(brandSettings);\n }\n\n if (brandSettings !== null) {\n handleAutoSave(brandSettings);\n }\n }, [footerContent, brandEditorContent, form, handleAutoSave, onChange, brandValue]);\n\n const handlePublish = useCallback(() => {\n publishBrand();\n }, [publishBrand]);\n\n useEffect(() => {\n const brandSettings = tenantData?.data?.tenant?.brand?.settings;\n if (brandSettings && tenantData?.data?.tenant?.tenantId === tenantId) {\n const brandSettingsString = JSON.stringify(brandSettings);\n previousSettingsRef.current = brandSettingsString;\n\n const paragraphs = brandSettings?.email?.footer?.markdown?.split(\"\\n\");\n const findPrefencesUrl = paragraphs?.find((paragraph) =>\n paragraph.includes(\"{{urls.preferences}}\")\n );\n\n const formValues: BrandEditorFormValues = {\n brandColor: brandSettings.colors?.primary || defaultBrandEditorFormValues.brandColor,\n textColor: brandSettings.colors?.secondary || defaultBrandEditorFormValues.textColor,\n subtleColor: brandSettings.colors?.tertiary || defaultBrandEditorFormValues.subtleColor,\n headerStyle: brandSettings.email?.header?.barColor ? \"border\" : \"plain\",\n logo: brandSettings.email?.header?.logo?.image || defaultBrandEditorFormValues.logo,\n link: brandSettings.email?.header?.logo?.href || defaultBrandEditorFormValues.link,\n facebookLink:\n brandSettings.email?.footer?.social?.facebook?.url ||\n defaultBrandEditorFormValues.facebookLink,\n linkedinLink:\n brandSettings.email?.footer?.social?.linkedin?.url ||\n defaultBrandEditorFormValues.linkedinLink,\n instagramLink:\n brandSettings.email?.footer?.social?.instagram?.url ||\n defaultBrandEditorFormValues.instagramLink,\n mediumLink:\n brandSettings.email?.footer?.social?.medium?.url ||\n defaultBrandEditorFormValues.mediumLink,\n xLink:\n brandSettings.email?.footer?.social?.twitter?.url || defaultBrandEditorFormValues.xLink,\n isPreferences: Boolean(findPrefencesUrl),\n };\n\n setForm(formValues);\n\n setTimeout(() => {\n isResponseSetRef.current = true;\n }, 100);\n }\n }, [tenantData, tenantId, editor]);\n\n useEffect(() => {\n setBrandEditorForm(form);\n }, [form, setBrandEditorForm]);\n\n const handleLogoSelect = useCallback((dataUrl: string) => {\n setForm((prevForm) => ({\n ...prevForm,\n logo: dataUrl,\n }));\n }, []);\n\n const handleBack = useCallback(() => {\n setPage(\"template\");\n setSelectedNode(null);\n }, [setPage, setSelectedNode]);\n\n return (\n <>\n <div\n className={cn(\"courier-z-30 courier-w-full courier-h-12\", !isVisible && \"courier-hidden\")}\n >\n <Header>\n <div className=\"courier-text-sm courier-font-medium\">Brand theme</div>\n <div className=\"courier-flex courier-gap-2 courier-items-center\">\n {isTenantSaving !== null && (\n <Status\n isLoading={Boolean(isTenantLoading)}\n isSaving={Boolean(isTenantSaving)}\n isError={Boolean(tenantError)}\n />\n )}\n {templateEditor && (\n <Button\n variant=\"outline\"\n buttonSize=\"small\"\n onClick={handleBack}\n disabled={isTenantPublishing === true || isTenantSaving === true}\n >\n Back\n </Button>\n )}\n {!hidePublish && isTenantLoading !== null && (\n <Button\n variant=\"primary\"\n buttonSize=\"small\"\n disabled={\n !tenantData?.data?.tenant?.brand ||\n isTenantPublishing === true ||\n isTenantSaving !== false\n }\n onClick={handlePublish}\n >\n {isTenantPublishing ? \"Publishing...\" : \"Publish changes\"}\n </Button>\n )}\n </div>\n </Header>\n </div>\n\n <div\n className={cn(\n \"courier-flex courier-flex-1 courier-flex-row courier-overflow-hidden\",\n !isVisible && \"courier-hidden\"\n )}\n >\n <div className=\"courier-flex courier-flex-col courier-flex-1\">\n {!isTenantLoading && isVisible && editor && <TextMenu editor={editor} />}\n <div className=\"courier-editor-container\" ref={ref}>\n <div className=\"courier-mb-3 courier-max-w-2xl courier-self-center courier-w-full\">\n Header\n </div>\n <div\n className={cn(\n \"courier-editor-main courier-transition-all courier-duration-300 courier-ease-in-out courier-py-5 courier-px-9 courier-mb-8 courier-relative courier-overflow-hidden courier-flex courier-flex-col courier-items-start\",\n form?.headerStyle === \"border\" && \"courier-pt-6\"\n )}\n >\n {form?.headerStyle === \"border\" && (\n <div\n className=\"courier-absolute courier-top-0 courier-left-0 courier-right-0 courier-h-2\"\n style={{ backgroundColor: form.brandColor }}\n />\n )}\n {form?.logo ? (\n <img\n src={form.logo}\n alt=\"Brand logo\"\n className=\"courier-w-auto courier-max-w-36 courier-object-contain courier-cursor-default\"\n />\n ) : (\n <LogoUploader onFileSelect={handleLogoSelect} />\n )}\n </div>\n <div className=\"courier-mb-3 courier-max-w-2xl courier-self-center courier-w-full\">\n Footer\n </div>\n <div className=\"courier-theme-editor-main courier-transition-all courier-duration-300 courier-ease-in-out courier-pt-3 courier-pb-5 courier-px-9\">\n <BrandFooter\n variables={variables}\n setEditor={setEditor}\n facebookLink={form?.facebookLink}\n linkedinLink={form?.linkedinLink}\n instagramLink={form?.instagramLink}\n mediumLink={form?.mediumLink}\n xLink={form?.xLink}\n />\n </div>\n </div>\n </div>\n <div className=\"courier-editor-sidebar courier-opacity-100 courier-translate-x-0 courier-w-64 courier-flex-shrink-0\">\n <div className=\"courier-p-4 courier-h-full\">\n {editor && !selectedNode && (\n <SideBar editor={editor} setForm={setForm} currentForm={form} />\n )}\n {editor && selectedNode && (\n <SideBarItemDetails element={selectedNode} editor={editor} />\n )}\n </div>\n </div>\n </div>\n </>\n );\n }\n);\n\nexport const Editor = memo(EditorComponent);\n", "import { forwardRef } from \"react\";\n\ninterface HeaderProps {\n children: React.ReactNode;\n}\n\nexport const Header = forwardRef<HTMLDivElement, HeaderProps>(({ children }, ref) => {\n return (\n <div\n ref={ref}\n className=\"courier-z-30 courier-flex courier-w-full courier-bg-primary courier-h-12 courier-border-t-0 courier-border-l-0 courier-border-r-0 courier-border-b rounded-b-none rounded-t-sm courier-shadow-none courier-justify-between courier-items-center courier-px-4\"\n >\n {children}\n </div>\n );\n});\n", "import { CircleCheck } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { Loader } from \"../Loader\";\n\ninterface StatusProps {\n isError?: boolean;\n isSaving?: boolean;\n isLoading?: boolean;\n}\n\nexport const Status = ({ isError, isSaving, isLoading }: StatusProps) => {\n const [showSaved, setShowSaved] = useState(false);\n\n useEffect(() => {\n if (!isSaving && !isError) {\n setShowSaved(true);\n const timer = setTimeout(() => {\n setShowSaved(false);\n }, 5000);\n\n return () => clearTimeout(timer);\n }\n }, [isSaving, isError]);\n\n if (!showSaved && !isSaving && !isError) {\n return null;\n }\n\n if (isLoading || isSaving === null) {\n return null;\n }\n\n const saving = isSaving ? (\n <>\n <Loader className=\"courier-w-4 courier-h-4\" />\n Saving...\n </>\n ) : (\n <>\n <CircleCheck strokeWidth={1.25} className=\"courier-w-4 courier-h-4\" />\n Saved\n </>\n );\n\n return (\n <div className=\"courier-h-12 courier-flex courier-items-center courier-px-4 courier-text-xs courier-gap-1\">\n {isError ? \"Error\" : saving}\n </div>\n );\n};\n", "import { z } from \"zod\";\n\nexport const brandEditorSchema = z.object({\n headerStyle: z.enum([\"plain\", \"border\"]),\n isUnsubscribe: z.boolean().optional(),\n isPreferences: z.boolean().optional(),\n // alt: z.string().optional(),\n link: z.string().optional(),\n brandColor: z.string(),\n textColor: z.string(),\n subtleColor: z.string(),\n logo: z.string().optional(),\n facebookLink: z.string().optional(),\n linkedinLink: z.string().optional(),\n instagramLink: z.string().optional(),\n mediumLink: z.string().optional(),\n xLink: z.string().optional(),\n});\n\nexport type BrandEditorFormValues = z.infer<typeof brandEditorSchema>;\n\nexport const defaultBrandEditorFormValues: BrandEditorFormValues = {\n headerStyle: \"plain\",\n isUnsubscribe: false,\n isPreferences: false,\n link: \"\",\n // alt: \"\",\n brandColor: \"#000000\",\n textColor: \"#9CA3AF\",\n subtleColor: \"#737373\",\n logo: \"\",\n facebookLink: \"\",\n linkedinLink: \"\",\n instagramLink: \"\",\n mediumLink: \"\",\n xLink: \"\",\n};\n", "import type { BrandEditorFormValues } from \"./BrandEditor.types\";\nimport { atom } from \"jotai\";\n\nexport const BrandEditorContentAtom = atom<string | null>(null);\nexport const BrandEditorFormAtom = atom<BrandEditorFormValues | null>(null);\n", "import { BrandEditorContentAtom } from \"@/components/BrandEditor/store\";\nimport {\n FacebookIcon,\n InstagramIcon,\n LinkedinIcon,\n MediumIcon,\n XIcon,\n} from \"@/components/ui-kit/Icon\";\n// import type { TiptapDoc } from \"@/lib/utils\";\n// import { cn, convertElementalToTiptap, convertTiptapToElemental } from \"@/lib/utils\";\nimport { cn, convertMarkdownToTiptap } from \"@/lib/utils\";\nimport type { Editor as TiptapEditor } from \"@tiptap/react\";\nimport { EditorContent } from \"@tiptap/react\";\nimport { useAtom, useAtomValue } from \"jotai\";\nimport { memo, useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { Doc as YDoc } from \"yjs\";\nimport { useBlockEditor } from \"../useBlockEditor\";\nimport { isTenantLoadingAtom, tenantDataAtom } from \"@/components/Providers/store\";\n// import { convertTiptapToMarkdown } from \"@/lib/utils/convertTiptapToMarkdown/convertTiptapToMarkdown\";\n\ninterface BrandFooterProps {\n variables?: Record<string, unknown>;\n setEditor?: (editor: TiptapEditor | null) => void;\n readOnly?: boolean;\n facebookLink?: string;\n linkedinLink?: string;\n instagramLink?: string;\n mediumLink?: string;\n xLink?: string;\n}\n\nconst BrandFooterComponent = ({\n variables,\n facebookLink,\n linkedinLink,\n instagramLink,\n mediumLink,\n xLink,\n readOnly = false,\n setEditor,\n}: BrandFooterProps) => {\n const ydoc = useMemo(() => new YDoc(), []);\n const isMountedRef = useRef(false);\n const [brandEditorContent, setBrandEditorContent] = useAtom(BrandEditorContentAtom);\n const tenantData = useAtomValue(tenantDataAtom);\n const isTenantLoading = useAtomValue(isTenantLoadingAtom);\n const isResponseSetRef = useRef(false);\n\n const extendedVariables = useMemo(() => {\n return {\n urls: {\n unsubscribe: true,\n preferences: true,\n },\n ...variables,\n };\n }, [variables]);\n\n const setSelectedNodeHandler = useCallback(() => {}, []);\n\n const { editor } = useBlockEditor({\n initialContent: useMemo(\n () => ({\n version: \"2022-01-01\",\n elements: [\n {\n type: \"text\",\n align: \"left\",\n content: \"\",\n },\n ],\n }),\n []\n ), // eslint-disable-line react-hooks/exhaustive-deps\n ydoc,\n variables: extendedVariables,\n readOnly,\n setSelectedNode: setSelectedNodeHandler,\n });\n\n useEffect(() => {\n if (readOnly && brandEditorContent) {\n setTimeout(() => {\n editor.commands.setContent(convertMarkdownToTiptap(brandEditorContent));\n editor.chain().focus().setTextSelection(0).run();\n }, 0);\n }\n }, [readOnly, brandEditorContent, editor]);\n\n useEffect(() => {\n const markdown = tenantData?.data?.tenant?.brand?.settings?.email?.footer?.markdown;\n\n if (isTenantLoading === false && !markdown) {\n isResponseSetRef.current = true;\n }\n\n if (!markdown || !editor) {\n return;\n }\n\n setTimeout(() => {\n editor.commands.setContent(convertMarkdownToTiptap(markdown));\n editor.chain().focus().setTextSelection(0).run();\n setBrandEditorContent(markdown);\n }, 0);\n\n setTimeout(() => {\n isResponseSetRef.current = true;\n }, 100);\n }, [tenantData, isTenantLoading, editor, setBrandEditorContent]);\n\n // Track component mount status\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n // Set editor reference for parent component\n useEffect(() => {\n if (editor && setEditor && isMountedRef.current) {\n setEditor(editor);\n }\n }, [editor, setEditor]);\n\n return (\n <div className=\"courier-flex courier-flex-row courier-gap-6 courier-justify-between courier-items-start\">\n {/* <button onClick={handleTest}>test</button> */}\n <EditorContent\n editor={editor}\n className={cn(\n \"courier-py-2 courier-flex-grow\",\n readOnly && \"courier-brand-editor-readonly\"\n )}\n />\n <div className=\"courier-flex courier-justify-end courier-items-center courier-gap-2 courier-mt-3\">\n {facebookLink && (\n <a href={facebookLink} target=\"_blank\" rel=\"noopener noreferrer\">\n <FacebookIcon className=\"courier-w-5 courier-h-5\" />\n </a>\n )}\n {linkedinLink && (\n <a href={linkedinLink} target=\"_blank\" rel=\"noopener noreferrer\">\n <LinkedinIcon className=\"courier-w-5 courier-h-5\" />\n </a>\n )}\n {instagramLink && (\n <a href={instagramLink} target=\"_blank\" rel=\"noopener noreferrer\">\n <InstagramIcon className=\"courier-w-5 courier-h-5\" />\n </a>\n )}\n {mediumLink && (\n <a href={mediumLink} target=\"_blank\" rel=\"noopener noreferrer\">\n <MediumIcon className=\"courier-w-5 courier-h-5\" />\n </a>\n )}\n {xLink && (\n <a href={xLink} target=\"_blank\" rel=\"noopener noreferrer\">\n <XIcon className=\"courier-w-5 courier-h-5\" />\n </a>\n )}\n </div>\n </div>\n );\n};\n\nexport const BrandFooter = memo(BrandFooterComponent);\n", "export class UploadImageAPI {\n public static uploadImage = async (file: File): Promise<string> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n if (typeof reader.result === \"string\") {\n resolve(reader.result);\n } else {\n reject(new Error(\"Failed to convert image to data URL\"));\n }\n };\n\n reader.onerror = () => {\n reject(new Error(\"Failed to read image file\"));\n };\n\n reader.readAsDataURL(file);\n });\n };\n}\n\nexport default UploadImageAPI;\n", "import { default as UploadImageAPI } from \"@/lib/api/UploadImageAPI\";\nimport type { Editor } from \"@tiptap/core\";\nimport type { Node } from \"@tiptap/pm/model\";\nimport {\n Blockquote,\n Button,\n Color,\n Divider,\n Document,\n DragPlaceholder,\n Dropcursor,\n FileHandler,\n HardBreak,\n Heading,\n ImageBlock,\n Link,\n Paragraph,\n Placeholder,\n Selection,\n StarterKit,\n TextAlign,\n Typography,\n Underline,\n // UniqueId,\n Variable,\n VariableNode,\n} from \".\";\n\nexport const ExtensionKit = (options?: {\n variables?: Record<string, unknown>;\n setSelectedNode?: (node: Node) => void;\n}) => [\n // Core extensions first\n Document,\n StarterKit.configure({\n document: false,\n dropcursor: false,\n gapcursor: false,\n heading: false,\n horizontalRule: false,\n // codeBlock: false,\n paragraph: false,\n blockquote: false,\n hardBreak: false,\n }),\n\n // Global attribute extensions\n Selection.configure({\n setSelectedNode: options?.setSelectedNode,\n }),\n\n // Node extensions\n HardBreak.configure({\n keepMarks: true,\n HTMLAttributes: {\n class: \"my-line-break\",\n },\n }),\n DragPlaceholder,\n Divider,\n Paragraph,\n Blockquote,\n History,\n Heading.configure({\n levels: [1, 2, 3, 4, 5, 6],\n }),\n Button,\n Color,\n Link.configure({\n openOnClick: false,\n defaultProtocol: \"https\",\n HTMLAttributes: {\n class: \"link\",\n },\n }),\n Underline,\n ImageBlock.configure(),\n FileHandler.configure({\n allowedMimeTypes: [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"],\n onDrop: (currentEditor: Editor, files: File[], pos: number) => {\n files.forEach(async (file) => {\n const url = await UploadImageAPI.uploadImage(file);\n\n currentEditor.chain().setImageBlockAt({ pos, src: url }).focus().run();\n });\n },\n onPaste: (currentEditor: Editor, files: File[]) => {\n files.forEach(async (file) => {\n const url = await UploadImageAPI.uploadImage(file);\n\n return currentEditor\n .chain()\n .setImageBlockAt({\n pos: currentEditor.state.selection.anchor,\n src: url,\n })\n .focus()\n .run();\n });\n },\n }),\n TextAlign.extend({\n addKeyboardShortcuts() {\n return {};\n },\n }).configure({\n types: [\"paragraph\", \"heading\"],\n }),\n Typography,\n Placeholder.configure({\n includeChildren: true,\n showOnlyCurrent: true,\n placeholder: \"\",\n emptyEditorClass: \"is-editor-empty\",\n emptyNodeClass: \"is-empty\",\n showOnlyWhenEditable: true,\n }),\n Dropcursor.configure({\n width: 2,\n class: \"ProseMirror-dropcursor courier-border-black\",\n }),\n Variable.configure({\n variables: options?.variables,\n }),\n VariableNode,\n];\n\nexport default ExtensionKit;\n", "import type {\n TiptapDoc,\n TiptapNode,\n TiptapMark,\n} from \"../convertTiptapToElemental/convertTiptapToElemental\";\n\nconst markToMD = (mark: TiptapMark): string => {\n switch (mark.type) {\n case \"bold\":\n return \"**\";\n case \"italic\":\n return \"*\";\n case \"strike\":\n return \"~\";\n case \"underline\":\n return \"+\";\n default:\n return \"\";\n }\n};\n\nconst convertNodeToMarkdown = (node: TiptapNode): string => {\n switch (node.type) {\n case \"variable\": {\n return `{{${node.attrs?.id}}}`;\n }\n\n case \"text\": {\n let text = node.text || \"\";\n\n if (node.marks?.length) {\n const markSymbols = node.marks.map(markToMD).filter(Boolean);\n text = markSymbols.join(\"\") + text + markSymbols.reverse().join(\"\");\n }\n\n const linkMark = node.marks?.find((m) => m.type === \"link\");\n if (linkMark) {\n text = `[${text}](${linkMark.attrs?.href})`;\n }\n\n return text;\n }\n\n case \"hardBreak\":\n return \"\\n\";\n\n case \"paragraph\": {\n const content = node.content?.map(convertNodeToMarkdown).join(\"\") || \"\";\n return content + \"\\n\\n\";\n }\n\n case \"heading\": {\n const level = (node.attrs?.level as number) || 1;\n const prefix = \"#\".repeat(level) + \" \";\n const content = node.content?.map(convertNodeToMarkdown).join(\"\") || \"\";\n return prefix + content + \"\\n\\n\";\n }\n\n case \"blockquote\": {\n const content = node.content?.map(convertNodeToMarkdown).join(\"\") || \"\";\n return (\n content\n .split(\"\\n\")\n .map((line) => `> ${line}`)\n .join(\"\\n\") + \"\\n\\n\"\n );\n }\n\n case \"imageBlock\": {\n const alt = node.attrs?.alt || \"\";\n const src = node.attrs?.sourcePath || \"\";\n const link = node.attrs?.link;\n const imageMarkdown = ``;\n return link ? `[${imageMarkdown}](${link})\\n\\n` : imageMarkdown + \"\\n\\n\";\n }\n\n case \"divider\":\n return \"---\\n\\n\";\n\n case \"button\": {\n const label = node.attrs?.label || \"\";\n const link = node.attrs?.link || \"#\";\n return `[${label}](${link})\\n\\n`;\n }\n\n default:\n return node.content?.map(convertNodeToMarkdown).join(\"\") || \"\";\n }\n};\n\nexport function convertTiptapToMarkdown(doc: TiptapDoc): string {\n if (!doc.content) {\n return \"\";\n }\n\n return doc.content.map(convertNodeToMarkdown).join(\"\").trim();\n}\n", "import { BrandEditorContentAtom } from \"@/components/BrandEditor/store\";\nimport { ExtensionKit } from \"@/components/extensions/extension-kit\";\nimport { setPendingLinkAtom } from \"@/components/ui/TextMenu/store\";\nimport { convertElementalToTiptap } from \"@/lib\";\nimport { convertTiptapToMarkdown } from \"@/lib/utils/convertTiptapToMarkdown/convertTiptapToMarkdown\";\nimport type { ElementalContent, TiptapDoc } from \"@/types\";\nimport type { AnyExtension, Editor } from \"@tiptap/core\";\nimport { Extension } from \"@tiptap/core\";\nimport type { Node } from \"@tiptap/pm/model\";\nimport { TextSelection, type Transaction } from \"@tiptap/pm/state\";\nimport { useEditor } from \"@tiptap/react\";\nimport { useAtom, useSetAtom } from \"jotai\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport type { Doc as YDoc } from \"yjs\";\n\ndeclare global {\n interface Window {\n editor: Editor | null;\n }\n}\n\ninterface UseBlockEditorProps {\n initialContent?: ElementalContent;\n readOnly?: boolean;\n subject?: string | null;\n variables?: Record<string, unknown>;\n ydoc: YDoc;\n onDestroy?: () => void;\n onUpdate?: () => void;\n setSelectedNode?: (node: Node | null) => void;\n}\n\nexport const useBlockEditor = ({\n initialContent = {\n version: \"2022-01-01\",\n elements: [\n {\n type: \"text\",\n align: \"left\",\n content: \"\",\n },\n ],\n },\n readOnly = false,\n variables,\n ydoc,\n onDestroy,\n setSelectedNode,\n}: UseBlockEditorProps) => {\n const setPendingLink = useSetAtom(setPendingLinkAtom);\n const timeoutRef = useRef<NodeJS.Timeout>();\n const [brandEditorContent, setBrandEditorContent] = useAtom(BrandEditorContentAtom);\n\n // Create an extension to handle the Escape key\n const EscapeHandlerExtension = Extension.create({\n name: \"escapeHandler\",\n addKeyboardShortcuts() {\n return {\n Escape: ({ editor }) => {\n const { state, dispatch } = editor.view;\n dispatch(\n state.tr.setSelection(TextSelection.create(state.doc, state.selection.$anchor.pos))\n );\n if (setSelectedNode) {\n setSelectedNode(null);\n }\n return false;\n },\n };\n },\n });\n\n const onCreateHandler = useCallback(() => {\n if (setSelectedNode) {\n setTimeout(() => {\n setSelectedNode(null);\n }, 100);\n }\n }, [setSelectedNode]);\n\n const onUpdateHandler = useCallback(\n ({ editor }: { editor: Editor }) => {\n const newContent = convertTiptapToMarkdown(editor.getJSON() as TiptapDoc);\n if (JSON.stringify(brandEditorContent) !== JSON.stringify(newContent)) {\n setBrandEditorContent(newContent);\n }\n },\n [brandEditorContent, setBrandEditorContent]\n );\n\n const onSelectionUpdateHandler = useCallback(\n ({ editor }: { editor: Editor }) => {\n const { selection } = editor.state;\n // Handle link and paragraph selection\n const marks = selection.$head.marks();\n const linkMark = marks.find((m) => m.type.name === \"link\");\n\n if (linkMark || editor.isActive(\"link\")) {\n setPendingLink({ mark: linkMark });\n } else {\n setPendingLink(null);\n }\n },\n [setPendingLink]\n );\n\n const onTransactionHandler = useCallback(\n ({ editor, transaction }: { editor: Editor; transaction: Transaction }) => {\n const { selection } = editor.state;\n\n const showLinkForm = transaction?.getMeta(\"showLinkForm\");\n if (showLinkForm) {\n const marks = selection.$head.marks();\n const linkMark = marks.find((m) => m.type.name === \"link\");\n setPendingLink({\n mark: linkMark,\n link: {\n from: selection.from,\n to: selection.to,\n },\n });\n }\n },\n [setPendingLink]\n );\n\n const onDestroyHandler = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n onDestroy?.();\n }, [onDestroy]);\n\n const extensions = useMemo(\n () =>\n [...ExtensionKit({ variables, setSelectedNode }), EscapeHandlerExtension].filter(\n (e): e is AnyExtension => e !== undefined\n ),\n [EscapeHandlerExtension, variables, setSelectedNode]\n );\n\n const editor = useEditor(\n {\n content: convertElementalToTiptap(initialContent),\n immediatelyRender: true,\n shouldRerenderOnTransaction: true,\n autofocus: !readOnly,\n editable: !readOnly,\n onCreate: onCreateHandler,\n onUpdate: onUpdateHandler,\n onSelectionUpdate: onSelectionUpdateHandler,\n onTransaction: onTransactionHandler,\n onDestroy: onDestroyHandler,\n extensions,\n },\n [ydoc]\n );\n\n window.editor = editor;\n\n return { editor };\n};\n", "// Maximum dimensions for stored images to improve performance\nexport const MAX_IMAGE_DIMENSION = 800;\n// Maximum file size for email attachments (in bytes, ~500KB)\nexport const MAX_FILE_SIZE = 500 * 1024;\n\n// Helper function to resize an image before storing it\nexport const resizeImage = (\n file: File,\n maxDimension: number\n): Promise<{ dataUrl: string; width: number; height: number }> => {\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n const img = new Image();\n img.onload = () => {\n // Calculate new dimensions while maintaining aspect ratio\n let newWidth, newHeight;\n if (img.width > img.height) {\n newWidth = Math.min(maxDimension, img.width);\n newHeight = Math.round((img.height / img.width) * newWidth);\n } else {\n newHeight = Math.min(maxDimension, img.height);\n newWidth = Math.round((img.width / img.height) * newHeight);\n }\n\n // Create canvas for resizing\n const canvas = document.createElement(\"canvas\");\n canvas.width = newWidth;\n canvas.height = newHeight;\n const ctx = canvas.getContext(\"2d\");\n\n if (ctx) {\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = \"high\";\n ctx.drawImage(img, 0, 0, newWidth, newHeight);\n\n // Start with higher quality\n let quality = 0.8;\n let dataUrl = canvas.toDataURL(file.type || \"image/jpeg\", quality);\n\n // Reduce quality if the file is still too large\n let iterations = 0;\n const maxIterations = 5;\n\n while (dataUrl.length > MAX_FILE_SIZE && iterations < maxIterations) {\n iterations++;\n quality -= 0.1;\n if (quality < 0.3) quality = 0.3; // Don't go below 0.3 quality\n dataUrl = canvas.toDataURL(file.type || \"image/jpeg\", quality);\n }\n\n resolve({\n dataUrl,\n width: newWidth,\n height: newHeight,\n });\n } else {\n // Fallback if canvas context not available\n resolve({\n dataUrl: e.target?.result as string,\n width: img.width,\n height: img.height,\n });\n }\n };\n img.src = e.target?.result as string;\n };\n reader.readAsDataURL(file);\n });\n};\n", "import { cn } from \"@/lib/utils\";\nimport { MAX_IMAGE_DIMENSION, resizeImage } from \"@/lib/utils/image\";\nimport { useCallback, useRef, useState } from \"react\";\n\nexport interface LogoUploaderProps {\n onFileSelect?: (dataUrl: string) => void;\n}\n\nexport const LogoUploader: React.FC<LogoUploaderProps> = ({ onFileSelect }) => {\n const [isDragging, setIsDragging] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.dataTransfer.types.includes(\"Files\")) {\n const items = Array.from(e.dataTransfer.items);\n const hasImageFile = items.some((item) => item.type.startsWith(\"image/\"));\n if (hasImageFile) {\n setIsDragging(true);\n e.dataTransfer.dropEffect = \"copy\";\n }\n }\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n }, []);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.dataTransfer.types.includes(\"Files\")) {\n const items = Array.from(e.dataTransfer.items);\n const hasImageFile = items.some((item) => item.type.startsWith(\"image/\"));\n if (hasImageFile) {\n setIsDragging(true);\n }\n }\n }, []);\n\n const handleFileUpload = useCallback(\n async (file: File) => {\n try {\n const { dataUrl } = await resizeImage(file, MAX_IMAGE_DIMENSION);\n onFileSelect?.(dataUrl);\n // Reset the file input after successful upload\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n } catch (error) {\n console.error(\"Error processing image:\", error);\n // Reset on error too\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n }\n },\n [onFileSelect]\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n\n const files = Array.from(e.dataTransfer.files);\n const imageFile = files.find((file) => file.type.startsWith(\"image/\"));\n if (imageFile) {\n handleFileUpload(imageFile);\n }\n },\n [handleFileUpload]\n );\n\n const handleFileSelect = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) {\n handleFileUpload(file);\n }\n },\n [handleFileUpload]\n );\n\n const handleBrowseClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n fileInputRef.current?.click();\n }, []);\n\n return (\n <div\n className={cn(\n \"courier-bg-gray-100 courier-rounded-md courier-flex courier-flex-row courier-items-center courier-cursor-pointer courier-transition-colors courier-py-4 courier-px-6 courier-gap-1 !courier-w-fit\",\n isDragging && \"courier-border-primary courier-bg-gray-50\"\n )}\n onDragOver={handleDragOver}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{ pointerEvents: \"all\" }}\n >\n <span className=\"courier-text-sm courier-pointer-events-none\">Drag and drop logo, or</span>\n <button\n className=\"courier-underline courier-font-medium courier-text-sm\"\n onClick={handleBrowseClick}\n type=\"button\"\n >\n Browse\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"courier-hidden\"\n onChange={handleFileSelect}\n key=\"logo-input\" // Force React to recreate the input\n />\n </div>\n );\n};\n", "import {\n Button,\n Divider,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Input,\n InputColor,\n Switch,\n} from \"@/components/ui-kit\";\nimport {\n FacebookIcon,\n InstagramIcon,\n LinkedinIcon,\n MediumIcon,\n XIcon,\n} from \"@/components/ui-kit/Icon\";\nimport { getFlattenedVariables } from \"@/components/utils/getFlattenedVariables\";\nimport { cn, type TiptapDoc } from \"@/lib/utils\";\nimport { convertTiptapToMarkdown } from \"@/lib/utils/convertTiptapToMarkdown/convertTiptapToMarkdown\";\nimport { MAX_IMAGE_DIMENSION, resizeImage } from \"@/lib/utils/image\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport type { Editor } from \"@tiptap/react\";\nimport { useSetAtom } from \"jotai\";\nimport { ArrowUp } from \"lucide-react\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { TextInput } from \"../../../ui/TextInput\";\nimport type { BrandEditorFormValues } from \"../../BrandEditor.types\";\nimport { brandEditorSchema, defaultBrandEditorFormValues } from \"../../BrandEditor.types\";\nimport { BrandEditorContentAtom } from \"../../store\";\n\nconst HeaderStyle = ({\n isActive,\n onClick,\n value,\n}: {\n isActive?: boolean;\n onClick?: () => void;\n value?: string;\n}) => {\n return (\n <div\n className={cn(\n \"courier-w-full courier-h-16 courier-rounded-md courier-border-border courier-border courier-overflow-hidden courier-bg-secondary courier-cursor-pointer\",\n isActive && \"!courier-border-[#3B82F6]\"\n )}\n onClick={onClick}\n >\n <div className=\"courier-h-full courier-m-2 courier-rounded-md courier-border-border courier-border courier-shadow-md courier-bg-background courier-overflow-hidden\">\n {value === \"border\" && <div className=\"courier-w-full courier-bg-[#000000] courier-h-1\" />}\n </div>\n </div>\n );\n};\n\nexport const SideBar = ({\n editor,\n setForm,\n currentForm,\n}: {\n editor: Editor;\n setForm: (form: BrandEditorFormValues) => void;\n currentForm?: BrandEditorFormValues;\n}) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const setBrandEditorContent = useSetAtom(BrandEditorContentAtom);\n\n const form = useForm<BrandEditorFormValues>({\n resolver: zodResolver(brandEditorSchema),\n defaultValues: currentForm || defaultBrandEditorFormValues,\n });\n\n useEffect(() => {\n if (currentForm) {\n form.reset(currentForm);\n }\n }, [currentForm, form]);\n\n const onFormChange = useCallback(() => {\n const values = form.getValues();\n if (setForm) {\n setForm(values);\n }\n }, [form, setForm]);\n\n const handlePreferencesChange = useCallback(\n (status: boolean) => {\n if (status) {\n editor\n .chain()\n .focus()\n .insertContent({\n type: \"paragraph\",\n content: [\n {\n type: \"text\",\n text: \"Manage Notification Preferences\",\n marks: [\n {\n type: \"link\",\n attrs: {\n href: \"{{urls.preferences}}\",\n },\n },\n ],\n },\n ],\n })\n .run();\n } else {\n const content = editor.getJSON();\n const paragraphs = content.content?.filter((node) => node.type === \"paragraph\") || [];\n\n if (paragraphs.length >= 2) {\n const contentWithoutLastParagraph = content.content?.slice(0, -1) || [];\n editor\n .chain()\n .focus()\n .setContent({ type: \"doc\", content: contentWithoutLastParagraph })\n .run();\n }\n }\n\n setTimeout(() => {\n const newContent = convertTiptapToMarkdown(editor.getJSON() as TiptapDoc);\n setBrandEditorContent(newContent);\n }, 100);\n },\n [editor, setBrandEditorContent]\n );\n\n const variables =\n editor?.extensionManager.extensions.find((ext) => ext.name === \"variableSuggestion\")?.options\n ?.variables || {};\n\n const variableKeys = getFlattenedVariables(variables);\n\n return (\n <Form {...form}>\n <form onChange={() => onFormChange()}>\n <div className=\"courier-pb-6\">\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Header style</h4>\n <FormField\n control={form.control}\n name=\"headerStyle\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <div className=\"courier-w-full courier-flex courier-flex-row courier-gap-3\">\n <HeaderStyle\n isActive={field.value === \"plain\"}\n onClick={() => {\n field.onChange(\"plain\");\n setForm({ ...form.getValues(), headerStyle: \"plain\" });\n }}\n value=\"plain\"\n />\n <HeaderStyle\n isActive={field.value === \"border\"}\n onClick={() => {\n field.onChange(\"border\");\n setForm({ ...form.getValues(), headerStyle: \"border\" });\n }}\n value=\"border\"\n />\n </div>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Divider className=\"courier-mb-4\" />\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Logo</h4>\n <div className=\"courier-flex courier-flex-row courier-gap-3 courier-mb-3\">\n {form.getValues().logo ? (\n <Button\n onClick={() => {\n const values = form.getValues();\n values.logo = \"\";\n form.reset(values);\n setForm({ ...values });\n // Reset the file input\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n onFormChange();\n }}\n className=\"courier-w-full\"\n variant=\"outline\"\n type=\"button\"\n >\n Remove logo\n </Button>\n ) : (\n <Button\n onClick={(e) => {\n e.preventDefault();\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n fileInputRef.current.click();\n }\n }}\n className=\"courier-w-full\"\n variant=\"outline\"\n type=\"button\"\n >\n <ArrowUp\n strokeWidth={1.25}\n className=\"courier-w-4 courier-h-4 courier-mr-2 courier-text-foreground\"\n />\n Upload logo\n </Button>\n )}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"courier-hidden\"\n onChange={async (e) => {\n const file = e.target.files?.[0];\n if (file) {\n try {\n const { dataUrl } = await resizeImage(file, MAX_IMAGE_DIMENSION);\n const values = form.getValues();\n values.logo = dataUrl;\n form.reset(values);\n setForm({ ...values });\n } catch (error) {\n console.error(\"Error processing image:\", error);\n }\n }\n // Always reset the input\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n }}\n />\n </div>\n <FormField\n control={form.control}\n name=\"link\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-3\">\n <FormControl>\n <TextInput\n as=\"Textarea\"\n placeholder=\"Link\"\n {...field}\n variables={variableKeys}\n onChange={(value) => {\n field.onChange(value);\n onFormChange();\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n {/* <FormField\n control={form.control}\n name=\"alt\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <TextInput\n as=\"Textarea\"\n {...field}\n placeholder=\"Alt text...\"\n variables={variableKeys}\n onChange={(value) => {\n field.onChange(value);\n onFormChange();\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n /> */}\n <Divider className=\"courier-mb-4\" />\n\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Brand color</h4>\n <FormField\n control={form.control}\n name=\"brandColor\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <InputColor\n {...field}\n defaultValue={field.value}\n onChange={(value) => {\n field.onChange(value);\n onFormChange();\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Text color</h4>\n <FormField\n control={form.control}\n name=\"textColor\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <InputColor\n {...field}\n defaultValue={field.value}\n onChange={(value) => {\n field.onChange(value);\n onFormChange();\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Subtle color</h4>\n <FormField\n control={form.control}\n name=\"subtleColor\"\n render={({ field }) => (\n <FormItem className=\"courier-mb-4\">\n <FormControl>\n <InputColor\n {...field}\n defaultValue={field.value}\n onChange={(value) => {\n field.onChange(value);\n onFormChange();\n }}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Divider className=\"courier-mb-4\" />\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Footer links</h4>\n <div className=\"courier-flex courier-flex-col courier-gap-3 courier-mb-3\">\n <FormField\n control={form.control}\n name=\"facebookLink\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input\n startAdornment={<FacebookIcon />}\n placeholder=\"facebook.com/username\"\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"linkedinLink\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input\n startAdornment={<LinkedinIcon />}\n placeholder=\"linkedin.com/username\"\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"instagramLink\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input\n startAdornment={<InstagramIcon />}\n placeholder=\"instagram.com/username\"\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"mediumLink\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input\n startAdornment={<MediumIcon />}\n placeholder=\"medium.com/username\"\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"xLink\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input startAdornment={<XIcon />} placeholder=\"x.com/username\" {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n <Divider className=\"courier-mb-4\" />\n <h4 className=\"courier-text-sm courier-font-medium courier-mb-3\">Footer actions</h4>\n {/* <FormField\n control={form.control}\n name=\"isUnsubscribe\"\n render={({ field }) => (\n <FormItem className=\"courier-flex courier-flex-row courier-items-center courier-gap-2 courier-mb-4\">\n <FormControl>\n <Switch checked={field.value} onCheckedChange={field.onChange} />\n </FormControl>\n <FormLabel className=\"!courier-m-0\">Unsubscribe</FormLabel>\n <FormMessage />\n </FormItem>\n )}\n /> */}\n <FormField\n control={form.control}\n name=\"isPreferences\"\n render={({ field }) => (\n <FormItem className=\"courier-flex courier-flex-row courier-items-center courier-gap-2 courier-mb-4\">\n <FormControl>\n <Switch\n checked={field.value}\n onCheckedChange={(status) => {\n field.onChange(status);\n handlePreferencesChange(status);\n onFormChange();\n }}\n />\n </FormControl>\n <FormLabel className=\"!courier-m-0\">Manage Preferences</FormLabel>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n </form>\n </Form>\n );\n};\n", "import { z } from \"zod\";\nimport type {\n Align,\n IActionButtonStyle,\n TextStyle,\n ElementalNode,\n ElementalTextNode,\n ElementalTextNodeWithElements,\n ElementalTextNodeWithContent,\n ElementalMetaNode,\n ElementalChannelNode,\n ElementalImageNode,\n ElementalActionNode,\n ElementalDividerNode,\n ElementalGroupNode,\n ElementalQuoteNode,\n ElementalHtmlNode,\n ElementalCommentNode,\n ElementalListNode,\n ElementalListItemNode,\n} from \"./elemental.types\";\n\n// Update basic type enums to match the TypeScript types\nconst AlignEnum = z.enum([\"left\", \"center\", \"right\"]) as z.ZodType<Align>;\nconst TextStyleEnum = z.enum([\"text\", \"h1\", \"h2\", \"subtext\"]) as z.ZodType<TextStyle>;\nconst ActionButtonStyleEnum = z.enum([\"button\", \"link\"]) as z.ZodType<IActionButtonStyle>;\n\n// Base node properties\nconst BaseElementalNode = z.object({\n type: z.string(),\n channels: z.array(z.string()).optional(),\n ref: z.string().optional(),\n if: z.string().optional(),\n loop: z.string().optional(),\n data: z.record(z.unknown()).optional(),\n});\n\n// Text content nodes\nconst ElementalTextContent = z.object({\n color: z.string().optional(),\n highlight: z.string().optional(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n strikethrough: z.boolean().optional(),\n underline: z.boolean().optional(),\n});\n\nconst StringTextContent = ElementalTextContent.extend({\n type: z.literal(\"string\"),\n content: z.string(),\n});\n\nconst LinkTextContent = ElementalTextContent.extend({\n type: z.literal(\"link\"),\n content: z.string(),\n href: z.string(),\n disable_tracking: z.boolean().optional(),\n});\n\nconst ImageTextContent = ElementalTextContent.extend({\n type: z.literal(\"img\"),\n src: z.string(),\n alt_text: z.string().optional(),\n href: z.string().optional(),\n disable_tracking: z.boolean().optional(),\n width: z.string().optional(),\n});\n\nconst TextContentNode = z.discriminatedUnion(\"type\", [\n StringTextContent,\n LinkTextContent,\n ImageTextContent,\n]);\n\n// Split TextNode into two variants\nconst TextNodeWithElements: z.ZodType<ElementalTextNodeWithElements> = BaseElementalNode.extend({\n type: z.literal(\"text\"),\n align: AlignEnum.optional(),\n text_style: TextStyleEnum.optional(),\n background_color: z.string().optional(),\n format: z.literal(\"markdown\").optional(),\n elements: z.array(TextContentNode), // Required for this variant\n locales: z.record(z.object({ content: z.string().optional() })).optional(),\n});\n\nconst TextNodeWithContent: z.ZodType<ElementalTextNodeWithContent> = BaseElementalNode.extend({\n type: z.literal(\"text\"),\n align: AlignEnum.optional(),\n content: z.string(), // Required for this variant - handles markdown formatted content\n text_style: TextStyleEnum.optional(),\n background_color: z.string().optional(),\n format: z.literal(\"markdown\").optional(),\n locales: z.record(z.object({ content: z.string().optional() })).optional(),\n});\n\n// Create union of both variants\nconst TextNode = z.union([\n TextNodeWithContent,\n TextNodeWithElements,\n]) as z.ZodType<ElementalTextNode>;\n\nconst MetaNode: z.ZodType<ElementalMetaNode> = BaseElementalNode.extend({\n type: z.literal(\"meta\"),\n title: z.string().optional(),\n locales: z.record(z.object({ title: z.string().optional() })).optional(),\n});\n\nconst ChannelNode: z.ZodType<ElementalChannelNode> = BaseElementalNode.extend({\n type: z.literal(\"channel\"),\n channel: z.string(),\n elements: z.array(z.lazy(() => ElementalNodeType)).optional(),\n raw: z\n .object({\n html: z.string().optional(),\n transformers: z.array(z.string()).optional(),\n text: z.string().optional(),\n })\n .passthrough()\n .optional(),\n locales: z\n .record(\n z.object({\n elements: z.array(z.lazy(() => ElementalNodeType)).optional(),\n raw: z.record(z.unknown()).optional(),\n })\n )\n .optional(),\n});\n\nconst ImageNode: z.ZodType<ElementalImageNode> = BaseElementalNode.extend({\n type: z.literal(\"image\"),\n src: z.string(),\n href: z.string().optional(),\n align: AlignEnum.optional(),\n alt_text: z.string().optional(),\n width: z.string().optional(),\n locales: z\n .record(\n z.object({\n href: z.string().optional(),\n src: z.string().optional(),\n })\n )\n .optional(),\n});\n\nconst ActionNode: z.ZodType<ElementalActionNode> = BaseElementalNode.extend({\n type: z.literal(\"action\"),\n content: z.string(),\n href: z.string(),\n align: AlignEnum.optional(),\n style: ActionButtonStyleEnum.optional(),\n background_color: z.string().optional(),\n disable_tracking: z.boolean().optional(),\n});\n\nconst DividerNode: z.ZodType<ElementalDividerNode> = BaseElementalNode.extend({\n type: z.literal(\"divider\"),\n color: z.string().optional(),\n});\n\nconst GroupNode: z.ZodType<ElementalGroupNode> = BaseElementalNode.extend({\n type: z.literal(\"group\"),\n elements: z.array(z.lazy(() => ElementalNodeType)),\n locales: z\n .record(\n z.object({\n elements: z.array(z.lazy(() => ElementalNodeType)).optional(),\n })\n )\n .optional(),\n});\n\nconst QuoteNode: z.ZodType<ElementalQuoteNode> = BaseElementalNode.extend({\n type: z.literal(\"quote\"),\n content: z.string(),\n align: AlignEnum.optional(),\n border_color: z.string().optional(),\n text_style: TextStyleEnum.optional(),\n});\n\nconst HtmlNode: z.ZodType<ElementalHtmlNode> = BaseElementalNode.extend({\n type: z.literal(\"html\"),\n content: z.string(),\n locales: z\n .record(\n z.object({\n content: z.string().optional(),\n })\n )\n .optional(),\n});\n\nconst CommentNode: z.ZodType<ElementalCommentNode> = BaseElementalNode.extend({\n type: z.literal(\"comment\"),\n comment: z.string().optional(),\n object: z.any().optional(),\n});\n\nconst ListItemNode: z.ZodType<ElementalListItemNode> = BaseElementalNode.extend({\n type: z.literal(\"list-item\"),\n background_color: z.string().optional(),\n elements: z.array(z.union([TextContentNode, z.lazy(() => ListNode)])),\n});\n\nconst ListNode: z.ZodType<ElementalListNode> = BaseElementalNode.extend({\n type: z.literal(\"list\"),\n list_type: z.enum([\"ordered\", \"unordered\"]),\n elements: z.array(z.lazy(() => ListItemNode)),\n imgSrc: z.string().optional(),\n imgHref: z.string().optional(),\n});\n\nexport const ElementalNodeType = z.union([\n TextNode,\n MetaNode,\n ChannelNode,\n ImageNode,\n ActionNode,\n DividerNode,\n GroupNode,\n QuoteNode,\n HtmlNode,\n CommentNode,\n ListNode,\n ListItemNode,\n]) as z.ZodType<ElementalNode>;\n\nexport const ElementalSchema = z.object({\n version: z.literal(\"2022-01-01\"),\n elements: z.array(ElementalNodeType),\n});\n\nexport const validateElemental = (json: unknown) => {\n try {\n return {\n success: true,\n data: ElementalSchema.parse(json),\n };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n success: false,\n errors: error.errors,\n };\n }\n throw error;\n }\n};\n", "import type { ElementalContent } from \"@/types\";\nimport { validateElemental } from \"@/types/elemental.schema\";\nimport React, { useCallback, useEffect, useState } from \"react\";\n\ninterface ElementalValueProps {\n value?: ElementalContent;\n onChange?: (value: string, isValid: boolean) => void;\n}\n\nexport const ElementalValue: React.FC<ElementalValueProps> = ({ value, onChange }) => {\n const [error, setError] = useState<string | null>(null);\n const [localValue, setLocalValue] = useState(() => JSON.stringify(value, null, 2));\n\n useEffect(() => {\n if (value) {\n setLocalValue(JSON.stringify(value, null, 2));\n }\n }, [value]);\n\n const validateValue = useCallback((value: string) => {\n try {\n const jsonValue = JSON.parse(value);\n const validationValue = Array.isArray(jsonValue)\n ? {\n version: \"2022-01-01\",\n elements: jsonValue,\n }\n : jsonValue;\n\n const validation = validateElemental(validationValue);\n\n if (!validation.success) {\n const errorMessage = validation.errors\n ?.map((err) => `${err.path.join(\".\")}: ${err.message}`)\n .join(\"\\n\");\n setError(errorMessage ?? null);\n return false;\n } else {\n setError(null);\n return true;\n }\n } catch (e) {\n setError(\"Invalid JSON format\");\n return false;\n }\n }, []);\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = event.target.value;\n setLocalValue(newValue);\n validateValue(newValue);\n },\n [validateValue]\n );\n\n const handleBlur = useCallback(() => {\n const isValid = validateValue(localValue);\n onChange?.(localValue, isValid);\n }, [localValue, onChange, validateValue]);\n\n return (\n <>\n <textarea\n value={localValue}\n onChange={handleChange}\n onBlur={handleBlur}\n className=\"courier-flex-1 courier-rounded-lg courier-border courier-border-border courier-shadow-sm courier-p-4 courier-h-full\"\n style={{\n fontFamily: \"monospace\",\n border: error ? \"2px solid #ff0000\" : undefined,\n }}\n placeholder=\"Paste your Elemental JSON here...\"\n />\n {error && (\n <div\n style={{\n color: \"#ff0000\",\n marginTop: \"8px\",\n whiteSpace: \"pre-wrap\",\n fontFamily: \"monospace\",\n fontSize: \"14px\",\n }}\n >\n {error}\n </div>\n )}\n </>\n );\n};\n", "import { Toaster } from \"sonner\";\nimport { ThemeProvider } from \"@/components/ui-kit\";\nimport type { Theme } from \"@/components/ui-kit/ThemeProvider/ThemeProvider.types\";\n\nexport interface EditorLayoutProps {\n theme?: Theme | string;\n children: React.ReactNode;\n}\n\nexport const EditorLayout: React.FC<EditorLayoutProps> = ({ theme, children }) => (\n <ThemeProvider theme={theme}>\n <div\n className=\"courier-relative courier-h-full courier-rounded-sm courier-border courier-border-border courier-bg-card courier-flex courier-flex-col courier-text-foreground courier-min-w-[812px] courier-overflow-hidden\"\n data-mode=\"light\"\n >\n <Toaster\n position=\"top-center\"\n expand\n visibleToasts={2}\n style={{ position: \"absolute\", top: \"10px\", left: \"50%\", transform: \"translateX(-50%)\" }}\n />\n {children}\n </div>\n </ThemeProvider>\n);\n", "import { Button } from \"@/components/ui-kit/Button/Button\";\nimport { DesktopIcon, MobileIcon } from \"@/components/ui-kit/Icon\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui-kit/ToggleGroup\";\n\ninterface PreviewPanelProps {\n previewMode: \"desktop\" | \"mobile\" | undefined;\n togglePreviewMode: (mode?: \"desktop\" | \"mobile\" | undefined) => void;\n}\n\nconst PreviewItem = ({\n value,\n icon,\n ...props\n}: {\n value: string;\n icon: React.ReactNode;\n [key: string]: unknown;\n}) => {\n return (\n <ToggleGroupItem\n value={value}\n {...props}\n className=\"!courier-w-10 !courier-h-6 [&_svg]:!courier-size-5 [&_svg]:courier-fill-accent hover:courier-bg-transparent courier-rounded-sm data-[state=on]:courier-bg-background [&_svg]:data-[state=on]:courier-fill-foreground\"\n >\n {icon}\n </ToggleGroupItem>\n );\n};\n\nexport const PreviewPanel = ({ previewMode, togglePreviewMode }: PreviewPanelProps) => {\n return (\n <div className=\"courier-sticky courier-bottom-0 courier-mt-auto courier-self-center courier-bg-background courier-px-3 courier-py-2 courier-shadow-lg courier-border courier-border-border courier-rounded-md courier-z-10 courier-flex courier-items-center courier-gap-2\">\n {previewMode && (\n <>\n <ToggleGroup\n type=\"single\"\n value={previewMode}\n onValueChange={(value) => {\n if (value === \"\") {\n return;\n }\n togglePreviewMode(value as \"desktop\" | \"mobile\");\n }}\n className=\"courier-w-full courier-rounded-md !courier-p-0.5 courier-bg-[#3B82F6] !courier-gap-0\"\n >\n <PreviewItem value=\"desktop\" icon={<DesktopIcon />} />\n <PreviewItem value=\"mobile\" icon={<MobileIcon />} />\n </ToggleGroup>\n <div className=\"courier-mx-4 courier-w-px courier-h-6 courier-bg-border\" />\n </>\n )}\n <Button variant=\"link\" onClick={() => togglePreviewMode()}>\n {previewMode ? \"Exit\" : \"View\"} Preview\n </Button>\n </div>\n );\n};\n", "import { BrandFooter } from \"@/components/BrandEditor/Editor/BrandFooter/BrandFooter\";\nimport { useTemplateActions } from \"@/components/Providers\";\nimport { Button, Input } from \"@/components/ui-kit\";\nimport { ButtonBlock } from \"@/components/ui/Blocks/ButtonBlock\";\nimport { DividerBlock } from \"@/components/ui/Blocks/DividerBlock\";\nimport { HeadingBlock } from \"@/components/ui/Blocks/HeadingBlock\";\nimport { ImageBlock } from \"@/components/ui/Blocks/ImageBlock\";\nimport { SpacerBlock } from \"@/components/ui/Blocks/SpacerBlock\";\nimport { TextBlock } from \"@/components/ui/Blocks/TextBlock\";\nimport { Header } from \"@/components/ui/Header\";\nimport { PreviewPanel } from \"@/components/ui/PreviewPanel\";\nimport { Status } from \"@/components/ui/Status\";\nimport { TextMenu } from \"@/components/ui/TextMenu\";\nimport { selectedNodeAtom } from \"@/components/ui/TextMenu/store\";\nimport { cn } from \"@/lib/utils\";\nimport type { CollisionDetection, UniqueIdentifier } from \"@dnd-kit/core\";\nimport {\n closestCenter,\n DndContext,\n DragOverlay,\n getFirstCollision,\n KeyboardSensor,\n MeasuringStrategy,\n MouseSensor,\n pointerWithin,\n rectIntersection,\n TouchSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport { arrayMove, SortableContext, verticalListSortingStrategy } from \"@dnd-kit/sortable\";\nimport type { Node } from \"@tiptap/pm/model\";\nimport type { Editor as TiptapEditor } from \"@tiptap/react\";\nimport { EditorContent } from \"@tiptap/react\";\nimport { useAtom, useAtomValue, useSetAtom } from \"jotai\";\nimport { forwardRef, memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport {\n brandApplyAtom,\n isTenantLoadingAtom,\n isTenantSavingAtom,\n tenantDataAtom,\n tenantErrorAtom,\n} from \"../../Providers/store\";\nimport { createOrDuplicateNode } from \"../../utils\";\nimport { coordinateGetter as multipleContainersCoordinateGetter } from \"../../utils/multipleContainersKeyboardCoordinates\";\nimport { subjectAtom } from \"../store\";\nimport { BrandEditorFormAtom } from \"@/components/BrandEditor/store\";\nimport { SideBar } from \"./SideBar\";\nimport { SideBarItemDetails } from \"./SideBar/SideBarItemDetails\";\n\nexport interface EditorProps {\n editor: TiptapEditor;\n handleEditorClick: (event: React.MouseEvent<HTMLDivElement>) => void;\n isLoading?: boolean;\n isVisible?: boolean;\n hidePublish?: boolean;\n brandEditor?: boolean;\n variables?: Record<string, unknown>;\n}\n\ninterface Items {\n Editor: UniqueIdentifier[];\n Sidebar: UniqueIdentifier[];\n}\n\nconst EditorComponent = forwardRef<HTMLDivElement, EditorProps>(\n (\n { editor, handleEditorClick, isLoading, isVisible, hidePublish, brandEditor, variables },\n ref\n ) => {\n const selectedNode = useAtomValue(selectedNodeAtom);\n const setSelectedNode = useSetAtom(selectedNodeAtom);\n const [subject, setSubject] = useAtom(subjectAtom);\n const [activeId, setActiveId] = useState<UniqueIdentifier | null>(null);\n const [activeDragType, setActiveDragType] = useState<string | null>(null);\n const lastOverId = useRef<UniqueIdentifier | null>(null);\n const recentlyMovedToNewContainer = useRef(false);\n const timeoutRef = useRef<{ [key: string]: NodeJS.Timeout }>({});\n const [lastPlaceholderIndex, setLastPlaceholderIndex] = useState<number | null>(null);\n const [previewMode, setPreviewMode] = useState<\"desktop\" | \"mobile\" | undefined>(undefined);\n const tenantData = useAtomValue(tenantDataAtom);\n const { publishTemplate, isTenantPublishing } = useTemplateActions();\n const isTenantSaving = useAtomValue(isTenantSavingAtom);\n const isTenantLoading = useAtomValue(isTenantLoadingAtom);\n const tenantError = useAtomValue(tenantErrorAtom);\n const brandApply = useAtomValue(brandApplyAtom);\n const BrandEditorForm = useAtomValue(BrandEditorFormAtom);\n\n // const brandSettings = BrandEditorForm ?? tenantData?.data?.tenant?.brand?.settings;\n const brandSettings = useMemo(() => {\n if (BrandEditorForm) {\n return BrandEditorForm;\n }\n const brandSettings = tenantData?.data?.tenant?.brand?.settings;\n return {\n brandColor: brandSettings?.colors?.primary,\n textColor: brandSettings?.colors?.secondary,\n subtleColor: brandSettings?.colors?.tertiary,\n headerStyle: brandSettings?.email?.header?.barColor ? \"border\" : \"plain\",\n logo: brandSettings?.email?.header?.logo?.image,\n link: brandSettings?.email?.header?.logo?.href,\n facebookLink: brandSettings?.email?.footer?.social?.facebook?.url,\n linkedinLink: brandSettings?.email?.footer?.social?.linkedin?.url,\n instagramLink: brandSettings?.email?.footer?.social?.instagram?.url,\n mediumLink: brandSettings?.email?.footer?.social?.medium?.url,\n xLink: brandSettings?.email?.footer?.social?.twitter?.url,\n };\n }, [BrandEditorForm, tenantData]);\n\n const isBrandApply = brandApply && Boolean(brandSettings);\n\n const coordinateGetter = multipleContainersCoordinateGetter;\n const strategy = verticalListSortingStrategy;\n\n const [items, setItems] = useState<Items>({\n Editor: [] as UniqueIdentifier[],\n Sidebar: [] as UniqueIdentifier[],\n });\n\n // Cleanup function for timeouts\n const cleanupTimeouts = useCallback(() => {\n Object.values(timeoutRef.current).forEach((timeout) => clearTimeout(timeout));\n timeoutRef.current = {};\n }, []);\n\n // Cleanup timeouts on unmount\n useEffect(() => {\n return () => {\n cleanupTimeouts();\n };\n }, [cleanupTimeouts]);\n\n // Ensure editor is editable when component unmounts or editor changes\n useEffect(() => {\n return () => {\n // Reset editor to editable state when component unmounts\n if (editor && !editor.isDestroyed) {\n editor.setEditable(true);\n }\n };\n }, [editor]);\n\n useEffect(() => {\n const updateItems = () => {\n try {\n // First, get IDs from DOM elements (this is the original approach)\n const elements = editor.view.dom.querySelectorAll(\n \".react-renderer div[data-node-view-wrapper][data-id]\"\n );\n const domIds = Array.from(elements)\n .map((el) => (el as HTMLElement).getAttribute(\"data-id\"))\n .filter((id): id is string => id !== null);\n\n // Second, get IDs directly from the document model\n const docIds: string[] = [];\n editor.state.doc.descendants((node) => {\n if (node.attrs && node.attrs.id) {\n docIds.push(node.attrs.id);\n }\n return true;\n });\n\n // Combine both approaches to ensure we don't miss any IDs\n const allIds = [...new Set([...domIds, ...docIds])];\n\n // Check if we have an empty document with just one paragraph node\n const docContent = editor.state.doc.content;\n if (\n docContent.childCount === 1 &&\n docContent.child(0).type.name === \"paragraph\" &&\n docContent.child(0).content.size === 0\n ) {\n const paragraphNode = docContent.child(0);\n\n // If the paragraph doesn't have an ID, assign one\n if (!paragraphNode.attrs.id) {\n const newId = `node-${uuidv4()}`;\n\n // Set the ID using a transaction\n const tr = editor.state.tr;\n tr.setNodeMarkup(0, undefined, { ...paragraphNode.attrs, id: newId });\n editor.view.dispatch(tr);\n\n // Add the new ID to our items list\n if (!allIds.includes(newId)) {\n allIds.push(newId);\n }\n } else if (!allIds.includes(paragraphNode.attrs.id)) {\n // If the paragraph has an ID but it's not in our list, add it\n allIds.push(paragraphNode.attrs.id);\n }\n }\n\n // Ensure we don't have duplicate IDs\n const uniqueIds = [...new Set(allIds)];\n\n setItems({\n Editor: uniqueIds,\n Sidebar: [\"heading\", \"text\", \"image\", \"spacer\", \"divider\", \"button\"],\n });\n } catch (error) {\n console.error(\"Error in updateItems:\", error);\n // If there's an error, at least ensure the sidebar items are set\n setItems((prev) => ({\n Editor: prev.Editor,\n Sidebar: [\"heading\", \"text\", \"image\", \"spacer\", \"divider\", \"button\"],\n }));\n }\n };\n\n // Wait a short moment for the DOM to be ready\n timeoutRef.current.updateItems = setTimeout(() => {\n updateItems();\n }, 0);\n\n editor.on(\"update\", () => {\n updateItems();\n });\n\n // Listen for node duplication events\n const handleNodeDuplicated = (event: CustomEvent) => {\n const { newNodeId } = event.detail;\n setItems((prevItems) => ({\n ...prevItems,\n Editor: [...prevItems.Editor, newNodeId],\n }));\n };\n\n document.addEventListener(\"node-duplicated\", handleNodeDuplicated as EventListener);\n\n return () => {\n editor.off(\"update\", updateItems);\n document.removeEventListener(\"node-duplicated\", handleNodeDuplicated as EventListener);\n if (timeoutRef.current.updateItems) {\n clearTimeout(timeoutRef.current.updateItems);\n }\n };\n }, [editor]);\n\n const togglePreviewMode = (mode: \"desktop\" | \"mobile\" | undefined) => {\n const defaultMode = previewMode === undefined ? \"desktop\" : undefined;\n const newPreviewMode = mode || defaultMode;\n\n setPreviewMode(newPreviewMode);\n\n setSelectedNode(null);\n\n // Set editor to readonly when in preview mode\n if (newPreviewMode) {\n editor.setEditable(false);\n } else {\n editor.setEditable(true);\n }\n };\n\n const handlePublish = useCallback(() => {\n publishTemplate();\n }, [publishTemplate]);\n\n const sensors = useSensors(\n useSensor(MouseSensor),\n useSensor(TouchSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter,\n })\n );\n\n const onDragCancel = () => {\n setActiveId(null);\n };\n\n const findContainer = (id: UniqueIdentifier) => {\n // If the id is a temp id, it belongs to the Editor container\n if (typeof id === \"string\" && id.includes(\"_temp_\")) {\n return \"Editor\";\n }\n\n if (id in items) {\n return id;\n }\n\n return Object.keys(items).find((key) =>\n items[key as keyof typeof items].includes(id as string)\n );\n };\n\n /**\n * Custom collision detection strategy optimized for multiple containers\n *\n * - First, find any droppable containers intersecting with the pointer.\n * - If there are none, find intersecting containers with the active draggable.\n * - If there are no intersecting containers, return the last matched intersection\n *\n */\n const collisionDetectionStrategy: CollisionDetection = useCallback(\n (args) => {\n if (activeId && activeId in items) {\n return closestCenter({\n ...args,\n droppableContainers: args.droppableContainers.filter(\n (container) => container.id in items\n ),\n });\n }\n\n // Start by finding any intersecting droppable\n const pointerIntersections = pointerWithin(args);\n const intersections =\n pointerIntersections.length > 0 ? pointerIntersections : rectIntersection(args);\n let overId = getFirstCollision(intersections, \"id\");\n\n if (overId != null) {\n if (overId in items) {\n const containerItems = items[overId as keyof typeof items];\n\n // If a container is matched and it contains items (columns 'A', 'B', 'C')\n if (containerItems.length > 0) {\n // Return the closest droppable within that container\n const closestId = closestCenter({\n ...args,\n droppableContainers: args.droppableContainers.filter(\n (container) =>\n container.id !== overId &&\n containerItems.includes(container.id as keyof typeof items)\n ),\n })[0]?.id;\n\n if (closestId) {\n overId = closestId;\n } else if (overId === \"Editor\") {\n // If we're over the editor container but there's no closest item,\n // we're probably at the end of the list\n overId = \"Editor\";\n }\n }\n }\n\n lastOverId.current = overId;\n\n return [{ id: overId }];\n }\n\n // When a draggable item moves to a new container, the layout may shift\n // and the `overId` may become `null`. We manually set the cached `lastOverId`\n // to the id of the draggable item that was moved to the new container, otherwise\n // the previous `overId` will be returned which can cause items to incorrectly shift positions\n if (recentlyMovedToNewContainer.current) {\n lastOverId.current = activeId;\n }\n\n // If no droppable is matched, return the last match\n return lastOverId.current ? [{ id: lastOverId.current }] : [];\n },\n [activeId, items]\n );\n\n // Add this helper function to get the actual document position\n const getDocumentPosition = useCallback(\n (index: number) => {\n try {\n const doc = editor.state.doc;\n // If index is 0, return 0\n if (index === 0) {\n return 0;\n }\n\n // If inserting at the end\n if (index >= doc.childCount) {\n return doc.content.size;\n }\n\n // Get the position before the target node\n let pos = 0;\n for (let i = 0; i < Math.min(index, doc.childCount); i++) {\n pos += doc.child(i)?.nodeSize;\n }\n return pos;\n } catch (error) {\n // If there's an error, return the end of the document as a fallback\n return editor.state.doc.content.size;\n }\n },\n [editor]\n );\n\n const cleanupPlaceholder = () => {\n editor.commands.removeDragPlaceholder();\n setItems((prev) => ({\n ...prev,\n Editor: prev.Editor.filter((id) => !id.toString().includes(\"_temp\")),\n }));\n };\n\n const handleSubjectChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSubject(e.target.value);\n };\n\n return (\n <>\n {!isLoading && isVisible && (\n <Header>\n <div className=\"courier-flex courier-items-center courier-gap-2 courier-grow\">\n <h4 className=\"courier-text-sm\">Subject: </h4>\n <Input\n value={subject ?? \"\"}\n onChange={handleSubjectChange}\n onFocus={() => setSelectedNode(null)}\n className=\"!courier-bg-background read-only:courier-cursor-default read-only:courier-border-transparent md:courier-text-md courier-py-1 courier-border-transparent !courier-border-none courier-font-medium\"\n placeholder=\"Write subject...\"\n readOnly={previewMode !== undefined}\n />\n </div>\n <div className=\"courier-w-64 courier-pl-4 courier-flex courier-justify-end courier-items-center courier-gap-2\">\n {isTenantSaving !== null && (\n <Status\n isLoading={Boolean(isTenantLoading)}\n isSaving={Boolean(isTenantSaving)}\n isError={Boolean(tenantError)}\n />\n )}\n {!hidePublish && isTenantLoading !== null && (\n <Button\n variant=\"primary\"\n buttonSize=\"small\"\n disabled={\n !tenantData?.data?.tenant?.notification ||\n isTenantPublishing === true ||\n isTenantSaving !== false\n }\n onClick={handlePublish}\n >\n {isTenantPublishing ? \"Publishing...\" : \"Publish changes\"}\n </Button>\n )}\n </div>\n </Header>\n )}\n\n <DndContext\n sensors={sensors}\n collisionDetection={collisionDetectionStrategy}\n measuring={{\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n }}\n onDragStart={({ active }) => {\n setActiveId(active.id);\n // Store the type of item being dragged if it's from sidebar\n if (\n active.id === \"text\" ||\n active.id === \"divider\" ||\n active.id === \"spacer\" ||\n active.id === \"button\" ||\n active.id === \"image\" ||\n active.id === \"heading\"\n ) {\n setActiveDragType(active.id as string);\n }\n }}\n onDragMove={({ active, over }) => {\n if (!over) return;\n\n const overContainer = findContainer(over.id);\n const activeContainer = findContainer(active.id);\n\n // Skip if not dragging from sidebar to editor\n if (!(activeContainer === \"Sidebar\" && overContainer === \"Editor\")) return;\n\n const activeRect = active.rect.current;\n if (!activeRect?.translated) return;\n\n const elements = editor.view.dom.querySelectorAll(\"[data-node-view-wrapper]\");\n let targetIndex = elements.length;\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i] as HTMLElement;\n const rect = element.getBoundingClientRect();\n if (activeRect.translated.top < rect.top + rect.height / 2) {\n targetIndex = i;\n break;\n }\n }\n\n if (targetIndex !== lastPlaceholderIndex) {\n const tempId = `${active.id}_temp_${Date.now()}`;\n setLastPlaceholderIndex(targetIndex);\n\n requestAnimationFrame(() => {\n editor.commands.removeDragPlaceholder();\n editor.commands.setDragPlaceholder({\n id: tempId,\n type: active.id as string,\n pos: getDocumentPosition(targetIndex),\n });\n\n setItems((prev) => ({\n ...prev,\n Editor: [...prev.Editor.filter((id) => !id.toString().includes(\"_temp\")), tempId],\n }));\n });\n }\n }}\n onDragEnd={({ active, over }) => {\n cleanupPlaceholder();\n const overId = over?.id;\n\n if (!overId) {\n setItems((items) => ({\n ...items,\n Editor: items.Editor.filter((id) => !id.toString().includes(\"_temp\")),\n }));\n setActiveId(null);\n setActiveDragType(null);\n return;\n }\n\n const overContainer = findContainer(overId);\n const activeContainer = findContainer(active.id);\n\n if (\n activeContainer === \"Sidebar\" &&\n overContainer === \"Editor\" &&\n lastPlaceholderIndex !== null\n ) {\n // Handle new element insertion\n const insertPos = getDocumentPosition(lastPlaceholderIndex);\n createOrDuplicateNode(\n editor,\n activeDragType as string,\n insertPos,\n undefined,\n (node) => setSelectedNode(node as Node)\n );\n } else if (activeContainer === overContainer) {\n // Handle reordering within Editor\n const activeIndex = items[activeContainer as keyof Items].indexOf(\n active.id as string\n );\n const overIndex = items[overContainer as keyof Items].indexOf(overId as string);\n\n if (activeIndex !== -1 && overIndex !== -1 && activeIndex !== overIndex) {\n setItems((items) => ({\n ...items,\n [overContainer as keyof Items]: arrayMove(\n items[overContainer as keyof Items],\n activeIndex,\n overIndex\n ),\n }));\n\n const content = editor.getJSON()?.content;\n\n if (Array.isArray(content)) {\n const newContent = [...content];\n const [movedItem] = newContent.splice(activeIndex, 1);\n newContent.splice(overIndex, 0, movedItem);\n\n editor.view.dispatch(\n editor.view.state.tr.replaceWith(\n 0,\n editor.view.state.doc.content.size,\n editor.state.schema.nodeFromJSON({ type: \"doc\", content: newContent })\n )\n );\n }\n }\n }\n\n if (activeContainer === \"Sidebar\" && overContainer === \"Sidebar\") {\n setTimeout(() => {\n cleanupPlaceholder();\n }, 100);\n }\n\n setLastPlaceholderIndex(null);\n setActiveId(null);\n setActiveDragType(null);\n }}\n onDragCancel={() => {\n cleanupPlaceholder();\n // Remove any placeholder nodes\n editor.commands.removeDragPlaceholder();\n onDragCancel();\n }}\n >\n <div\n className={cn(\n \"courier-flex courier-flex-1 courier-overflow-hidden\",\n previewMode && \"courier-editor-preview-mode\",\n previewMode === \"mobile\" && \"courier-editor-preview-mode-mobile\",\n !isVisible && \"courier-hidden\"\n )}\n >\n <div className=\"courier-flex courier-flex-col courier-flex-1\">\n {!isLoading && isVisible && <TextMenu editor={editor} />}\n <div className=\"courier-editor-container courier-relative\" ref={ref}>\n <div\n className={cn(\n \"courier-editor-main courier-transition-all courier-duration-300 courier-ease-in-out\",\n previewMode && \"courier-max-w-4xl courier-mx-auto\"\n )}\n >\n {isBrandApply && (\n <div\n className={cn(\n \"courier-py-5 courier-px-9 courier-pb-0 courier-relative courier-overflow-hidden courier-flex courier-flex-col courier-items-start\",\n brandSettings?.headerStyle === \"border\" && \"courier-pt-6\"\n )}\n >\n {brandSettings?.headerStyle === \"border\" && (\n <div\n className=\"courier-absolute courier-top-0 courier-left-0 courier-right-0 courier-h-2\"\n style={{ backgroundColor: brandSettings?.brandColor }}\n />\n )}\n {brandSettings?.logo && (\n <img\n src={brandSettings.logo}\n alt=\"Brand logo\"\n className=\"courier-w-auto courier-max-w-36 courier-object-contain courier-cursor-default\"\n />\n )}\n </div>\n )}\n <SortableContext items={items[\"Editor\"]} strategy={strategy}>\n <EditorContent editor={editor} onClick={handleEditorClick} />\n </SortableContext>\n {isBrandApply && (\n <div className=\"courier-py-5 courier-px-9 courier-pt-0 courier-flex courier-flex-col\">\n <BrandFooter\n readOnly\n variables={variables}\n facebookLink={brandSettings?.facebookLink}\n linkedinLink={brandSettings?.linkedinLink}\n instagramLink={brandSettings?.instagramLink}\n mediumLink={brandSettings?.mediumLink}\n xLink={brandSettings?.xLink}\n />\n </div>\n )}\n </div>\n <PreviewPanel previewMode={previewMode} togglePreviewMode={togglePreviewMode} />\n </div>\n </div>\n <div\n className={cn(\n \"courier-editor-sidebar\",\n previewMode\n ? \"courier-opacity-0 courier-pointer-events-none courier-translate-x-full courier-w-0 courier-flex-shrink-0\"\n : \"courier-opacity-100 courier-translate-x-0 courier-w-64 courier-flex-shrink-0\"\n )}\n >\n <div className=\"courier-p-4 courier-h-full\">\n {selectedNode ? (\n <SideBarItemDetails element={selectedNode} editor={editor} />\n ) : (\n <SortableContext items={items[\"Sidebar\"]} strategy={strategy}>\n <SideBar items={items[\"Sidebar\"]} brandEditor={brandEditor} />\n </SortableContext>\n )}\n </div>\n </div>\n </div>\n <DragOverlay dropAnimation={null}>\n {activeId &&\n (activeId === \"text\" ||\n activeId === \"divider\" ||\n activeId === \"spacer\" ||\n activeId === \"button\" ||\n activeId === \"image\" ||\n activeId === \"heading\") ? (\n <div\n className={cn(\n \"courier-bg-white courier-border courier-border-border courier-rounded-lg courier-p-4 courier-shadow-lg\",\n \"courier-opacity-90 courier-scale-105 courier-transition-transform\"\n )}\n >\n {activeDragType === \"heading\" && <HeadingBlock draggable />}\n {activeDragType === \"text\" && <TextBlock draggable />}\n {activeDragType === \"spacer\" && <SpacerBlock draggable />}\n {activeDragType === \"divider\" && <DividerBlock draggable />}\n {activeDragType === \"button\" && <ButtonBlock draggable />}\n {activeDragType === \"image\" && <ImageBlock draggable />}\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n </>\n );\n }\n);\n\nexport const Editor = memo(EditorComponent);\n", "// import { Button, Divider, Label, Switch } from \"@/components/ui-kit\";\nimport { Button, Divider } from \"@/components/ui-kit\";\nimport {\n ButtonBlock,\n DividerBlock,\n HeadingBlock,\n ImageBlock,\n SpacerBlock,\n TextBlock,\n} from \"@/components/ui/Blocks\";\nimport { cn } from \"@/lib\";\nimport { pageAtom } from \"@/store\";\nimport type { UniqueIdentifier } from \"@dnd-kit/core\";\n// import { useAtom, useAtomValue, useSetAtom } from \"jotai\";\nimport { useAtomValue, useSetAtom } from \"jotai\";\nimport { GripVertical } from \"lucide-react\";\n// import { brandApplyAtom, isTenantSavingAtom, tenantDataAtom } from \"../../../Providers/store\";\nimport { isTenantSavingAtom, tenantDataAtom } from \"../../../Providers/store\";\nimport { SideBarSortableItemWrapper } from \"./SideBarSortableItemWrapper\";\n\ninterface SideBarProps {\n items: UniqueIdentifier[];\n brandEditor?: boolean;\n}\n\nexport const SideBar = ({ items, brandEditor }: SideBarProps) => {\n const tenantData = useAtomValue(tenantDataAtom);\n const setPage = useSetAtom(pageAtom);\n // const [brandApply, setBrandApply] = useAtom(brandApplyAtom);\n const isTenantSaving = useAtomValue(isTenantSavingAtom);\n\n // const handleBrandApply = () => {\n // setBrandApply(!brandApply);\n // };\n\n return (\n <div className=\"courier-flex courier-flex-col courier-h-full\">\n <div className=\"courier-flex-1\">\n <p>Blocks library</p>\n <Divider className=\"courier-my-4\" />\n <div className=\"courier-flex courier-flex-col courier-gap-4 courier-w-full\">\n {items.map((item) => (\n <SideBarSortableItemWrapper key={item} id={item.toString()}>\n <div\n className={cn(\n \"courier-rounded-md courier-border courier-border-border courier-flex courier-flex-row courier-items-center courier-gap-1 courier-bg-white courier-cursor-grab courier-opacity-[0.999] courier-px-3 courier-py-2 courier-select-none\" // opacity-[0.999] is to prevent the border from being visible when the item is selected\n )}\n >\n <GripVertical\n strokeWidth={1}\n className=\"courier-w-4 courier-stroke-ring courier-fill-ring\"\n />\n {item === \"heading\" && <HeadingBlock draggable />}\n {item === \"text\" && <TextBlock draggable />}\n {item === \"image\" && <ImageBlock draggable />}\n {item === \"spacer\" && <SpacerBlock draggable />}\n {item === \"divider\" && <DividerBlock draggable />}\n {item === \"button\" && <ButtonBlock draggable />}\n </div>\n </SideBarSortableItemWrapper>\n ))}\n </div>\n </div>\n\n {brandEditor && (\n <div className=\"courier-mt-auto courier-pt-4\">\n <Divider className=\"courier-mb-4 -courier-mx-4\" />\n {tenantData?.data?.tenant?.brand ? (\n <div className=\"courier-flex courier-flex-row courier-gap-2 courier-items-center courier-justify-end courier-w-full\">\n {/* <div className=\"courier-flex courier-flex-row courier-gap-2 courier-items-center\">\n <Switch checked={brandApply} onCheckedChange={handleBrandApply} />\n <Label onClick={handleBrandApply}>Apply brand</Label>\n </div> */}\n <Button\n variant=\"link\"\n className=\"courier-underline\"\n onClick={() => setPage(\"brand\")}\n disabled={Boolean(isTenantSaving)}\n >\n Edit brand\n </Button>\n </div>\n ) : (\n <div className=\"courier-flex courier-flex-col courier-gap-2\">\n <h3 className=\"courier-text-md courier-font-medium\">Customize brand theme</h3>\n <p className=\"courier-text-sm courier-text-muted-foreground\">\n Customize header and footer to apply to the template.\n </p>\n <Button\n variant=\"primary\"\n className=\"courier-w-fit courier-mt-2\"\n onClick={() => setPage(\"brand\")}\n >\n Customize\n </Button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n", "import { cn } from \"@/lib\";\nimport type { DraggableSyntheticListeners } from \"@dnd-kit/core\";\nimport { useSortable } from \"@dnd-kit/sortable\";\nimport type { Transform } from \"@dnd-kit/utilities\";\nimport React, { forwardRef, useEffect, useState } from \"react\";\n\nexport interface SideBarSortableItemWrapperProps {\n children: React.ReactNode;\n id: string;\n className?: string;\n}\n\nfunction useMountStatus() {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n const timeout = setTimeout(() => setIsMounted(true), 500);\n\n return () => clearTimeout(timeout);\n }, []);\n\n return isMounted;\n}\n\nexport const SideBarSortableItemWrapper = ({\n children,\n id,\n className,\n}: SideBarSortableItemWrapperProps) => {\n const { setNodeRef, setActivatorNodeRef, listeners, isDragging, transform, transition } =\n useSortable({\n id,\n });\n const mounted = useMountStatus();\n const mountedWhileDragging = isDragging && !mounted;\n\n return (\n <SideBarSortableItem\n ref={setNodeRef}\n id={id}\n transition={transition}\n transform={transform}\n fadeIn={mountedWhileDragging}\n listeners={listeners}\n className={className}\n handleProps={{ ref: setActivatorNodeRef }}\n >\n {children}\n </SideBarSortableItem>\n );\n};\n\nexport interface SideBarSortableItemProps {\n children: React.ReactNode;\n id?: string;\n dragOverlay?: boolean;\n color?: string;\n disabled?: boolean;\n dragging?: boolean;\n handle?: boolean;\n handleProps?: Record<string, unknown>;\n height?: number;\n index?: number;\n fadeIn?: boolean;\n transform?: Transform | null;\n listeners?: DraggableSyntheticListeners;\n sorting?: boolean;\n style?: React.CSSProperties;\n transition?: string | null;\n wrapperStyle?: React.CSSProperties;\n className?: string;\n}\n\nexport const SideBarSortableItem = forwardRef<HTMLDivElement, SideBarSortableItemProps>(\n ({ children, className, dragOverlay, handleProps, listeners, id }, ref) => {\n useEffect(() => {\n if (!dragOverlay) {\n return;\n }\n\n document.body.style.cursor = \"grabbing\";\n\n return () => {\n document.body.style.cursor = \"\";\n };\n }, [dragOverlay]);\n\n return (\n <div\n ref={ref}\n data-cypress=\"draggable-item\"\n data-node-view-wrapper\n data-id={id}\n className={cn(className, \"courier-relative\")}\n >\n <div {...handleProps} {...listeners}>\n {children}\n </div>\n </div>\n );\n }\n);\n", "import { convertElementalToTiptap, convertTiptapToElemental } from \"@/lib\";\nimport type { ElementalContent, TiptapDoc } from \"@/types\";\nimport type { AnyExtension, Editor } from \"@tiptap/core\";\nimport { Extension } from \"@tiptap/core\";\nimport { TextSelection, type Transaction } from \"@tiptap/pm/state\";\nimport { useEditor } from \"@tiptap/react\";\nimport type { Doc as YDoc } from \"yjs\";\nimport { ExtensionKit } from \"@/components/extensions/extension-kit\";\nimport type { Node } from \"@tiptap/pm/model\";\nimport { useAtom, useAtomValue, useSetAtom } from \"jotai\";\nimport { setPendingLinkAtom } from \"@/components/ui/TextMenu/store\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { subjectAtom, templateEditorContentAtom } from \"@/components/TemplateEditor/store\";\n\ndeclare global {\n interface Window {\n editor: Editor | null;\n }\n}\n\ninterface UseBlockEditorProps {\n initialContent?: ElementalContent;\n readOnly?: boolean;\n subject?: string | null;\n variables?: Record<string, unknown>;\n ydoc: YDoc;\n onDestroy?: () => void;\n onUpdate?: () => void;\n setSelectedNode?: (node: Node | null) => void;\n}\n\nexport const useBlockEditor = ({\n initialContent = {\n version: \"2022-01-01\",\n elements: [\n {\n type: \"text\",\n align: \"left\",\n content: \"\\n\",\n text_style: \"h1\",\n },\n {\n type: \"text\",\n align: \"left\",\n content: \"\",\n },\n {\n type: \"image\",\n src: \"\",\n },\n ],\n },\n readOnly = false,\n variables,\n ydoc,\n onDestroy,\n setSelectedNode,\n}: UseBlockEditorProps) => {\n const setPendingLink = useSetAtom(setPendingLinkAtom);\n const timeoutRef = useRef<NodeJS.Timeout>();\n const [templateEditorContent, setTemplateEditorContent] = useAtom(templateEditorContentAtom);\n const subject = useAtomValue(subjectAtom);\n\n // Create an extension to handle the Escape key\n const EscapeHandlerExtension = Extension.create({\n name: \"escapeHandler\",\n addKeyboardShortcuts() {\n return {\n Escape: ({ editor }) => {\n const { state, dispatch } = editor.view;\n dispatch(\n state.tr.setSelection(TextSelection.create(state.doc, state.selection.$anchor.pos))\n );\n if (setSelectedNode) {\n setSelectedNode(null);\n }\n return false;\n },\n };\n },\n });\n\n const onCreateHandler = useCallback(() => {\n if (setSelectedNode) {\n setTimeout(() => {\n setSelectedNode(null);\n }, 100);\n }\n }, [setSelectedNode]);\n\n const onUpdateHandler = useCallback(\n ({ editor }: { editor: Editor }) => {\n const newContent = convertTiptapToElemental(editor.getJSON() as TiptapDoc, subject ?? \"\");\n if (JSON.stringify(templateEditorContent) !== JSON.stringify(newContent)) {\n setTemplateEditorContent(newContent);\n }\n },\n [templateEditorContent, subject, setTemplateEditorContent]\n );\n\n const onSelectionUpdateHandler = useCallback(\n ({ editor }: { editor: Editor }) => {\n const { selection } = editor.state;\n // Handle link and paragraph selection\n const marks = selection.$head.marks();\n const linkMark = marks.find((m) => m.type.name === \"link\");\n\n if (linkMark || editor.isActive(\"link\")) {\n setPendingLink({ mark: linkMark });\n } else {\n setPendingLink(null);\n }\n },\n [setPendingLink]\n );\n\n const onTransactionHandler = useCallback(\n ({ editor, transaction }: { editor: Editor; transaction: Transaction }) => {\n const { selection } = editor.state;\n\n const showLinkForm = transaction?.getMeta(\"showLinkForm\");\n if (showLinkForm) {\n const marks = selection.$head.marks();\n const linkMark = marks.find((m) => m.type.name === \"link\");\n setPendingLink({\n mark: linkMark,\n link: {\n from: selection.from,\n to: selection.to,\n },\n });\n }\n },\n [setPendingLink]\n );\n\n const onDestroyHandler = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n onDestroy?.();\n }, [onDestroy]);\n\n const extensions = useMemo(\n () =>\n [...ExtensionKit({ variables, setSelectedNode }), EscapeHandlerExtension].filter(\n (e): e is AnyExtension => e !== undefined\n ),\n [EscapeHandlerExtension, variables, setSelectedNode]\n );\n\n const editor = useEditor(\n {\n content: convertElementalToTiptap(initialContent),\n immediatelyRender: true,\n shouldRerenderOnTransaction: true,\n autofocus: !readOnly,\n editable: !readOnly,\n onCreate: onCreateHandler,\n onUpdate: onUpdateHandler,\n onSelectionUpdate: onSelectionUpdateHandler,\n onTransaction: onTransactionHandler,\n onDestroy: onDestroyHandler,\n extensions,\n },\n [ydoc]\n );\n\n window.editor = editor;\n\n return { editor };\n};\n", "import { useAtom, useAtomValue, useSetAtom } from \"jotai\";\nimport { forwardRef, memo, useEffect, useRef } from \"react\";\nimport { useBrandActions } from \"../Providers\";\nimport { isTenantLoadingAtom, tenantDataAtom, tenantIdAtom } from \"../Providers/store\";\nimport type { Theme } from \"../ui-kit/ThemeProvider/ThemeProvider.types\";\nimport { EditorLayout } from \"../ui/EditorLayout\";\nimport { Loader } from \"../ui/Loader\";\nimport { Editor, type EditorProps } from \"./Editor\";\nimport { BrandEditorContentAtom } from \"./store\";\n\nexport interface BrandEditorProps extends EditorProps {\n theme?: Theme | string;\n}\n\n// Track the current tenant and pending fetches globally\nlet currentTenantId: string | null = null;\nlet pendingFetch = false;\n\nconst BrandEditorComponent = forwardRef<HTMLDivElement, BrandEditorProps>(\n ({ hidePublish = false, autoSaveDebounce = 200, autoSave = true, theme, ...props }, ref) => {\n const isTenantLoading = useAtomValue(isTenantLoadingAtom);\n const isInitialLoadRef = useRef(true);\n const tenantId = useAtomValue(tenantIdAtom);\n const { getTenant } = useBrandActions();\n const [tenantData, setTenantData] = useAtom(tenantDataAtom);\n const setBrandEditorContent = useSetAtom(BrandEditorContentAtom);\n\n useEffect(() => {\n if (tenantData && tenantId !== currentTenantId) {\n setTenantData(null);\n setBrandEditorContent(null);\n isInitialLoadRef.current = false;\n }\n }, [tenantData, tenantId, setTenantData, setBrandEditorContent]);\n\n useEffect(() => {\n return () => {\n currentTenantId = null;\n pendingFetch = false;\n };\n }, []);\n\n // Simple effect with only the essential logic\n useEffect(() => {\n // Skip if no tenant or already loading\n if (!tenantId || isTenantLoading || pendingFetch) {\n return;\n }\n\n // Skip if tenant hasn't changed\n if (tenantId === currentTenantId) {\n return;\n }\n\n // Tenant has changed - update and fetch\n currentTenantId = tenantId;\n pendingFetch = true;\n\n // Make the API call\n getTenant().finally(() => {\n pendingFetch = false;\n });\n }, [tenantId, getTenant, isTenantLoading]);\n\n // Update isInitialLoadRef when loading state changes\n useEffect(() => {\n if (!isTenantLoading) {\n isInitialLoadRef.current = false;\n }\n }, [isTenantLoading]);\n\n return (\n <EditorLayout theme={theme}>\n {isTenantLoading && isInitialLoadRef.current && (\n <div className=\"courier-editor-loading\">\n <Loader />\n </div>\n )}\n <Editor\n ref={ref}\n isVisible={!isTenantLoading}\n autoSaveDebounce={autoSaveDebounce}\n autoSave={autoSave}\n hidePublish={hidePublish}\n {...props}\n />\n </EditorLayout>\n );\n }\n);\n\nexport const BrandEditor = memo(BrandEditorComponent);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["src_exports", "__export", "BrandEditor", "BrandProvider", "TemplateEditor", "TemplateProvider", "apiUrlAtom", "brandApplyAtom", "clientKeyAtom", "editorStore", "isTenantLoadingAtom", "isTenantPublishingAtom", "isTenantSavingAtom", "templateIdAtom", "tenantDataAtom", "tenantEditorAtom", "tenantErrorAtom", "tenantIdAtom", "tokenAtom", "useBrandActions", "useTemplateActions", "__toCommonJS", "import_react", "useAutoSave", "onSave", "debounceMs", "enabled", "onError", "initialContent", "isSaving", "setIsSaving", "pendingChangesRef", "previousContentRef", "lastSaveTimestampRef", "debounceTimeoutRef", "handleAutoSave", "content", "processPendingContent", "__name", "contentToSave", "contentString", "error", "timeSinceLastSave", "delay", "import_clsx", "import_tailwind_merge", "import_uuid", "parseMDContent", "content", "nodes", "textNodes", "i", "parseTextLine", "__name", "line", "processMarkdownFormatting", "applyMarks", "targetNodes", "openMarkers", "node", "marker", "_a", "_b", "m", "text", "tokens", "linkRegex", "match", "lastEnd", "processedTokens", "token", "currentPos", "markdownRegex", "segment", "segmentMatch", "matchStart", "matchText", "matchEnd", "variableName", "a", "b", "finalNodes", "textNodesSegment", "parseTextWithVariables", "variableNode", "linkNodes", "markerText", "markerType", "existingIndex", "marks", "variableRegex", "lastIndex", "beforeText", "hasLinkMark", "mark", "remainingText", "convertElementalToTiptap", "elemental", "convertNode", "_c", "headingLevel", "paddingAttrs", "verticalStr", "horizontalStr", "vertical", "horizontal", "borderAttrs", "contentNodes", "uuidv4", "channelNode", "el", "markToMD", "__name", "mark", "convertTextToMarkdown", "node", "_a", "_b", "_c", "_d", "text", "markSymbols", "linkMark", "m", "convertTiptapToElemental", "tiptap", "subject", "convertNode", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_m", "_n", "_o", "_p", "_q", "_r", "_s", "_t", "_u", "_v", "_w", "_x", "_y", "_z", "_A", "_B", "_C", "_D", "_E", "_F", "_G", "_H", "_I", "_J", "_K", "_L", "_M", "_N", "_O", "_P", "_Q", "_R", "_S", "_T", "_U", "_V", "_W", "_X", "_Y", "_Z", "__", "_$", "_aa", "_ba", "content", "nodes", "i", "textNode", "childNode", "quoteNode", "imageNode", "dividerNode", "actionNode", "channelNode", "applyMarks", "targetNodes", "openMarkers", "node", "marker", "_a", "_b", "m", "__name", "parseTextWithVariables", "text", "marks", "nodes", "variableRegex", "match", "lastIndex", "beforeText", "remainingText", "processMarkdownFormatting", "tokens", "linkRegex", "lastEnd", "processedTokens", "token", "currentPos", "markdownRegex", "segment", "segmentMatch", "matchStart", "matchText", "matchEnd", "variableName", "a", "b", "finalNodes", "textNodesSegment", "variableNode", "linkNodes", "markerText", "markerType", "existingIndex", "parseBlockContent", "markdown", "paragraphs", "paragraph", "headingMatch", "quoteContent", "imageMatch", "convertMarkdownToTiptap", "cn", "inputs", "__name", "import_jotai", "import_react", "import_sonner", "import_yjs", "import_jotai", "pageAtom", "import_jotai", "import_react", "import_jotai", "import_sonner", "import_jotai", "editorStore", "apiUrlAtom", "tokenAtom", "tenantIdAtom", "templateIdAtom", "clientKeyAtom", "tenantDataAtom", "isTenantLoadingAtom", "isTenantSavingAtom", "isTenantPublishingAtom", "tenantErrorAtom", "brandApplyAtom", "tenantEditorAtom", "saveBrandAtom", "get", "set", "settings", "_a", "apiUrl", "apiUrlAtom", "token", "tokenAtom", "tenantId", "tenantIdAtom", "tenantErrorAtom", "isTenantSavingAtom", "responseData", "error", "publishBrandAtom", "isTenantPublishingAtom", "response", "data", "import_jotai", "import_sonner", "getTenantAtom", "get", "set", "options", "_a", "_b", "_c", "apiUrl", "apiUrlAtom", "token", "tokenAtom", "tenantId", "tenantIdAtom", "templateId", "templateIdAtom", "includeBrand", "tenantErrorAtom", "isTenantLoadingAtom", "response", "data", "status", "tenantDataAtom", "error", "import_jotai", "import_sonner", "import_jotai", "subjectAtom", "templateEditorContentAtom", "saveTemplateAtom", "get", "set", "_a", "apiUrl", "apiUrlAtom", "token", "tokenAtom", "tenantId", "tenantIdAtom", "templateId", "templateIdAtom", "tenantEditor", "tenantEditorAtom", "subject", "subjectAtom", "tenantErrorAtom", "isTenantSavingAtom", "data", "convertTiptapToElemental", "responseData", "error", "publishTemplateAtom", "_b", "_c", "tenantData", "tenantDataAtom", "version", "isTenantPublishingAtom", "response", "import_jsx_runtime", "useTemplateActions", "getTenant", "getTenantAtom", "saveTemplate", "saveTemplateAtom", "publishTemplate", "publishTemplateAtom", "isTenantLoading", "isTenantLoadingAtom", "isTenantSaving", "isTenantSavingAtom", "isTenantPublishing", "isTenantPublishingAtom", "tenantError", "tenantErrorAtom", "tenantData", "tenantDataAtom", "__name", "TemplateProviderContext", "children", "templateId", "tenantId", "token", "clientKey", "apiUrl", "setApiUrl", "apiUrlAtom", "setToken", "tokenAtom", "setTenantId", "tenantIdAtom", "setId", "templateIdAtom", "setClientKey", "clientKeyAtom", "TemplateProviderComponent", "props", "editorStore", "TemplateProvider", "import_jotai", "import_react", "import_jsx_runtime", "useBrandActions", "getTenant", "getTenantAtom", "saveBrand", "saveBrandAtom", "publishBrand", "publishBrandAtom", "isTenantLoading", "isTenantLoadingAtom", "isTenantSaving", "isTenantSavingAtom", "isTenantPublishing", "isTenantPublishingAtom", "tenantError", "tenantErrorAtom", "tenantData", "tenantDataAtom", "__name", "BrandProviderContext", "children", "tenantId", "token", "clientKey", "apiUrl", "setApiUrl", "apiUrlAtom", "setToken", "tokenAtom", "setTenantId", "tenantIdAtom", "setClientKey", "clientKeyAtom", "BrandProviderComponent", "props", "editorStore", "BrandProvider", "import_core", "inputRegex", "Blockquote", "HTMLAttributes", "commands", "import_react", "import_uuid", "generateNodeIds", "editor", "nodeName", "transaction", "needsUpdate", "node", "pos", "id", "uuidv4", "__name", "import_react_slot", "import_class_variance_authority", "import_react", "import_jsx_runtime", "buttonVariants", "Button", "active", "buttonSize", "disabled", "variant", "className", "asChild", "rest", "ref", "cn", "import_react", "import_jsx_runtime", "Divider", "props", "ref", "cn", "React", "DropdownMenuPrimitive", "import_lucide_react", "import_jsx_runtime", "DropdownMenu", "DropdownMenuTrigger", "DropdownMenuSubTrigger", "className", "inset", "children", "props", "ref", "cn", "DropdownMenuSubContent", "DropdownMenuContent", "sideOffset", "portalProps", "DropdownMenuItem", "DropdownMenuCheckboxItem", "checked", "DropdownMenuRadioItem", "DropdownMenuLabel", "DropdownMenuSeparator", "DropdownMenuShortcut", "__name", "import_react_slot", "React", "import_react_hook_form", "LabelPrimitive", "import_class_variance_authority", "React", "import_jsx_runtime", "labelVariants", "Label", "className", "props", "ref", "cn", "import_jsx_runtime", "Form", "FormFieldContext", "FormField", "__name", "props", "useFormField", "fieldContext", "itemContext", "FormItemContext", "getFieldState", "formState", "fieldState", "id", "FormItem", "className", "ref", "cn", "FormLabel", "error", "formItemId", "Label", "FormControl", "formDescriptionId", "formMessageId", "FormDescription", "FormMessage", "children", "body", "React", "import_jsx_runtime", "Input", "className", "type", "startAdornment", "endAdornment", "props", "ref", "cn", "import_react", "import_react", "import_lucide_react", "import_jsx_runtime", "isValidHex", "__name", "color", "ColorPicker", "onChange", "className", "presetColors", "defaultValue", "hsv", "setHsv", "hexToHsv", "inputValue", "setInputValue", "gradientRef", "hueRef", "isDragging", "isInternalChange", "showReset", "updateColor", "newHsv", "newColor", "hsvToHex", "handleMouseDown", "type", "e", "handleMouseMove", "rect", "x", "y", "handleMouseUp", "handleInputChange", "value", "cn", "Input", "event", "Divider", "presetColor", "TRANSPARENT_PATTERN", "hex", "r", "g", "b", "max", "min", "d", "h", "s", "v", "f", "n", "k", "PopoverPrimitive", "React", "import_jsx_runtime", "Popover", "PopoverTrigger", "PopoverContent", "className", "align", "sideOffset", "portalProps", "props", "ref", "cn", "import_jsx_runtime", "TRANSPARENT_PATTERN", "DEFAULT_PRESET_COLORS", "InputColor", "className", "value", "onChange", "defaultValue", "transparent", "presetColors", "props", "ref", "showPreview", "containerRef", "filteredPresetColors", "color", "Popover", "PopoverTrigger", "cn", "Input", "PopoverContent", "ColorPicker", "React", "SliderPrimitive", "import_jsx_runtime", "Slider", "className", "props", "ref", "cn", "React", "SwitchPrimitives", "import_jsx_runtime", "Switch", "className", "props", "ref", "cn", "React", "TabsPrimitive", "import_jsx_runtime", "Tabs", "TabsList", "className", "props", "ref", "cn", "TabsTrigger", "TabsContent", "React", "import_jsx_runtime", "Textarea", "className", "autoResize", "props", "ref", "textareaRef", "combinedRef", "__name", "node", "textarea", "adjustHeight", "cn", "import_react", "import_react", "defaultTheme", "ThemeContext", "defaultTheme", "import_jsx_runtime", "ThemeProvider", "__name", "children", "theme", "defaultTheme", "themeContextProps", "cssVars", "acc", "key", "value", "kebabCase", "letter", "ThemeContext", "cn", "React", "TogglePrimitive", "import_class_variance_authority", "import_jsx_runtime", "toggleVariants", "Toggle", "className", "variant", "size", "props", "ref", "cn", "ToggleGroupPrimitive", "React", "import_jsx_runtime", "ToggleGroupContext", "ToggleGroup", "className", "variant", "size", "children", "props", "ref", "cn", "ToggleGroupItem", "context", "toggleVariants", "import_jsx_runtime", "Path", "__name", "colorProp", "color", "active", "className", "props", "cn", "Icon", "width", "height", "import_jsx_runtime", "BinIcon", "__name", "color", "width", "height", "props", "Icon", "import_jsx_runtime", "BorderRadiusIcon", "__name", "color", "active", "width", "height", "props", "Icon", "Path", "import_jsx_runtime", "BorderWidthIcon", "__name", "color", "width", "height", "props", "Icon", "import_jsx_runtime", "DesktopIcon", "__name", "color", "width", "height", "props", "Icon", "import_jsx_runtime", "DuplicateIcon", "__name", "color", "width", "height", "props", "Icon", "import_jsx_runtime", "FacebookIcon", "__name", "color", "active", "width", "height", "props", "Icon", "Path", "import_jsx_runtime", "InstagramIcon", "__name", "color", "active", "width", "height", "props", "Icon", "Path", "import_jsx_runtime", "LinkedinIcon", "__name", "color", "active", "width", "height", "props", "Icon", "Path", "import_jsx_runtime", "MediumIcon", "__name", "color", "active", "width", "height", "props", "Icon", "Path", "import_jsx_runtime", "MobileIcon", "__name", "color", "width", "height", "props", "Icon", "import_jsx_runtime", "PaddingHorizontalIcon", "__name", "color", "active", "width", "height", "props", "Icon", "Path", "import_jsx_runtime", "PaddingVerticalIcon", "__name", "color", "active", "width", "height", "props", "Icon", "Path", "import_jsx_runtime", "RemoveFormattingIcon", "__name", "color", "width", "height", "props", "Icon", "import_jsx_runtime", "XIcon", "__name", "color", "active", "width", "height", "props", "Icon", "Path", "import_sortable", "import_react", "import_jotai", "import_uuid", "import_extension_color", "Dropcursor", "import_extension_hard_break", "History", "state", "dispatch", "import_extension_placeholder", "import_extension_text_align", "import_extension_typography", "import_extension_underline", "import_starter_kit", "import_core", "import_react", "import_jotai", "import_react", "import_jotai", "defaultTextMenuConfig", "getTextMenuConfigForNode", "__name", "nodeName", "defaultGlobalConfig", "defaultTextMenuConfig", "textMenuConfigAtom", "selectedNodeAtom", "setSelectedNodeAtom", "_", "set", "node", "textInputRefAtom", "lastActiveInputRefAtom", "textInputStateAtom", "getNodeConfigAtom", "get", "nodeName", "globalConfig", "textInputState", "config", "setNodeConfigAtom", "key", "value", "resetNodeConfigAtom", "rest", "setTextInputRefAtom", "ref", "caretPosition", "setShowVariablePopupAtom", "showVariablePopup", "currentState", "pendingLinkAtom", "setPendingLinkAtom", "import_jsx_runtime", "ButtonComponent", "__name", "label", "alignment", "size", "backgroundColor", "textColor", "borderWidth", "borderRadius", "borderColor", "padding", "fontWeight", "fontStyle", "isUnderline", "isStrike", "cn", "ButtonComponentNode", "props", "setSelectedNode", "setSelectedNodeAtom", "handleSelect", "pos", "node", "nodeId", "currentNode", "SortableItemWrapper", "import_uuid", "defaultButtonProps", "Button", "generateNodeIds", "element", "attributes", "uuidv4", "HTMLAttributes", "ButtonComponentNode", "editor", "chain", "selection", "node", "newFontWeight", "newFontStyle", "newIsUnderline", "newIsStrike", "import_zod", "buttonSchema", "import_zod", "import_react_hook_form", "import_react", "useNodeAttributes", "__name", "editor", "element", "form", "nodeType", "currentNodeRef", "currentNodePosRef", "updateCurrentNode", "foundPos", "node", "pos", "key", "value", "attrs", "tr", "updatedAttrs", "import_jotai", "import_jsx_runtime", "BlockBase", "__name", "draggable", "icon", "draggableLabel", "label", "cn", "import_lucide_react", "import_jsx_runtime", "BlockquoteBlock", "__name", "draggable", "BlockBase", "import_jsx_runtime", "ButtonBlockIcon", "__name", "ButtonBlock", "draggable", "BlockBase", "import_jsx_runtime", "DividerBlockIcon", "__name", "DividerBlock", "draggable", "BlockBase", "import_jsx_runtime", "HeadingBlockIcon", "__name", "HeadingBlock", "draggable", "BlockBase", "import_jsx_runtime", "ImageBlockIcon", "__name", "ImageBlock", "draggable", "BlockBase", "import_lucide_react", "import_jsx_runtime", "SpacerBlock", "__name", "draggable", "BlockBase", "import_jsx_runtime", "TextBlockIcon", "__name", "TextBlock", "draggable", "BlockBase", "import_jsx_runtime", "FormHeader", "__name", "type", "setSelectedNode", "setSelectedNodeAtom", "Button", "HeadingBlock", "TextBlock", "ImageBlock", "SpacerBlock", "DividerBlock", "ButtonBlock", "BlockquoteBlock", "Divider", "import_jotai", "React", "import_react", "import_jsx_runtime", "VariableSuggestions", "__name", "items", "command", "selected", "item", "index", "cn", "import_jsx_runtime", "TextInput", "as", "variables", "autoResize", "onChange", "props", "ref", "showSuggestions", "setShowSuggestions", "cursorPosition", "setCursorPosition", "selectedIndex", "setSelectedIndex", "containerRef", "inputRef", "setTextInputState", "textInputStateAtom", "setTextInputRef", "setTextInputRefAtom", "setLastActiveInputRef", "lastActiveInputRefAtom", "handleFocus", "data", "state", "handleBlur", "e", "_a", "_b", "isToSuggestions", "isToVariableButton", "handleSelect", "__name", "target", "handleKeyDown", "prev", "insertVariable", "variable", "element", "value", "selectionStart", "beforeCursor", "afterCursor", "newValue", "newCursorPosition", "event", "handleChange", "textBeforeCursor", "tempSpan", "textWidth", "lineHeight", "lines", "handleInput", "handleShowSuggestions", "inputProps", "node", "Input", "VariableSuggestions", "textareaProps", "Textarea", "getFlattenedVariables", "__name", "variables", "prefix", "acc", "key", "value", "newKey", "import_jsx_runtime", "DEFAULT_COLOR", "DEFAULT_SIZE", "ButtonAlignLeftIcon", "__name", "color", "width", "height", "props", "Icon", "ButtonAlignCenterIcon", "ButtonAlignRightIcon", "ButtonSizeDefaultIcon", "ButtonSizeFullIcon", "import_jsx_runtime", "ButtonForm", "__name", "element", "editor", "_a", "_b", "form", "buttonSchema", "defaultButtonProps", "updateNodeAttributes", "useNodeAttributes", "variables", "ext", "variableKeys", "getFlattenedVariables", "Form", "FormHeader", "FormField", "field", "FormItem", "FormControl", "TextInput", "e", "FormMessage", "Divider", "InputColor", "value", "Input", "ToggleGroup", "ToggleGroupItem", "ButtonAlignLeftIcon", "ButtonAlignCenterIcon", "ButtonAlignRightIcon", "ButtonSizeDefaultIcon", "ButtonSizeFullIcon", "BorderWidthIcon", "BorderRadiusIcon", "import_core", "HorizontalRule", "HTMLAttributes", "chain", "state", "selection", "$originFrom", "$originTo", "currentChain", "tr", "dispatch", "$to", "posAfter", "node", "_a", "import_react", "import_uuid", "import_jotai", "import_react", "import_jsx_runtime", "DividerComponent", "__name", "padding", "color", "size", "radius", "variant", "DividerComponentNode", "props", "setSelectedNode", "setSelectedNodeAtom", "handleSelect", "pos", "node", "SortableItemWrapper", "cn", "defaultDividerProps", "defaultSpacerProps", "Divider", "HorizontalRule", "generateNodeIds", "element", "attributes", "uuidv4", "HTMLAttributes", "DividerComponentNode", "import_zod", "dividerSchema", "import_zod", "import_react_hook_form", "import_jsx_runtime", "DividerForm", "__name", "element", "editor", "form", "dividerSchema", "defaultDividerProps", "updateNodeAttributes", "useNodeAttributes", "variant", "Form", "FormHeader", "FormField", "field", "FormItem", "FormControl", "Input", "PaddingVerticalIcon", "e", "FormMessage", "Divider", "BorderWidthIcon", "InputColor", "value", "Document", "Document", "import_core", "import_react", "import_sortable", "import_react", "import_jsx_runtime", "useMountStatus", "isMounted", "setIsMounted", "timeout", "__name", "SortablePlaceholder", "children", "className", "dragOverlay", "id", "ref", "cn", "DragPlaceholderComponent", "node", "type", "setNodeRef", "setActivatorNodeRef", "listeners", "isDragging", "transform", "transition", "mounted", "DragPlaceholder", "element", "attributes", "HTMLAttributes", "options", "tr", "dispatch", "node", "state", "hasDeleted", "pos", "DragPlaceholderComponent", "import_core", "import_state", "FileHandlerPlugin", "FileHandler", "allowedMimeTypes", "onDrop", "onPaste", "view", "event", "_", "moved", "_a", "files", "coordinates", "filteredFiles", "file", "FileHandler_default", "import_core", "Heading", "level", "node", "HTMLAttributes", "attributes", "commands", "items", "import_zod", "textBlockSchema", "defaultTextBlockProps", "import_react", "import_jotai", "import_jsx_runtime", "TextBlockComponent", "__name", "paddingVertical", "paddingHorizontal", "textAlign", "backgroundColor", "borderWidth", "borderRadius", "borderColor", "textColor", "level", "type", "tag", "cn", "TextBlockComponentNode", "props", "setSelectedNode", "setSelectedNodeAtom", "handleSelect", "pos", "node", "isEmpty", "SortableItemWrapper", "import_zod", "import_react_hook_form", "import_jsx_runtime", "TextBlockForm", "__name", "element", "editor", "form", "textBlockSchema", "defaultTextBlockProps", "updateNodeAttributes", "useNodeAttributes", "Form", "FormHeader", "FormField", "field", "FormItem", "FormControl", "Input", "PaddingHorizontalIcon", "FormMessage", "PaddingVerticalIcon", "InputColor", "value", "Divider", "BorderWidthIcon", "BorderRadiusIcon", "import_react", "Heading", "_a", "generateNodeIds", "defaultTextBlockProps", "element", "attributes", "alignment", "chain", "node", "HTMLAttributes", "nodeLevel", "TextBlockComponentNode", "import_core", "import_react", "uploadImage", "__name", "file", "config", "apiUrl", "token", "clientKey", "fileExtension", "randomFilename", "base64Data", "resolve", "reject", "reader", "result", "error", "import_jotai", "import_react", "import_sonner", "import_jsx_runtime", "Loader", "__name", "className", "cn", "import_jsx_runtime", "ImageBlockComponent", "__name", "sourcePath", "alt", "alignment", "borderWidth", "borderRadius", "borderColor", "isUploading", "width", "imageNaturalWidth", "onFileSelect", "editor", "isDragging", "setIsDragging", "isImageLoading", "setIsImageLoading", "fileInputRef", "imgRef", "img", "pos", "calculateWidthPercentage", "naturalWidth", "_a", "_b", "editorContainer", "containerWidth", "percentage", "originalWidthPercentage", "handleDragOver", "e", "item", "handleDragLeave", "handleDragEnter", "handleDrop", "imageFile", "file", "handleFileSelect", "handleBrowseClick", "cn", "Loader", "error", "ImageBlockView", "props", "setSelectedNode", "setSelectedNodeAtom", "apiUrl", "apiUrlAtom", "token", "tokenAtom", "tenantId", "tenantIdAtom", "clientKey", "clientKeyAtom", "_c", "node", "widthPercentage", "handleSelect", "reader", "resolve", "reject", "imageUrl", "uploadImage", "errorMessage", "errorText", "SortableItemWrapper", "defaultImageProps", "ImageBlock", "generateNodeIds", "_a", "element", "attributes", "HTMLAttributes", "ImageBlockView", "props", "chain", "pos", "src", "alignment", "commands", "width", "file", "reader", "import_zod", "imageBlockSchema", "import_zod", "import_lucide_react", "import_react", "import_react_hook_form", "import_sonner", "import_jotai", "import_jsx_runtime", "ImageBlockForm", "__name", "element", "editor", "_a", "_b", "_c", "_d", "fileInputRef", "containerRef", "rawWidthInput", "setRawWidthInput", "isEditing", "setIsEditing", "imageNaturalWidth", "setImageNaturalWidth", "isUploading", "setIsUploading", "apiUrl", "apiUrlAtom", "token", "tokenAtom", "tenantId", "tenantIdAtom", "clientKey", "clientKeyAtom", "form", "imageBlockSchema", "defaultImageProps", "updateNodeAttributes", "useNodeAttributes", "sourcePath", "img", "updatedValues", "calculateWidthPercentage", "naturalWidth", "editorContainer", "containerWidth", "percentage", "handleUploadClick", "e", "handleImageLoad", "calculatedWidth", "handleSourcePathChange", "value", "widthPercentage", "variables", "ext", "variableKeys", "getFlattenedVariables", "Form", "FormHeader", "values", "Tabs", "TabsList", "TabsTrigger", "TabsContent", "Button", "file", "reader", "imageUrl", "uploadImage", "error", "FormField", "field", "FormItem", "FormControl", "TextInput", "FormMessage", "Divider", "currentWidth", "originalWidth", "isOriginalWidth", "currentValue", "ToggleGroup", "newWidth", "ToggleGroupItem", "Input", "clampedValue", "Slider", "ButtonAlignLeftIcon", "ButtonAlignCenterIcon", "ButtonAlignRightIcon", "BorderWidthIcon", "BorderRadiusIcon", "InputColor", "import_core", "import_extension_link", "import_state", "Link", "TiptapLink", "_a", "HTMLAttributes", "href", "view", "pos", "event", "state", "doc", "$pos", "linkMark", "mark", "range", "transactions", "_", "newState", "tr", "modified", "node", "newHref", "import_zod", "import_jotai", "import_react", "import_react_hook_form", "import_jsx_runtime", "linkSchema", "LinkForm", "__name", "editor", "mark", "pendingLink", "_a", "_b", "setPendingLink", "setPendingLinkAtom", "textareaRef", "form", "variables", "ext", "variableKeys", "getFlattenedVariables", "updateLink", "values", "url", "Form", "FormField", "field", "FormItem", "FormLabel", "FormControl", "TextInput", "element", "e", "FormMessage", "Paragraph", "HTMLAttributes", "commands", "import_react", "import_prosemirror_state", "base", "shift", "mac", "ie", "i", "code", "keyName", "event", "ignoreKey", "name", "__name", "import_prosemirror_state", "mac", "normalizeKeyName", "name", "parts", "result", "alt", "ctrl", "shift", "meta", "i", "mod", "__name", "normalize", "map", "copy", "prop", "modifiers", "event", "keymap", "bindings", "keydownHandler", "view", "keyName", "baseName", "direct", "noShift", "base", "fromCode", "import_uuid", "Paragraph", "_a", "generateNodeIds", "tr", "needsUpdate", "node", "pos", "id", "uuidv4", "defaultTextBlockProps", "element", "attributes", "HTMLAttributes", "TextBlockComponentNode", "keymap", "selection", "$from", "depth", "currentNode", "start", "end", "handleDeletion", "__name", "editor", "isBackspace", "empty", "$anchor", "$head", "isAtBoundary", "isEmpty", "dispatch", "state", "alignment", "chain", "import_core", "import_state", "SelectionPlugin", "Selection", "attributes", "node", "tr", "dispatch", "nodeItem", "pos", "_a", "view", "_", "event", "state", "selection", "caretElement", "tag", "caretPos", "$pos", "caretNode", "error", "target", "targetPos", "targetNode", "top", "bottom", "right", "left", "auto", "basePlacements", "start", "end", "clippingParents", "viewport", "popper", "reference", "variationPlacements", "acc", "placement", "placements", "beforeRead", "read", "afterRead", "beforeMain", "main", "afterMain", "beforeWrite", "write", "afterWrite", "modifierPhases", "getNodeName", "element", "__name", "getWindow", "node", "ownerDocument", "__name", "isElement", "node", "OwnElement", "getWindow", "__name", "isHTMLElement", "isShadowRoot", "applyStyles", "_ref", "state", "name", "style", "attributes", "element", "isHTMLElement", "getNodeName", "value", "__name", "effect", "_ref2", "initialStyles", "styleProperties", "property", "attribute", "applyStyles_default", "getBasePlacement", "placement", "__name", "max", "min", "round", "getUAString", "uaData", "item", "__name", "isLayoutViewport", "getUAString", "__name", "getBoundingClientRect", "element", "includeScale", "isFixedStrategy", "clientRect", "scaleX", "scaleY", "isHTMLElement", "round", "_ref", "isElement", "getWindow", "visualViewport", "addVisualOffsets", "isLayoutViewport", "x", "y", "width", "height", "__name", "getLayoutRect", "element", "clientRect", "getBoundingClientRect", "width", "height", "__name", "contains", "parent", "child", "rootNode", "isShadowRoot", "next", "__name", "getComputedStyle", "element", "getWindow", "__name", "isTableElement", "element", "getNodeName", "__name", "getDocumentElement", "element", "isElement", "__name", "getParentNode", "element", "getNodeName", "isShadowRoot", "getDocumentElement", "__name", "getTrueOffsetParent", "element", "isHTMLElement", "getComputedStyle", "__name", "getContainingBlock", "isFirefox", "getUAString", "isIE", "elementCss", "currentNode", "getParentNode", "isShadowRoot", "getNodeName", "css", "getOffsetParent", "window", "getWindow", "offsetParent", "isTableElement", "getMainAxisFromPlacement", "placement", "__name", "within", "min", "value", "max", "__name", "withinMaxClamp", "v", "getFreshSideObject", "__name", "mergePaddingObject", "paddingObject", "getFreshSideObject", "__name", "expandToHashMap", "value", "keys", "hashMap", "key", "__name", "toPaddingObject", "__name", "padding", "state", "mergePaddingObject", "expandToHashMap", "basePlacements", "arrow", "_ref", "_state$modifiersData$", "name", "options", "arrowElement", "popperOffsets", "basePlacement", "getBasePlacement", "axis", "getMainAxisFromPlacement", "isVertical", "left", "right", "len", "paddingObject", "arrowRect", "getLayoutRect", "minProp", "top", "maxProp", "bottom", "endDiff", "startDiff", "arrowOffsetParent", "getOffsetParent", "clientSize", "centerToReference", "min", "max", "center", "offset", "within", "axisProp", "effect", "_ref2", "_options$element", "contains", "arrow_default", "getVariation", "placement", "__name", "unsetSides", "roundOffsetsByDPR", "_ref", "win", "x", "y", "dpr", "round", "__name", "mapToStyles", "_ref2", "_Object$assign2", "popper", "popperRect", "placement", "variation", "offsets", "position", "gpuAcceleration", "adaptive", "roundOffsets", "isFixed", "_offsets$x", "_offsets$y", "_ref3", "hasX", "hasY", "sideX", "left", "sideY", "top", "offsetParent", "getOffsetParent", "heightProp", "widthProp", "getWindow", "getDocumentElement", "getComputedStyle", "right", "end", "bottom", "offsetY", "offsetX", "commonStyles", "_ref4", "_Object$assign", "computeStyles", "_ref5", "state", "options", "_options$gpuAccelerat", "_options$adaptive", "_options$roundOffsets", "getBasePlacement", "getVariation", "computeStyles_default", "passive", "effect", "_ref", "state", "instance", "options", "_options$scroll", "scroll", "_options$resize", "resize", "window", "getWindow", "scrollParents", "scrollParent", "__name", "eventListeners_default", "hash", "getOppositePlacement", "placement", "matched", "__name", "hash", "getOppositeVariationPlacement", "placement", "matched", "__name", "getWindowScroll", "node", "win", "getWindow", "scrollLeft", "scrollTop", "__name", "getWindowScrollBarX", "element", "getBoundingClientRect", "getDocumentElement", "getWindowScroll", "__name", "getViewportRect", "element", "strategy", "win", "getWindow", "html", "getDocumentElement", "visualViewport", "width", "height", "x", "y", "layoutViewport", "isLayoutViewport", "getWindowScrollBarX", "__name", "getDocumentRect", "element", "_element$ownerDocumen", "html", "getDocumentElement", "winScroll", "getWindowScroll", "body", "width", "max", "height", "x", "getWindowScrollBarX", "y", "getComputedStyle", "__name", "isScrollParent", "element", "_getComputedStyle", "getComputedStyle", "overflow", "overflowX", "overflowY", "__name", "getScrollParent", "node", "getNodeName", "isHTMLElement", "isScrollParent", "getParentNode", "__name", "listScrollParents", "element", "list", "_element$ownerDocumen", "scrollParent", "getScrollParent", "isBody", "win", "getWindow", "target", "isScrollParent", "updatedList", "getParentNode", "__name", "rectToClientRect", "rect", "__name", "getInnerBoundingClientRect", "element", "strategy", "rect", "getBoundingClientRect", "__name", "getClientRectFromMixedType", "clippingParent", "viewport", "rectToClientRect", "getViewportRect", "isElement", "getDocumentRect", "getDocumentElement", "getClippingParents", "clippingParents", "listScrollParents", "getParentNode", "canEscapeClipping", "getComputedStyle", "clipperElement", "isHTMLElement", "getOffsetParent", "contains", "getNodeName", "getClippingRect", "boundary", "rootBoundary", "mainClippingParents", "firstClippingParent", "clippingRect", "accRect", "max", "min", "computeOffsets", "_ref", "reference", "element", "placement", "basePlacement", "getBasePlacement", "variation", "getVariation", "commonX", "commonY", "offsets", "top", "bottom", "right", "left", "mainAxis", "getMainAxisFromPlacement", "len", "start", "end", "__name", "detectOverflow", "state", "options", "_options", "_options$placement", "placement", "_options$strategy", "strategy", "_options$boundary", "boundary", "clippingParents", "_options$rootBoundary", "rootBoundary", "viewport", "_options$elementConte", "elementContext", "popper", "_options$altBoundary", "altBoundary", "_options$padding", "padding", "paddingObject", "mergePaddingObject", "expandToHashMap", "basePlacements", "altContext", "reference", "popperRect", "element", "clippingClientRect", "getClippingRect", "isElement", "getDocumentElement", "referenceClientRect", "getBoundingClientRect", "popperOffsets", "computeOffsets", "popperClientRect", "rectToClientRect", "elementClientRect", "overflowOffsets", "offsetData", "offset", "key", "multiply", "right", "bottom", "axis", "top", "__name", "computeAutoPlacement", "state", "options", "_options", "placement", "boundary", "rootBoundary", "padding", "flipVariations", "_options$allowedAutoP", "allowedAutoPlacements", "placements", "variation", "getVariation", "variationPlacements", "basePlacements", "allowedPlacements", "overflows", "acc", "detectOverflow", "getBasePlacement", "a", "b", "__name", "getExpandedFallbackPlacements", "placement", "getBasePlacement", "auto", "oppositePlacement", "getOppositePlacement", "getOppositeVariationPlacement", "__name", "flip", "_ref", "state", "options", "name", "_options$mainAxis", "checkMainAxis", "_options$altAxis", "checkAltAxis", "specifiedFallbackPlacements", "padding", "boundary", "rootBoundary", "altBoundary", "_options$flipVariatio", "flipVariations", "allowedAutoPlacements", "preferredPlacement", "basePlacement", "isBasePlacement", "fallbackPlacements", "placements", "acc", "computeAutoPlacement", "referenceRect", "popperRect", "checksMap", "makeFallbackChecks", "firstFittingPlacement", "i", "_basePlacement", "isStartVariation", "getVariation", "start", "isVertical", "top", "bottom", "len", "overflow", "detectOverflow", "mainVariationSide", "right", "left", "altVariationSide", "checks", "check", "numberOfChecks", "_loop", "_i", "fittingPlacement", "_ret", "flip_default", "getSideOffsets", "overflow", "rect", "preventedOffsets", "__name", "isAnySideFullyClipped", "top", "right", "bottom", "left", "side", "hide", "_ref", "state", "name", "referenceRect", "popperRect", "referenceOverflow", "detectOverflow", "popperAltOverflow", "referenceClippingOffsets", "popperEscapeOffsets", "isReferenceHidden", "hasPopperEscaped", "hide_default", "distanceAndSkiddingToXY", "placement", "rects", "offset", "basePlacement", "getBasePlacement", "invertDistance", "left", "top", "_ref", "skidding", "distance", "right", "__name", "_ref2", "state", "options", "name", "_options$offset", "data", "placements", "acc", "_data$state$placement", "x", "y", "offset_default", "popperOffsets", "_ref", "state", "name", "computeOffsets", "__name", "popperOffsets_default", "getAltAxis", "axis", "__name", "preventOverflow", "_ref", "state", "options", "name", "_options$mainAxis", "checkMainAxis", "_options$altAxis", "checkAltAxis", "boundary", "rootBoundary", "altBoundary", "padding", "_options$tether", "tether", "_options$tetherOffset", "tetherOffset", "overflow", "detectOverflow", "basePlacement", "getBasePlacement", "variation", "getVariation", "isBasePlacement", "mainAxis", "getMainAxisFromPlacement", "altAxis", "getAltAxis", "popperOffsets", "referenceRect", "popperRect", "tetherOffsetValue", "normalizedTetherOffsetValue", "offsetModifierState", "data", "_offsetModifierState$", "mainSide", "top", "left", "altSide", "bottom", "right", "len", "offset", "min", "max", "additive", "minLen", "start", "maxLen", "arrowElement", "arrowRect", "getLayoutRect", "arrowPaddingObject", "getFreshSideObject", "arrowPaddingMin", "arrowPaddingMax", "arrowLen", "within", "minOffset", "maxOffset", "arrowOffsetParent", "getOffsetParent", "clientOffset", "offsetModifierValue", "tetherMin", "tetherMax", "preventedOffset", "_offsetModifierState$2", "_mainSide", "_altSide", "_offset", "_len", "_min", "_max", "isOriginSide", "_offsetModifierValue", "_tetherMin", "_tetherMax", "_preventedOffset", "withinMaxClamp", "__name", "preventOverflow_default", "getHTMLElementScroll", "element", "__name", "getNodeScroll", "node", "getWindow", "isHTMLElement", "getWindowScroll", "getHTMLElementScroll", "__name", "isElementScaled", "element", "rect", "scaleX", "round", "scaleY", "__name", "getCompositeRect", "elementOrVirtualElement", "offsetParent", "isFixed", "isOffsetParentAnElement", "isHTMLElement", "offsetParentIsScaled", "documentElement", "getDocumentElement", "getBoundingClientRect", "scroll", "offsets", "getNodeName", "isScrollParent", "getNodeScroll", "getWindowScrollBarX", "order", "modifiers", "map", "visited", "result", "modifier", "sort", "requires", "dep", "depModifier", "__name", "orderModifiers", "orderedModifiers", "modifierPhases", "acc", "phase", "debounce", "fn", "pending", "resolve", "__name", "mergeByName", "modifiers", "merged", "current", "existing", "key", "__name", "DEFAULT_OPTIONS", "areValidElements", "_len", "args", "_key", "element", "__name", "popperGenerator", "generatorOptions", "_generatorOptions", "_generatorOptions$def", "defaultModifiers", "_generatorOptions$def2", "defaultOptions", "reference", "popper", "options", "state", "effectCleanupFns", "isDestroyed", "instance", "setOptionsAction", "cleanupModifierEffects", "isElement", "listScrollParents", "orderedModifiers", "orderModifiers", "mergeByName", "m", "runModifierEffects", "_state$elements", "getCompositeRect", "getOffsetParent", "getLayoutRect", "modifier", "index", "_state$orderedModifie", "fn", "_state$orderedModifie2", "_options", "name", "debounce", "resolve", "_ref", "_ref$options", "effect", "cleanupFn", "noopFn", "defaultModifiers", "eventListeners_default", "popperOffsets_default", "computeStyles_default", "applyStyles_default", "offset_default", "flip_default", "preventOverflow_default", "arrow_default", "hide_default", "createPopper", "popperGenerator", "BOX_CLASS", "CONTENT_CLASS", "BACKDROP_CLASS", "ARROW_CLASS", "SVG_ARROW_CLASS", "TOUCH_OPTIONS", "passive", "capture", "TIPPY_DEFAULT_APPEND_TO", "__name", "document", "body", "getValueAtIndexOrReturn", "value", "index", "defaultValue", "Array", "isArray", "v", "isType", "type", "str", "toString", "call", "indexOf", "invokeWithArgsOrReturn", "args", "debounce", "fn", "ms", "timeout", "arg", "clearTimeout", "setTimeout", "splitBySpaces", "value", "split", "filter", "Boolean", "normalizeToArray", "concat", "pushIfUnique", "arr", "indexOf", "push", "unique", "item", "index", "getBasePlacement", "placement", "arrayFrom", "slice", "call", "removeUndefinedProps", "obj", "Object", "keys", "reduce", "acc", "key", "undefined", "div", "document", "createElement", "isElement", "some", "type", "isType", "isNodeList", "isMouseEvent", "isReferenceElement", "_tippy", "reference", "getArrayOfElements", "Array", "isArray", "querySelectorAll", "setTransitionDuration", "els", "forEach", "el", "style", "transitionDuration", "setVisibilityState", "state", "setAttribute", "getOwnerDocument", "elementOrElements", "_element$ownerDocumen", "_normalizeToArray", "element", "ownerDocument", "body", "isCursorOutsideInteractiveBorder", "popperTreeData", "event", "clientX", "clientY", "every", "_ref", "popperRect", "popperState", "props", "interactiveBorder", "basePlacement", "offsetData", "modifiersData", "offset", "topDistance", "top", "y", "bottomDistance", "bottom", "leftDistance", "left", "x", "rightDistance", "right", "exceedsTop", "exceedsBottom", "exceedsLeft", "exceedsRight", "updateTransitionEndListener", "box", "action", "listener", "method", "actualContains", "parent", "child", "target", "_target$getRootNode", "contains", "getRootNode", "host", "currentInput", "isTouch", "lastMouseMoveTime", "onDocumentTouchStart", "window", "performance", "addEventListener", "onDocumentMouseMove", "now", "removeEventListener", "onWindowBlur", "activeElement", "instance", "blur", "isVisible", "bindGlobalEventListeners", "TOUCH_OPTIONS", "isBrowser", "isIE11", "msCrypto", "pluginProps", "animateFill", "followCursor", "inlinePositioning", "sticky", "renderProps", "allowHTML", "animation", "arrow", "content", "inertia", "maxWidth", "role", "theme", "zIndex", "defaultProps", "appendTo", "TIPPY_DEFAULT_APPEND_TO", "aria", "expanded", "delay", "duration", "getReferenceClientRect", "hideOnClick", "ignoreAttributes", "interactive", "interactiveBorder", "interactiveDebounce", "moveTransition", "offset", "onAfterUpdate", "__name", "onBeforeUpdate", "onCreate", "onDestroy", "onHidden", "onHide", "onMount", "onShow", "onShown", "onTrigger", "onUntrigger", "onClickOutside", "placement", "plugins", "popperOptions", "render", "showOnCreate", "touch", "trigger", "triggerTarget", "defaultKeys", "Object", "keys", "setDefaultProps", "partialProps", "forEach", "key", "getExtendedPassedProps", "passedProps", "reduce", "acc", "plugin", "name", "defaultValue", "_name", "undefined", "getDataAttributeProps", "reference", "propKeys", "props", "valueAsString", "getAttribute", "trim", "JSON", "parse", "evaluateProps", "out", "invokeWithArgsOrReturn", "innerHTML", "__name", "dangerouslySetInnerHTML", "element", "html", "createArrowElement", "value", "arrow", "div", "className", "ARROW_CLASS", "SVG_ARROW_CLASS", "isElement", "appendChild", "setContent", "content", "props", "allowHTML", "textContent", "getChildren", "popper", "box", "firstElementChild", "boxChildren", "arrayFrom", "children", "find", "node", "classList", "contains", "CONTENT_CLASS", "backdrop", "BACKDROP_CLASS", "render", "instance", "BOX_CLASS", "setAttribute", "onUpdate", "prevProps", "nextProps", "_getChildren", "theme", "removeAttribute", "animation", "inertia", "style", "maxWidth", "role", "removeChild", "$$tippy", "idCounter", "mouseMoveListeners", "mountedInstances", "createTippy", "reference", "passedProps", "evaluateProps", "defaultProps", "getExtendedPassedProps", "removeUndefinedProps", "showTimeout", "hideTimeout", "scheduleHideAnimationFrame", "isVisibleFromClick", "didHideDueToDocumentMouseDown", "didTouchMove", "ignoreOnFirstUpdate", "lastTriggerEvent", "currentTransitionEndListener", "onFirstUpdate", "listeners", "debouncedOnMouseMove", "debounce", "onMouseMove", "interactiveDebounce", "currentTarget", "id", "popperInstance", "plugins", "unique", "state", "isEnabled", "isVisible", "isDestroyed", "isMounted", "isShown", "clearDelayTimeouts", "setProps", "show", "hide", "hideWithInteractivity", "enable", "disable", "unmount", "destroy", "_props$render", "_tippy", "pluginsHooks", "map", "plugin", "fn", "hasAriaExpanded", "hasAttribute", "addListeners", "handleAriaExpandedAttribute", "handleStyles", "invokeHook", "showOnCreate", "scheduleShow", "addEventListener", "interactive", "trigger", "indexOf", "getDocument", "getNormalizedTouchSettings", "touch", "Array", "isArray", "getIsCustomTouchBehavior", "getIsDefaultRenderFn", "_instance$props$rende", "getCurrentTarget", "parent", "parentNode", "getOwnerDocument", "document", "getDefaultTemplateChildren", "getDelay", "isShow", "currentInput", "isTouch", "type", "getValueAtIndexOrReturn", "delay", "fromHide", "pointerEvents", "zIndex", "hook", "args", "shouldInvokePropsHook", "forEach", "pluginHooks", "_instance$props", "handleAriaContentAttribute", "aria", "attr", "nodes", "normalizeToArray", "triggerTarget", "currentValue", "getAttribute", "nextValue", "replace", "trim", "expanded", "cleanupInteractiveMouseListeners", "removeEventListener", "filter", "listener", "onDocumentPress", "event", "actualTarget", "composedPath", "target", "actualContains", "some", "el", "hideOnClick", "setTimeout", "removeDocumentPress", "onTouchMove", "onTouchStart", "addDocumentPress", "doc", "TOUCH_OPTIONS", "onTransitionedOut", "duration", "callback", "onTransitionEnd", "onTransitionedIn", "updateTransitionEndListener", "on", "eventType", "handler", "options", "push", "onTrigger", "passive", "onMouseLeave", "splitBySpaces", "isIE11", "onBlurOrFocusOut", "removeListeners", "_ref", "_lastTriggerEvent", "shouldScheduleClickHide", "isEventListenerStopped", "wasFocused", "isMouseEvent", "scheduleHide", "isCursorOverReferenceOrPopper", "popperTreeData", "getNestedPopperTree", "concat", "_instance$popperInsta", "popperRect", "getBoundingClientRect", "popperState", "Boolean", "isCursorOutsideInteractiveBorder", "shouldBail", "relatedTarget", "createPopperInstance", "destroyPopperInstance", "_instance$props2", "popperOptions", "placement", "offset", "getReferenceClientRect", "moveTransition", "computedReference", "contextElement", "tippyModifier", "name", "enabled", "phase", "requires", "_ref2", "_getDefaultTemplateCh", "attributes", "modifiers", "padding", "top", "bottom", "left", "right", "adaptive", "createPopper", "mount", "appendTo", "TIPPY_DEFAULT_APPEND_TO", "invokeWithArgsOrReturn", "querySelectorAll", "_getNormalizedTouchSe", "touchValue", "touchDelay", "requestAnimationFrame", "clearTimeout", "cancelAnimationFrame", "partialProps", "ignoreAttributes", "nestedPopper", "forceUpdate", "isAlreadyVisible", "isDisabled", "isTouchAndTouchDisabled", "onShow", "visibility", "transition", "_getDefaultTemplateCh2", "setTransitionDuration", "_instance$popperInsta2", "offsetHeight", "_getDefaultTemplateCh3", "setVisibilityState", "pushIfUnique", "isAlreadyHidden", "onHide", "_getDefaultTemplateCh4", "i", "tippy", "targets", "optionalProps", "bindGlobalEventListeners", "elements", "getArrayOfElements", "isSingleContentElement", "isMoreThanOneReferenceElement", "instances", "reduce", "acc", "setDefaultProps", "applyStylesModifier", "applyStyles", "effect", "__name", "_ref", "state", "initialStyles", "popper", "position", "options", "strategy", "left", "top", "margin", "arrow", "reference", "Object", "assign", "elements", "style", "styles", "tippy", "setDefaultProps", "render", "import_react", "import_jsx_runtime", "Surface", "children", "className", "withShadow", "withBorder", "props", "ref", "surfaceClass", "cn", "import_core", "import_react", "import_suggestion", "import_react", "suggestion", "query", "editor", "_a", "_b", "variables", "ext", "getFlattenedVariables", "item", "range", "props", "component", "popup", "currentProps", "updateComponent", "__name", "index", "selectItem", "VariableSuggestions", "tippy_esm_default", "items", "currentIndex", "newIndex", "import_react", "import_lucide_react", "import_jsx_runtime", "VariableView", "__name", "node", "VariableNode", "element", "attributes", "VariableView", "Variable", "suggestion", "isTableGripSelected", "__name", "node", "container", "gripColumn", "gripRow", "isCustomNodeSelected", "editor", "ImageBlock", "type", "import_core", "isTextSelected", "__name", "editor", "doc", "selection", "empty", "from", "to", "isEmptyTextBlock", "import_uuid", "findNodePositionById", "__name", "editor", "id", "foundPos", "node", "pos", "createOrDuplicateNode", "nodeType", "insertPos", "sourceNodeAttrs", "setSelectedNode", "sourceNodeContent", "uuidv4", "createNode", "defaultTextBlockProps", "defaultSpacerProps", "defaultDividerProps", "defaultButtonProps", "defaultImageProps", "tr", "newNode", "nodePos", "customEvent", "error", "import_core", "directions", "coordinateGetter", "__name", "event", "active", "droppableRects", "droppableContainers", "collisionRect", "_a", "filteredContainers", "entry", "rect", "data", "type", "children", "collisions", "closestId", "newDroppable", "newNode", "newRect", "import_lucide_react", "import_react", "import_jsx_runtime", "Handle", "props", "ref", "cn", "import_jotai", "import_react", "useTextmenuCommands", "__name", "editor", "setSelectedNode", "setSelectedNodeAtom", "selectedNode", "selectedNodeAtom", "findNodePositionById", "id", "nodePos", "node", "pos", "_a", "updateButtonAttribute", "attributeName", "newValue", "_b", "_c", "nodeId", "tr", "updatedNodePos", "updatedNode", "resetButtonFormatting", "currentNode", "newAttrs", "onBold", "newFontWeight", "onItalic", "newFontStyle", "onStrike", "newIsStrike", "onUnderline", "newIsUnderline", "onAlignLeft", "onAlignCenter", "onAlignRight", "onAlignJustify", "onLink", "url", "inNewTab", "onQuote", "isActive", "selection", "$pos", "depth", "import_jsx_runtime", "useMountStatus", "isMounted", "setIsMounted", "timeout", "__name", "SortableItemWrapper", "children", "id", "className", "props", "setNodeRef", "setActivatorNodeRef", "listeners", "isDragging", "transform", "transition", "mounted", "SortableItem", "dragOverlay", "handleProps", "editor", "fadeIn", "ref", "setSelectedNode", "selectedNodeAtom", "resetButtonFormatting", "useTextmenuCommands", "findNodePositionById", "state", "targetId", "foundPos", "node", "pos", "_a", "getNodeAndPosition", "clearSelection", "deleteNode", "isLastNode", "tr", "newNode", "newId", "uuidv4", "customEvent", "error", "removeFormatting", "chain", "duplicateNode", "nodeType", "nodeAttrs", "insertPos", "createOrDuplicateNode", "cn", "Handle", "RemoveFormattingIcon", "Divider", "DuplicateIcon", "BinIcon", "import_react", "import_jotai", "import_jsx_runtime", "BlockquoteComponent", "__name", "paddingHorizontal", "paddingVertical", "backgroundColor", "borderLeftWidth", "borderColor", "BlockquoteComponentNode", "props", "setSelectedNode", "setSelectedNodeAtom", "handleSelect", "pos", "node", "isEmpty", "SortableItemWrapper", "cn", "defaultBlockquoteProps", "Blockquote", "_a", "generateNodeIds", "element", "attributes", "HTMLAttributes", "editor", "selection", "empty", "isInBlockquote", "tr", "pos", "$pos", "range", "BlockquoteComponentNode", "import_zod", "import_react_hook_form", "import_zod", "blockquoteSchema", "import_jsx_runtime", "BlockquoteForm", "__name", "element", "editor", "form", "blockquoteSchema", "defaultBlockquoteProps", "updateNodeAttributes", "useNodeAttributes", "Form", "FormHeader", "FormField", "field", "FormItem", "FormControl", "Input", "PaddingHorizontalIcon", "FormMessage", "PaddingVerticalIcon", "InputColor", "value", "Divider", "BorderWidthIcon", "import_jotai", "import_jsx_runtime", "SideBarItemDetails", "__name", "element", "editor", "_a", "pendingLink", "pendingLinkAtom", "LinkForm", "isInBlockquote", "getBlockquoteElement", "$anchor", "depth", "node", "ButtonForm", "DividerForm", "TextBlockForm", "ImageBlockForm", "BlockquoteForm", "import_jotai", "import_lucide_react", "import_react", "import_react", "import_react", "import_jsx_runtime", "isMac", "ShortcutKey", "__name", "children", "className", "Tooltip", "enabled", "title", "shortcut", "tippyOptions", "renderTooltip", "attrs", "shortcutKey", "Tippy", "import_jsx_runtime", "ToolbarWrapper", "shouldShowContent", "children", "isVertical", "className", "rest", "ref", "toolbarClassName", "cn", "Surface", "ToolbarDivider", "horizontal", "dividerClassName", "ToolbarButton", "buttonSize", "variant", "tooltip", "tooltipShortcut", "buttonClass", "content", "Button", "Tooltip", "Toolbar", "import_lucide_react", "import_react", "import_jsx_runtime", "isOption", "__name", "option", "ContentTypePicker", "options", "containerRef", "activeItem", "DropdownMenu", "DropdownMenuTrigger", "Button", "DropdownMenuContent", "DropdownMenuItem", "import_react", "useTextmenuContentTypes", "__name", "editor", "ctx", "import_jotai", "import_react", "useTextmenuStates", "__name", "editor", "selectedNode", "selectedNodeAtom", "states", "setStates", "updateStates", "view", "from", "domAtPos", "node", "isCustomNodeSelected", "isTextSelected", "import_jsx_runtime", "MemoButton", "Toolbar", "MemoContentTypePicker", "ContentTypePicker", "TextMenu", "__name", "editor", "_a", "commands", "useTextmenuCommands", "states", "useTextmenuStates", "blockOptions", "useTextmenuContentTypes", "toolbarRef", "lastActiveInput", "lastActiveInputRefAtom", "selectedNode", "selectedNodeAtom", "currentNodeName", "getNodeConfig", "getNodeConfigAtom", "menuConfig", "handleLinkToggle", "selection", "tr", "handleVariableClick", "element", "value", "caretPos", "beforeCursor", "afterCursor", "newValue", "newCaretPosition", "changeEvent", "textBeforeCursor", "tempSpan", "textWidth", "lineHeight", "lines", "showSuggestionsEvent", "state", "dispatch", "tr2", "renderButton", "key", "icon", "tooltip", "onClick", "active", "shortcut", "dataAttributes", "config", "renderGroup", "items", "groupKey", "visibleItems", "item", "contentTypeGroup", "textStyleGroup", "alignmentGroup", "blockStyleGroup", "insertGroup", "index", "import_jotai", "import_react", "import_sonner", "import_react", "import_jsx_runtime", "Header", "children", "ref", "import_lucide_react", "import_react", "import_jsx_runtime", "Status", "__name", "isError", "isSaving", "isLoading", "showSaved", "setShowSaved", "timer", "Loader", "import_zod", "brandEditorSchema", "defaultBrandEditorFormValues", "import_jotai", "BrandEditorContentAtom", "BrandEditorFormAtom", "import_react", "import_jotai", "import_yjs", "_UploadImageAPI", "__name", "file", "resolve", "reject", "reader", "UploadImageAPI", "UploadImageAPI_default", "ExtensionKit", "__name", "options", "Document", "Selection", "DragPlaceholder", "Divider", "Paragraph", "Blockquote", "Heading", "Button", "Link", "ImageBlock", "FileHandler_default", "currentEditor", "files", "pos", "file", "url", "UploadImageAPI_default", "Dropcursor", "Variable", "VariableNode", "markToMD", "__name", "mark", "convertNodeToMarkdown", "node", "_a", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_m", "_n", "text", "markSymbols", "linkMark", "m", "level", "prefix", "content", "line", "alt", "src", "link", "imageMarkdown", "label", "convertTiptapToMarkdown", "doc", "import_core", "import_state", "import_react", "import_jotai", "useBlockEditor", "__name", "initialContent", "readOnly", "variables", "ydoc", "onDestroy", "setSelectedNode", "setPendingLink", "setPendingLinkAtom", "timeoutRef", "brandEditorContent", "setBrandEditorContent", "BrandEditorContentAtom", "EscapeHandlerExtension", "editor", "state", "dispatch", "onCreateHandler", "onUpdateHandler", "newContent", "convertTiptapToMarkdown", "onSelectionUpdateHandler", "selection", "linkMark", "m", "onTransactionHandler", "transaction", "onDestroyHandler", "extensions", "ExtensionKit", "e", "convertElementalToTiptap", "import_jsx_runtime", "BrandFooterComponent", "__name", "variables", "facebookLink", "linkedinLink", "instagramLink", "mediumLink", "xLink", "readOnly", "setEditor", "ydoc", "YDoc", "isMountedRef", "brandEditorContent", "setBrandEditorContent", "BrandEditorContentAtom", "tenantData", "tenantDataAtom", "isTenantLoading", "isTenantLoadingAtom", "isResponseSetRef", "extendedVariables", "setSelectedNodeHandler", "editor", "useBlockEditor", "convertMarkdownToTiptap", "_a", "_b", "_c", "_d", "_e", "_f", "markdown", "cn", "FacebookIcon", "LinkedinIcon", "InstagramIcon", "MediumIcon", "XIcon", "BrandFooter", "resizeImage", "__name", "file", "maxDimension", "resolve", "reader", "e", "_a", "img", "newWidth", "newHeight", "canvas", "ctx", "quality", "dataUrl", "iterations", "maxIterations", "import_react", "import_jsx_runtime", "LogoUploader", "__name", "onFileSelect", "isDragging", "setIsDragging", "fileInputRef", "handleDragOver", "e", "item", "handleDragLeave", "handleDragEnter", "handleFileUpload", "file", "dataUrl", "resizeImage", "error", "handleDrop", "imageFile", "handleFileSelect", "_a", "handleBrowseClick", "cn", "import_zod", "import_jotai", "import_lucide_react", "import_react", "import_react_hook_form", "import_jsx_runtime", "HeaderStyle", "__name", "isActive", "onClick", "value", "cn", "SideBar", "editor", "setForm", "currentForm", "_a", "_b", "fileInputRef", "setBrandEditorContent", "BrandEditorContentAtom", "form", "brandEditorSchema", "defaultBrandEditorFormValues", "onFormChange", "values", "handlePreferencesChange", "status", "content", "node", "contentWithoutLastParagraph", "newContent", "convertTiptapToMarkdown", "variables", "ext", "variableKeys", "getFlattenedVariables", "Form", "FormField", "field", "FormItem", "FormControl", "FormMessage", "Divider", "Button", "e", "file", "dataUrl", "resizeImage", "error", "TextInput", "InputColor", "Input", "FacebookIcon", "LinkedinIcon", "InstagramIcon", "MediumIcon", "XIcon", "Switch", "FormLabel", "import_jsx_runtime", "EditorComponent", "hidePublish", "autoSaveDebounce", "autoSave", "templateEditor", "isVisible", "variables", "onChange", "ref", "_a", "_b", "_c", "_d", "_e", "brandValue", "setBrandValue", "setPage", "pageAtom", "saveBrand", "publishBrand", "useBrandActions", "tenantData", "tenantDataAtom", "form", "setForm", "isTenantPublishing", "isTenantPublishingAtom", "isTenantSaving", "isTenantSavingAtom", "isTenantLoading", "isTenantLoadingAtom", "tenantId", "tenantIdAtom", "tenantError", "tenantErrorAtom", "editor", "setEditor", "footerContent", "setFooterContent", "previousSettingsRef", "selectedNode", "setSelectedNode", "selectedNodeAtom", "setBrandEditorForm", "BrandEditorFormAtom", "brandEditorContent", "setBrandEditorContent", "BrandEditorContentAtom", "isResponseSetRef", "handleAutoSave", "useAutoSave", "data", "brandSettings", "handlePublish", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_m", "_n", "_o", "_p", "_q", "_r", "_s", "_t", "_u", "_v", "_w", "_x", "_y", "_z", "_A", "_B", "_C", "_D", "_E", "_F", "_G", "_H", "_I", "_J", "_K", "_L", "_M", "brandSettingsString", "paragraphs", "findPrefencesUrl", "paragraph", "formValues", "defaultBrandEditorFormValues", "handleLogoSelect", "dataUrl", "prevForm", "handleBack", "cn", "Header", "Status", "Button", "TextMenu", "LogoUploader", "BrandFooter", "SideBar", "SideBarItemDetails", "Editor", "import_zod", "AlignEnum", "TextStyleEnum", "ActionButtonStyleEnum", "BaseElementalNode", "ElementalTextContent", "StringTextContent", "LinkTextContent", "ImageTextContent", "TextContentNode", "TextNodeWithElements", "TextNodeWithContent", "TextNode", "MetaNode", "ChannelNode", "ElementalNodeType", "ImageNode", "ActionNode", "DividerNode", "GroupNode", "QuoteNode", "HtmlNode", "CommentNode", "ListItemNode", "ListNode", "ElementalSchema", "validateElemental", "__name", "json", "error", "import_react", "import_jsx_runtime", "ElementalValue", "__name", "value", "onChange", "error", "setError", "localValue", "setLocalValue", "validateValue", "_a", "jsonValue", "validationValue", "validation", "validateElemental", "errorMessage", "err", "handleChange", "event", "newValue", "handleBlur", "isValid", "import_sonner", "import_jsx_runtime", "EditorLayout", "__name", "theme", "children", "ThemeProvider", "import_jsx_runtime", "PreviewItem", "__name", "value", "icon", "props", "ToggleGroupItem", "PreviewPanel", "previewMode", "togglePreviewMode", "ToggleGroup", "DesktopIcon", "MobileIcon", "Button", "import_core", "import_sortable", "import_react", "import_jotai", "import_uuid", "import_jotai", "import_lucide_react", "import_sortable", "import_react", "import_jsx_runtime", "useMountStatus", "isMounted", "setIsMounted", "timeout", "__name", "SideBarSortableItemWrapper", "children", "id", "className", "setNodeRef", "setActivatorNodeRef", "listeners", "isDragging", "transform", "transition", "mounted", "SideBarSortableItem", "dragOverlay", "handleProps", "ref", "cn", "import_jsx_runtime", "SideBar", "__name", "items", "brandEditor", "_a", "_b", "tenantData", "tenantDataAtom", "setPage", "pageAtom", "isTenantSaving", "isTenantSavingAtom", "Divider", "item", "SideBarSortableItemWrapper", "cn", "HeadingBlock", "TextBlock", "ImageBlock", "SpacerBlock", "DividerBlock", "ButtonBlock", "Button", "import_jsx_runtime", "EditorComponent", "editor", "handleEditorClick", "isLoading", "isVisible", "hidePublish", "brandEditor", "variables", "ref", "_a", "_b", "selectedNode", "selectedNodeAtom", "setSelectedNode", "subject", "setSubject", "subjectAtom", "activeId", "setActiveId", "activeDragType", "setActiveDragType", "lastOverId", "recentlyMovedToNewContainer", "timeoutRef", "lastPlaceholderIndex", "setLastPlaceholderIndex", "previewMode", "setPreviewMode", "tenantData", "tenantDataAtom", "publishTemplate", "isTenantPublishing", "useTemplateActions", "isTenantSaving", "isTenantSavingAtom", "isTenantLoading", "isTenantLoadingAtom", "tenantError", "tenantErrorAtom", "brandApply", "brandApplyAtom", "BrandEditorForm", "BrandEditorFormAtom", "brandSettings", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_m", "_n", "_o", "_p", "_q", "_r", "_s", "_t", "_u", "_v", "_w", "_x", "_y", "_z", "_A", "_B", "_C", "_D", "_E", "_F", "_G", "_H", "isBrandApply", "coordinateGetter", "strategy", "items", "setItems", "cleanupTimeouts", "timeout", "updateItems", "__name", "elements", "domIds", "el", "id", "docIds", "node", "allIds", "docContent", "paragraphNode", "newId", "uuidv4", "tr", "uniqueIds", "error", "prev", "handleNodeDuplicated", "event", "newNodeId", "prevItems", "togglePreviewMode", "mode", "newPreviewMode", "handlePublish", "sensors", "onDragCancel", "findContainer", "key", "collisionDetectionStrategy", "args", "container", "pointerIntersections", "intersections", "overId", "containerItems", "closestId", "getDocumentPosition", "index", "doc", "pos", "i", "cleanupPlaceholder", "handleSubjectChange", "e", "Header", "Input", "Status", "Button", "active", "over", "overContainer", "activeRect", "targetIndex", "rect", "tempId", "activeContainer", "insertPos", "createOrDuplicateNode", "activeIndex", "overIndex", "content", "newContent", "movedItem", "cn", "TextMenu", "BrandFooter", "PreviewPanel", "SideBarItemDetails", "SideBar", "HeadingBlock", "TextBlock", "SpacerBlock", "DividerBlock", "ButtonBlock", "ImageBlock", "Editor", "import_core", "import_state", "import_react", "import_jotai", "import_react", "useBlockEditor", "__name", "initialContent", "readOnly", "variables", "ydoc", "onDestroy", "setSelectedNode", "setPendingLink", "setPendingLinkAtom", "timeoutRef", "templateEditorContent", "setTemplateEditorContent", "templateEditorContentAtom", "subject", "subjectAtom", "EscapeHandlerExtension", "editor", "state", "dispatch", "onCreateHandler", "onUpdateHandler", "newContent", "convertTiptapToElemental", "onSelectionUpdateHandler", "selection", "linkMark", "m", "onTransactionHandler", "transaction", "onDestroyHandler", "extensions", "ExtensionKit", "e", "convertElementalToTiptap", "import_jsx_runtime", "currentTemplateId", "currentTenantId", "pendingFetch", "getSubject", "__name", "content", "channelNode", "el", "subjectNode", "TemplateEditorComponent", "theme", "value", "onChange", "variables", "hidePublish", "autoSave", "autoSaveDebounce", "brandEditor", "brandProps", "elementalValue", "setElementalValue", "isTenantLoading", "isTenantLoadingAtom", "selectedNode", "selectedNodeAtom", "setSelectedNode", "setNodeConfig", "setNodeConfigAtom", "tenantData", "setTenantData", "tenantDataAtom", "templateId", "templateIdAtom", "tenantId", "tenantIdAtom", "setEditor", "tenantEditorAtom", "subject", "setSubject", "subjectAtom", "getTenant", "saveTemplate", "useTemplateActions", "ydoc", "YDoc", "page", "pageAtom", "mountedRef", "isResponseSetRef", "templateEditorContent", "setTemplateEditorContent", "templateEditorContentAtom", "setBrandEditorContent", "BrandEditorContentAtom", "currentTabIndexRef", "handleAutoSave", "useAutoSave", "nodeName", "config", "getTextMenuConfigForNode", "editor", "useBlockEditor", "_a", "_b", "_c", "_d", "convertElementalToTiptap", "newContent", "convertTiptapToElemental", "handleKeyPress", "event", "currentIndex", "node", "_offset", "index", "doc", "targetIndex", "targetNode", "handleEditorClick", "target", "targetPos", "EditorLayout", "Loader", "Editor", "ElementalValue", "isValid", "parsedValue", "e", "TemplateEditor", "import_jotai", "import_react", "import_jsx_runtime", "currentTenantId", "pendingFetch", "BrandEditorComponent", "hidePublish", "autoSaveDebounce", "autoSave", "theme", "props", "ref", "isTenantLoading", "isTenantLoadingAtom", "isInitialLoadRef", "tenantId", "tenantIdAtom", "getTenant", "useBrandActions", "tenantData", "setTenantData", "tenantDataAtom", "setBrandEditorContent", "BrandEditorContentAtom", "EditorLayout", "Loader", "Editor", "BrandEditor"]
|
|
7
|
+
}
|