@intlayer/design-system 9.0.0-canary.0 → 9.0.0-canary.2
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/dist/esm/api/hooks/ai.mjs +20 -1
- package/dist/esm/api/hooks/ai.mjs.map +1 -1
- package/dist/esm/api/hooks/asset.mjs +78 -0
- package/dist/esm/api/hooks/asset.mjs.map +1 -0
- package/dist/esm/api/index.mjs +6 -5
- package/dist/esm/api/useIntlayerAPI.mjs +6 -1
- package/dist/esm/api/useIntlayerAPI.mjs.map +1 -1
- package/dist/esm/components/Command/index.mjs +8 -8
- package/dist/esm/components/Command/index.mjs.map +1 -1
- package/dist/esm/components/ContentEditor/ContentEditorTextArea.mjs +1 -1
- package/dist/esm/components/DictionaryFieldEditor/ContentEditor.mjs +132 -35
- package/dist/esm/components/DictionaryFieldEditor/ContentEditor.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs +33 -11
- package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs +146 -35
- package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.mjs +308 -0
- package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.mjs +12 -2
- package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs +460 -20
- package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.mjs +506 -0
- package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs +10 -6
- package/dist/esm/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs +1 -1
- package/dist/esm/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs +9 -9
- package/dist/esm/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs +2 -2
- package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/contentEditor.content.mjs +79 -0
- package/dist/esm/components/DictionaryFieldEditor/contentEditor.content.mjs.map +1 -0
- package/dist/esm/components/Form/Form.mjs +3 -43
- package/dist/esm/components/Form/Form.mjs.map +1 -1
- package/dist/esm/components/Form/elements/FormElement.mjs +2 -3
- package/dist/esm/components/Form/elements/FormElement.mjs.map +1 -1
- package/dist/esm/components/Form/elements/MultiselectElement.mjs +2 -3
- package/dist/esm/components/Form/elements/MultiselectElement.mjs.map +1 -1
- package/dist/esm/components/Form/elements/OTPElement.mjs +3 -4
- package/dist/esm/components/Form/elements/OTPElement.mjs.map +1 -1
- package/dist/esm/components/Form/elements/SelectElement.mjs +2 -3
- package/dist/esm/components/Form/elements/SelectElement.mjs.map +1 -1
- package/dist/esm/components/Form/elements/SwitchSelectorElement.mjs +2 -3
- package/dist/esm/components/Form/elements/SwitchSelectorElement.mjs.map +1 -1
- package/dist/esm/components/Form/index.mjs +21 -2
- package/dist/esm/components/Form/layout/FormItemLayout.mjs +8 -5
- package/dist/esm/components/Form/layout/FormItemLayout.mjs.map +1 -1
- package/dist/esm/components/LanguageBackground/LanguageBackground.mjs +3 -8
- package/dist/esm/components/LanguageBackground/LanguageBackground.mjs.map +1 -1
- package/dist/esm/components/LocaleSwitcherContentDropDown/LocaleSwitcherContent.mjs +1 -1
- package/dist/esm/components/MarkDownRender/MarkDownRender.mjs +1 -1
- package/dist/esm/components/MarkDownRender/MarkDownRender.mjs.map +1 -1
- package/dist/esm/components/MarkdownEditor/MarkdownEditor.mjs +113 -0
- package/dist/esm/components/MarkdownEditor/MarkdownEditor.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/extensions.mjs +103 -0
- package/dist/esm/components/MarkdownEditor/extensions.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/generative/AICompletionCommands.mjs +51 -0
- package/dist/esm/components/MarkdownEditor/generative/AICompletionCommands.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/generative/AISelector.mjs +100 -0
- package/dist/esm/components/MarkdownEditor/generative/AISelector.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/generative/AISelectorCommands.mjs +81 -0
- package/dist/esm/components/MarkdownEditor/generative/AISelectorCommands.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/generative/GenerativeMenuSwitch.mjs +47 -0
- package/dist/esm/components/MarkdownEditor/generative/GenerativeMenuSwitch.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/generative/useAICompletion.mjs +83 -0
- package/dist/esm/components/MarkdownEditor/generative/useAICompletion.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/imageUpload.mjs +47 -0
- package/dist/esm/components/MarkdownEditor/imageUpload.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/index.mjs +4 -0
- package/dist/esm/components/MarkdownEditor/markdownEditor.content.mjs +1140 -0
- package/dist/esm/components/MarkdownEditor/markdownEditor.content.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/components/editor-bubble-item.mjs +20 -0
- package/dist/esm/components/MarkdownEditor/novel/components/editor-bubble-item.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/components/editor-bubble.mjs +39 -0
- package/dist/esm/components/MarkdownEditor/novel/components/editor-bubble.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/components/editor-command-item.mjs +25 -0
- package/dist/esm/components/MarkdownEditor/novel/components/editor-command-item.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/components/editor-command.mjs +61 -0
- package/dist/esm/components/MarkdownEditor/novel/components/editor-command.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/components/editor.mjs +27 -0
- package/dist/esm/components/MarkdownEditor/novel/components/editor.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/components/index.mjs +8 -0
- package/dist/esm/components/MarkdownEditor/novel/extensions/ai-highlight.mjs +74 -0
- package/dist/esm/components/MarkdownEditor/novel/extensions/ai-highlight.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/extensions/custom-keymap.mjs +37 -0
- package/dist/esm/components/MarkdownEditor/novel/extensions/custom-keymap.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/extensions/image-resizer.mjs +49 -0
- package/dist/esm/components/MarkdownEditor/novel/extensions/image-resizer.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/extensions/index.mjs +51 -0
- package/dist/esm/components/MarkdownEditor/novel/extensions/index.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/extensions/slash-command.mjs +79 -0
- package/dist/esm/components/MarkdownEditor/novel/extensions/slash-command.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/extensions/updated-image.mjs +17 -0
- package/dist/esm/components/MarkdownEditor/novel/extensions/updated-image.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/index.mjs +17 -0
- package/dist/esm/components/MarkdownEditor/novel/plugins/index.mjs +3 -0
- package/dist/esm/components/MarkdownEditor/novel/plugins/upload-images.mjs +92 -0
- package/dist/esm/components/MarkdownEditor/novel/plugins/upload-images.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/utils/atoms.mjs +39 -0
- package/dist/esm/components/MarkdownEditor/novel/utils/atoms.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/novel/utils/index.mjs +38 -0
- package/dist/esm/components/MarkdownEditor/novel/utils/index.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/selectors/ColorSelector.mjs +176 -0
- package/dist/esm/components/MarkdownEditor/selectors/ColorSelector.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/selectors/LinkSelector.mjs +95 -0
- package/dist/esm/components/MarkdownEditor/selectors/LinkSelector.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/selectors/NodeSelector.mjs +139 -0
- package/dist/esm/components/MarkdownEditor/selectors/NodeSelector.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/selectors/TextButtons.mjs +81 -0
- package/dist/esm/components/MarkdownEditor/selectors/TextButtons.mjs.map +1 -0
- package/dist/esm/components/MarkdownEditor/slashCommand.mjs +161 -0
- package/dist/esm/components/MarkdownEditor/slashCommand.mjs.map +1 -0
- package/dist/esm/components/Modal/Modal.mjs +2 -2
- package/dist/esm/components/Navbar/MobileNavbar.mjs +1 -1
- package/dist/esm/components/Pagination/Pagination.mjs +1 -1
- package/dist/esm/components/Pattern/GridDistortionPattern.mjs +275 -0
- package/dist/esm/components/Pattern/GridDistortionPattern.mjs.map +1 -0
- package/dist/esm/components/Pattern/index.mjs +2 -1
- package/dist/esm/components/RightDrawer/RightDrawer.mjs +3 -3
- package/dist/esm/components/Tab/Tab.mjs +1 -1
- package/dist/esm/components/Table/Table.mjs +1 -1
- package/dist/esm/components/Table/Table.mjs.map +1 -1
- package/dist/esm/components/Tag/index.mjs +0 -9
- package/dist/esm/components/Tag/index.mjs.map +1 -1
- package/dist/esm/components/Toaster/Toast.mjs +1 -1
- package/dist/esm/components/Toaster/Toast.mjs.map +1 -1
- package/dist/esm/components/index.mjs +27 -6
- package/dist/esm/hooks/index.mjs +8 -8
- package/dist/esm/hooks/useIsMounted.mjs +4 -2
- package/dist/esm/hooks/useIsMounted.mjs.map +1 -1
- package/dist/esm/routes.mjs +2 -1
- package/dist/esm/routes.mjs.map +1 -1
- package/dist/types/api/hooks/ai.d.ts +5 -1
- package/dist/types/api/hooks/ai.d.ts.map +1 -1
- package/dist/types/api/hooks/asset.d.ts +27 -0
- package/dist/types/api/hooks/asset.d.ts.map +1 -0
- package/dist/types/api/hooks/audit.d.ts +1 -1
- package/dist/types/api/index.d.ts +4 -3
- package/dist/types/api/useIntlayerAPI.d.ts +15 -3
- package/dist/types/api/useIntlayerAPI.d.ts.map +1 -1
- package/dist/types/components/Badge/index.d.ts +1 -1
- package/dist/types/components/Breadcrumb/index.d.ts +1 -1
- package/dist/types/components/Button/Button.d.ts +3 -3
- package/dist/types/components/CollapsibleTable/CollapsibleTable.d.ts +2 -2
- package/dist/types/components/Command/index.d.ts.map +1 -1
- package/dist/types/components/Container/index.d.ts +1 -1
- package/dist/types/components/DictionaryFieldEditor/ContentEditor.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/ContentEditorView/TextEditor.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.d.ts +308 -0
- package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.d.ts +12 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.d.ts +2 -0
- package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.d.ts +506 -0
- package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryFieldEditor.d.ts +2 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryFieldEditor.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/contentEditor.content.d.ts +80 -0
- package/dist/types/components/DictionaryFieldEditor/contentEditor.content.d.ts.map +1 -0
- package/dist/types/components/Form/Form.d.ts +27 -47
- package/dist/types/components/Form/Form.d.ts.map +1 -1
- package/dist/types/components/Form/elements/FormElement.d.ts.map +1 -1
- package/dist/types/components/Form/elements/MultiselectElement.d.ts.map +1 -1
- package/dist/types/components/Form/elements/OTPElement.d.ts.map +1 -1
- package/dist/types/components/Form/elements/SelectElement.d.ts.map +1 -1
- package/dist/types/components/Form/elements/SwitchSelectorElement.d.ts.map +1 -1
- package/dist/types/components/Form/index.d.ts +22 -3
- package/dist/types/components/Form/layout/FormItemLayout.d.ts.map +1 -1
- package/dist/types/components/Input/Checkbox.d.ts +3 -3
- package/dist/types/components/Input/Input.d.ts +1 -1
- package/dist/types/components/Input/Radio.d.ts +3 -3
- package/dist/types/components/LanguageBackground/LanguageBackground.d.ts.map +1 -1
- package/dist/types/components/Link/Link.d.ts +1 -1
- package/dist/types/components/MarkdownEditor/MarkdownEditor.d.ts +31 -0
- package/dist/types/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/extensions.d.ts +11 -0
- package/dist/types/components/MarkdownEditor/extensions.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/generative/AICompletionCommands.d.ts +18 -0
- package/dist/types/components/MarkdownEditor/generative/AICompletionCommands.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/generative/AISelector.d.ts +22 -0
- package/dist/types/components/MarkdownEditor/generative/AISelector.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/generative/AISelectorCommands.d.ts +17 -0
- package/dist/types/components/MarkdownEditor/generative/AISelectorCommands.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/generative/GenerativeMenuSwitch.d.ts +26 -0
- package/dist/types/components/MarkdownEditor/generative/GenerativeMenuSwitch.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/generative/useAICompletion.d.ts +30 -0
- package/dist/types/components/MarkdownEditor/generative/useAICompletion.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/imageUpload.d.ts +29 -0
- package/dist/types/components/MarkdownEditor/imageUpload.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/index.d.ts +3 -0
- package/dist/types/components/MarkdownEditor/markdownEditor.content.d.ts +1135 -0
- package/dist/types/components/MarkdownEditor/markdownEditor.content.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/components/editor-bubble-item.d.ts +14 -0
- package/dist/types/components/MarkdownEditor/novel/components/editor-bubble-item.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/components/editor-bubble.d.ts +18 -0
- package/dist/types/components/MarkdownEditor/novel/components/editor-bubble.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/components/editor-command-item.d.ts +28 -0
- package/dist/types/components/MarkdownEditor/novel/components/editor-command-item.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/components/editor-command.d.ts +34 -0
- package/dist/types/components/MarkdownEditor/novel/components/editor-command.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/components/editor.d.ts +23 -0
- package/dist/types/components/MarkdownEditor/novel/components/editor.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/components/index.d.ts +8 -0
- package/dist/types/components/MarkdownEditor/novel/extensions/ai-highlight.d.ts +36 -0
- package/dist/types/components/MarkdownEditor/novel/extensions/ai-highlight.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/extensions/custom-keymap.d.ts +17 -0
- package/dist/types/components/MarkdownEditor/novel/extensions/custom-keymap.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/extensions/image-resizer.d.ts +7 -0
- package/dist/types/components/MarkdownEditor/novel/extensions/image-resizer.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/extensions/index.d.ts +30 -0
- package/dist/types/components/MarkdownEditor/novel/extensions/index.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/extensions/slash-command.d.ts +38 -0
- package/dist/types/components/MarkdownEditor/novel/extensions/slash-command.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/extensions/updated-image.d.ts +8 -0
- package/dist/types/components/MarkdownEditor/novel/extensions/updated-image.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/index.d.ts +16 -0
- package/dist/types/components/MarkdownEditor/novel/plugins/index.d.ts +2 -0
- package/dist/types/components/MarkdownEditor/novel/plugins/upload-images.d.ts +22 -0
- package/dist/types/components/MarkdownEditor/novel/plugins/upload-images.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/utils/atoms.d.ts +21 -0
- package/dist/types/components/MarkdownEditor/novel/utils/atoms.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/novel/utils/index.d.ts +10 -0
- package/dist/types/components/MarkdownEditor/novel/utils/index.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/selectors/ColorSelector.d.ts +17 -0
- package/dist/types/components/MarkdownEditor/selectors/ColorSelector.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/selectors/LinkSelector.d.ts +15 -0
- package/dist/types/components/MarkdownEditor/selectors/LinkSelector.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/selectors/NodeSelector.d.ts +22 -0
- package/dist/types/components/MarkdownEditor/selectors/NodeSelector.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/selectors/TextButtons.d.ts +11 -0
- package/dist/types/components/MarkdownEditor/selectors/TextButtons.d.ts.map +1 -0
- package/dist/types/components/MarkdownEditor/slashCommand.d.ts +29 -0
- package/dist/types/components/MarkdownEditor/slashCommand.d.ts.map +1 -0
- package/dist/types/components/Pattern/GridDistortionPattern.d.ts +15 -0
- package/dist/types/components/Pattern/GridDistortionPattern.d.ts.map +1 -0
- package/dist/types/components/Pattern/index.d.ts +2 -1
- package/dist/types/components/SwitchSelector/SwitchSelector.d.ts +1 -1
- package/dist/types/components/SwitchSelector/VerticalSwitchSelector.d.ts +1 -1
- package/dist/types/components/Tag/index.d.ts +2 -2
- package/dist/types/components/Tag/index.d.ts.map +1 -1
- package/dist/types/components/Toaster/Toast.d.ts +1 -1
- package/dist/types/components/index.d.ts +24 -3
- package/dist/types/routes.d.ts +2 -1
- package/dist/types/routes.d.ts.map +1 -1
- package/package.json +63 -32
- package/src/components/MarkdownEditor/markdown-editor.css +297 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { cn } from "../../../utils/cn.mjs";
|
|
4
|
+
import { useEditor } from "../novel/components/index.mjs";
|
|
5
|
+
import { useEffect, useRef, useState } from "react";
|
|
6
|
+
import { Check, CheckSquare, ChevronDown, Code, Heading1, Heading2, Heading3, ListOrdered, TextIcon, TextQuote } from "lucide-react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { useIntlayer } from "react-intlayer";
|
|
9
|
+
|
|
10
|
+
//#region src/components/MarkdownEditor/selectors/NodeSelector.tsx
|
|
11
|
+
const items = [
|
|
12
|
+
{
|
|
13
|
+
name: "Text",
|
|
14
|
+
icon: TextIcon,
|
|
15
|
+
command: (editor) => editor.chain().focus().clearNodes().run(),
|
|
16
|
+
isActive: (editor) => editor.isActive("paragraph") && !editor.isActive("bulletList") && !editor.isActive("orderedList")
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: "Heading 1",
|
|
20
|
+
icon: Heading1,
|
|
21
|
+
command: (editor) => editor.chain().focus().clearNodes().toggleHeading({ level: 1 }).run(),
|
|
22
|
+
isActive: (editor) => editor.isActive("heading", { level: 1 })
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: "Heading 2",
|
|
26
|
+
icon: Heading2,
|
|
27
|
+
command: (editor) => editor.chain().focus().clearNodes().toggleHeading({ level: 2 }).run(),
|
|
28
|
+
isActive: (editor) => editor.isActive("heading", { level: 2 })
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: "Heading 3",
|
|
32
|
+
icon: Heading3,
|
|
33
|
+
command: (editor) => editor.chain().focus().clearNodes().toggleHeading({ level: 3 }).run(),
|
|
34
|
+
isActive: (editor) => editor.isActive("heading", { level: 3 })
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: "To-do List",
|
|
38
|
+
icon: CheckSquare,
|
|
39
|
+
command: (editor) => editor.chain().focus().clearNodes().toggleTaskList().run(),
|
|
40
|
+
isActive: (editor) => editor.isActive("taskItem")
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: "Bullet List",
|
|
44
|
+
icon: ListOrdered,
|
|
45
|
+
command: (editor) => editor.chain().focus().clearNodes().toggleBulletList().run(),
|
|
46
|
+
isActive: (editor) => editor.isActive("bulletList")
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "Numbered List",
|
|
50
|
+
icon: ListOrdered,
|
|
51
|
+
command: (editor) => editor.chain().focus().clearNodes().toggleOrderedList().run(),
|
|
52
|
+
isActive: (editor) => editor.isActive("orderedList")
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: "Quote",
|
|
56
|
+
icon: TextQuote,
|
|
57
|
+
command: (editor) => editor.chain().focus().clearNodes().toggleBlockquote().run(),
|
|
58
|
+
isActive: (editor) => editor.isActive("blockquote")
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: "Code",
|
|
62
|
+
icon: Code,
|
|
63
|
+
command: (editor) => editor.chain().focus().clearNodes().toggleCodeBlock().run(),
|
|
64
|
+
isActive: (editor) => editor.isActive("codeBlock")
|
|
65
|
+
}
|
|
66
|
+
];
|
|
67
|
+
/**
|
|
68
|
+
* Bubble-menu selector that converts the current block between paragraph,
|
|
69
|
+
* headings, lists, quote and code.
|
|
70
|
+
*
|
|
71
|
+
* Uses `onMouseDown` + `preventDefault` on every interactive element so the
|
|
72
|
+
* editor's selection is never cleared while the panel is open.
|
|
73
|
+
*/
|
|
74
|
+
const NodeSelector = () => {
|
|
75
|
+
const { editor } = useEditor();
|
|
76
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
77
|
+
const containerRef = useRef(null);
|
|
78
|
+
const content = useIntlayer("markdown-editor");
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (!isOpen) return;
|
|
81
|
+
const handleOutsideMouseDown = (event) => {
|
|
82
|
+
if (!containerRef.current?.contains(event.target)) setIsOpen(false);
|
|
83
|
+
};
|
|
84
|
+
document.addEventListener("mousedown", handleOutsideMouseDown);
|
|
85
|
+
return () => document.removeEventListener("mousedown", handleOutsideMouseDown);
|
|
86
|
+
}, [isOpen]);
|
|
87
|
+
if (!editor) return null;
|
|
88
|
+
const activeItem = items.filter((item) => item.isActive(editor)).pop() ?? { name: "Multiple" };
|
|
89
|
+
const getItemName = (name) => {
|
|
90
|
+
switch (name) {
|
|
91
|
+
case "Text": return content.text.value;
|
|
92
|
+
case "Heading 1": return content.heading1.value;
|
|
93
|
+
case "Heading 2": return content.heading2.value;
|
|
94
|
+
case "Heading 3": return content.heading3.value;
|
|
95
|
+
case "To-do List": return content.todoList.value;
|
|
96
|
+
case "Bullet List": return content.bulletList.value;
|
|
97
|
+
case "Numbered List": return content.numberedList.value;
|
|
98
|
+
case "Quote": return content.quote.value;
|
|
99
|
+
case "Code": return content.code.value;
|
|
100
|
+
case "Multiple": return content.multiple.value;
|
|
101
|
+
default: return name;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
105
|
+
ref: containerRef,
|
|
106
|
+
className: "relative",
|
|
107
|
+
children: [/* @__PURE__ */ jsxs("button", {
|
|
108
|
+
type: "button",
|
|
109
|
+
onMouseDown: (e) => {
|
|
110
|
+
e.preventDefault();
|
|
111
|
+
setIsOpen((prev) => !prev);
|
|
112
|
+
},
|
|
113
|
+
className: "flex items-center gap-1 whitespace-nowrap rounded-none px-3 py-1.5 text-sm hover:bg-accent",
|
|
114
|
+
children: [/* @__PURE__ */ jsx("span", { children: getItemName(activeItem.name) }), /* @__PURE__ */ jsx(ChevronDown, { className: cn("size-3 transition-transform", isOpen && "rotate-180") })]
|
|
115
|
+
}), isOpen && /* @__PURE__ */ jsx("div", {
|
|
116
|
+
className: "absolute top-[calc(100%+0.5rem)] left-0 z-50 w-48 rounded-md border bg-popover p-1 shadow-md",
|
|
117
|
+
children: items.map((item) => /* @__PURE__ */ jsxs("button", {
|
|
118
|
+
type: "button",
|
|
119
|
+
onMouseDown: (e) => {
|
|
120
|
+
e.preventDefault();
|
|
121
|
+
item.command(editor);
|
|
122
|
+
setIsOpen(false);
|
|
123
|
+
},
|
|
124
|
+
className: "flex w-full cursor-pointer items-center justify-between rounded-sm px-2 py-1 text-sm hover:bg-accent",
|
|
125
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
126
|
+
className: "flex items-center space-x-2",
|
|
127
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
128
|
+
className: "rounded-sm border p-1",
|
|
129
|
+
children: /* @__PURE__ */ jsx(item.icon, { className: "size-3" })
|
|
130
|
+
}), /* @__PURE__ */ jsx("span", { children: getItemName(item.name) })]
|
|
131
|
+
}), activeItem.name === item.name && /* @__PURE__ */ jsx(Check, { className: "size-4" })]
|
|
132
|
+
}, item.name))
|
|
133
|
+
})]
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
//#endregion
|
|
138
|
+
export { NodeSelector };
|
|
139
|
+
//# sourceMappingURL=NodeSelector.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeSelector.mjs","names":[],"sources":["../../../../../src/components/MarkdownEditor/selectors/NodeSelector.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@utils/cn';\nimport {\n Check,\n CheckSquare,\n ChevronDown,\n Code,\n Heading1,\n Heading2,\n Heading3,\n ListOrdered,\n type LucideIcon,\n TextIcon,\n TextQuote,\n} from 'lucide-react';\nimport { type FC, useEffect, useRef, useState } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { type EditorInstance, useEditor } from '../novel';\n\nexport type SelectorItem = {\n name: string;\n icon: LucideIcon;\n command: (editor: NonNullable<EditorInstance>) => void;\n isActive: (editor: NonNullable<EditorInstance>) => boolean;\n};\n\nconst items: SelectorItem[] = [\n {\n name: 'Text',\n icon: TextIcon,\n command: (editor) => editor.chain().focus().clearNodes().run(),\n isActive: (editor) =>\n editor.isActive('paragraph') &&\n !editor.isActive('bulletList') &&\n !editor.isActive('orderedList'),\n },\n {\n name: 'Heading 1',\n icon: Heading1,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleHeading({ level: 1 }).run(),\n isActive: (editor) => editor.isActive('heading', { level: 1 }),\n },\n {\n name: 'Heading 2',\n icon: Heading2,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleHeading({ level: 2 }).run(),\n isActive: (editor) => editor.isActive('heading', { level: 2 }),\n },\n {\n name: 'Heading 3',\n icon: Heading3,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleHeading({ level: 3 }).run(),\n isActive: (editor) => editor.isActive('heading', { level: 3 }),\n },\n {\n name: 'To-do List',\n icon: CheckSquare,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleTaskList().run(),\n isActive: (editor) => editor.isActive('taskItem'),\n },\n {\n name: 'Bullet List',\n icon: ListOrdered,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleBulletList().run(),\n isActive: (editor) => editor.isActive('bulletList'),\n },\n {\n name: 'Numbered List',\n icon: ListOrdered,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleOrderedList().run(),\n isActive: (editor) => editor.isActive('orderedList'),\n },\n {\n name: 'Quote',\n icon: TextQuote,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleBlockquote().run(),\n isActive: (editor) => editor.isActive('blockquote'),\n },\n {\n name: 'Code',\n icon: Code,\n command: (editor) =>\n editor.chain().focus().clearNodes().toggleCodeBlock().run(),\n isActive: (editor) => editor.isActive('codeBlock'),\n },\n];\n\n/**\n * Bubble-menu selector that converts the current block between paragraph,\n * headings, lists, quote and code.\n *\n * Uses `onMouseDown` + `preventDefault` on every interactive element so the\n * editor's selection is never cleared while the panel is open.\n */\nexport const NodeSelector: FC = () => {\n const { editor } = useEditor();\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const content = useIntlayer('markdown-editor');\n\n useEffect(() => {\n if (!isOpen) return;\n const handleOutsideMouseDown = (event: MouseEvent) => {\n if (!containerRef.current?.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handleOutsideMouseDown);\n return () =>\n document.removeEventListener('mousedown', handleOutsideMouseDown);\n }, [isOpen]);\n\n if (!editor) return null;\n\n const activeItem = items.filter((item) => item.isActive(editor)).pop() ?? {\n name: 'Multiple',\n };\n\n const getItemName = (name: string) => {\n switch (name) {\n case 'Text':\n return content.text.value;\n case 'Heading 1':\n return content.heading1.value;\n case 'Heading 2':\n return content.heading2.value;\n case 'Heading 3':\n return content.heading3.value;\n case 'To-do List':\n return content.todoList.value;\n case 'Bullet List':\n return content.bulletList.value;\n case 'Numbered List':\n return content.numberedList.value;\n case 'Quote':\n return content.quote.value;\n case 'Code':\n return content.code.value;\n case 'Multiple':\n return content.multiple.value;\n default:\n return name;\n }\n };\n\n return (\n <div ref={containerRef} className=\"relative\">\n <button\n type=\"button\"\n onMouseDown={(e) => {\n e.preventDefault();\n setIsOpen((prev) => !prev);\n }}\n className=\"flex items-center gap-1 whitespace-nowrap rounded-none px-3 py-1.5 text-sm hover:bg-accent\"\n >\n <span>{getItemName(activeItem.name)}</span>\n <ChevronDown\n className={cn('size-3 transition-transform', isOpen && 'rotate-180')}\n />\n </button>\n\n {isOpen && (\n <div className=\"absolute top-[calc(100%+0.5rem)] left-0 z-50 w-48 rounded-md border bg-popover p-1 shadow-md\">\n {items.map((item) => (\n <button\n type=\"button\"\n key={item.name}\n onMouseDown={(e) => {\n e.preventDefault();\n item.command(editor);\n setIsOpen(false);\n }}\n className=\"flex w-full cursor-pointer items-center justify-between rounded-sm px-2 py-1 text-sm hover:bg-accent\"\n >\n <div className=\"flex items-center space-x-2\">\n <div className=\"rounded-sm border p-1\">\n <item.icon className=\"size-3\" />\n </div>\n <span>{getItemName(item.name)}</span>\n </div>\n {activeItem.name === item.name && <Check className=\"size-4\" />}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;AA2BA,MAAM,QAAwB;CAC5B;EACE,MAAM;EACN,MAAM;EACN,UAAU,WAAW,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK;EAC9D,WAAW,WACT,OAAO,SAAS,YAAY,IAC5B,CAAC,OAAO,SAAS,aAAa,IAC9B,CAAC,OAAO,SAAS,cAAc;EAClC;CACD;EACE,MAAM;EACN,MAAM;EACN,UAAU,WACR,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK;EACvE,WAAW,WAAW,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EAC/D;CACD;EACE,MAAM;EACN,MAAM;EACN,UAAU,WACR,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK;EACvE,WAAW,WAAW,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EAC/D;CACD;EACE,MAAM;EACN,MAAM;EACN,UAAU,WACR,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK;EACvE,WAAW,WAAW,OAAO,SAAS,WAAW,EAAE,OAAO,GAAG,CAAC;EAC/D;CACD;EACE,MAAM;EACN,MAAM;EACN,UAAU,WACR,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK;EAC5D,WAAW,WAAW,OAAO,SAAS,WAAW;EAClD;CACD;EACE,MAAM;EACN,MAAM;EACN,UAAU,WACR,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK;EAC9D,WAAW,WAAW,OAAO,SAAS,aAAa;EACpD;CACD;EACE,MAAM;EACN,MAAM;EACN,UAAU,WACR,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,KAAK;EAC/D,WAAW,WAAW,OAAO,SAAS,cAAc;EACrD;CACD;EACE,MAAM;EACN,MAAM;EACN,UAAU,WACR,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK;EAC9D,WAAW,WAAW,OAAO,SAAS,aAAa;EACpD;CACD;EACE,MAAM;EACN,MAAM;EACN,UAAU,WACR,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK;EAC7D,WAAW,WAAW,OAAO,SAAS,YAAY;EACnD;CACF;;;;;;;;AASD,MAAa,qBAAyB;CACpC,MAAM,EAAE,WAAW,WAAW;CAC9B,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;CAC3C,MAAM,eAAe,OAAuB,KAAK;CACjD,MAAM,UAAU,YAAY,kBAAkB;AAE9C,iBAAgB;AACd,MAAI,CAAC,OAAQ;EACb,MAAM,0BAA0B,UAAsB;AACpD,OAAI,CAAC,aAAa,SAAS,SAAS,MAAM,OAAe,CACvD,WAAU,MAAM;;AAGpB,WAAS,iBAAiB,aAAa,uBAAuB;AAC9D,eACE,SAAS,oBAAoB,aAAa,uBAAuB;IAClE,CAAC,OAAO,CAAC;AAEZ,KAAI,CAAC,OAAQ,QAAO;CAEpB,MAAM,aAAa,MAAM,QAAQ,SAAS,KAAK,SAAS,OAAO,CAAC,CAAC,KAAK,IAAI,EACxE,MAAM,YACP;CAED,MAAM,eAAe,SAAiB;AACpC,UAAQ,MAAR;GACE,KAAK,OACH,QAAO,QAAQ,KAAK;GACtB,KAAK,YACH,QAAO,QAAQ,SAAS;GAC1B,KAAK,YACH,QAAO,QAAQ,SAAS;GAC1B,KAAK,YACH,QAAO,QAAQ,SAAS;GAC1B,KAAK,aACH,QAAO,QAAQ,SAAS;GAC1B,KAAK,cACH,QAAO,QAAQ,WAAW;GAC5B,KAAK,gBACH,QAAO,QAAQ,aAAa;GAC9B,KAAK,QACH,QAAO,QAAQ,MAAM;GACvB,KAAK,OACH,QAAO,QAAQ,KAAK;GACtB,KAAK,WACH,QAAO,QAAQ,SAAS;GAC1B,QACE,QAAO;;;AAIb,QACE,qBAAC,OAAD;EAAK,KAAK;EAAc,WAAU;YAAlC,CACE,qBAAC,UAAD;GACE,MAAK;GACL,cAAc,MAAM;AAClB,MAAE,gBAAgB;AAClB,eAAW,SAAS,CAAC,KAAK;;GAE5B,WAAU;aANZ,CAQE,oBAAC,QAAD,YAAO,YAAY,WAAW,KAAK,EAAQ,GAC3C,oBAAC,aAAD,EACE,WAAW,GAAG,+BAA+B,UAAU,aAAa,EACpE,EACK;MAER,UACC,oBAAC,OAAD;GAAK,WAAU;aACZ,MAAM,KAAK,SACV,qBAAC,UAAD;IACE,MAAK;IAEL,cAAc,MAAM;AAClB,OAAE,gBAAgB;AAClB,UAAK,QAAQ,OAAO;AACpB,eAAU,MAAM;;IAElB,WAAU;cARZ,CAUE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,KAAK,MAAN,EAAW,WAAU,UAAW;MAC5B,GACN,oBAAC,QAAD,YAAO,YAAY,KAAK,KAAK,EAAQ,EACjC;QACL,WAAW,SAAS,KAAK,QAAQ,oBAAC,OAAD,EAAO,WAAU,UAAW,EACvD;MAfF,KAAK,KAeH,CACT;GACE,EAEJ"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { cn } from "../../../utils/cn.mjs";
|
|
4
|
+
import { Button } from "../../Button/Button.mjs";
|
|
5
|
+
import { EditorBubbleItem } from "../novel/components/editor-bubble-item.mjs";
|
|
6
|
+
import { useEditor } from "../novel/components/index.mjs";
|
|
7
|
+
import { BoldIcon, CodeIcon, ItalicIcon, StrikethroughIcon, UnderlineIcon } from "lucide-react";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
9
|
+
import { useIntlayer } from "react-intlayer";
|
|
10
|
+
|
|
11
|
+
//#region src/components/MarkdownEditor/selectors/TextButtons.tsx
|
|
12
|
+
/**
|
|
13
|
+
* Inline mark toggles (bold / italic / underline / strike / code) shown in the
|
|
14
|
+
* bubble menu.
|
|
15
|
+
*/
|
|
16
|
+
const TextButtons = () => {
|
|
17
|
+
const { editor } = useEditor();
|
|
18
|
+
const content = useIntlayer("markdown-editor");
|
|
19
|
+
if (!editor) return null;
|
|
20
|
+
const items = [
|
|
21
|
+
{
|
|
22
|
+
name: "bold",
|
|
23
|
+
isActive: (currentEditor) => currentEditor.isActive("bold"),
|
|
24
|
+
command: (currentEditor) => currentEditor.chain().focus().toggleBold().run(),
|
|
25
|
+
icon: BoldIcon
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "italic",
|
|
29
|
+
isActive: (currentEditor) => currentEditor.isActive("italic"),
|
|
30
|
+
command: (currentEditor) => currentEditor.chain().focus().toggleItalic().run(),
|
|
31
|
+
icon: ItalicIcon
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: "underline",
|
|
35
|
+
isActive: (currentEditor) => currentEditor.isActive("underline"),
|
|
36
|
+
command: (currentEditor) => currentEditor.chain().focus().toggleUnderline().run(),
|
|
37
|
+
icon: UnderlineIcon
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "strike",
|
|
41
|
+
isActive: (currentEditor) => currentEditor.isActive("strike"),
|
|
42
|
+
command: (currentEditor) => currentEditor.chain().focus().toggleStrike().run(),
|
|
43
|
+
icon: StrikethroughIcon
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: "code",
|
|
47
|
+
isActive: (currentEditor) => currentEditor.isActive("code"),
|
|
48
|
+
command: (currentEditor) => currentEditor.chain().focus().toggleCode().run(),
|
|
49
|
+
icon: CodeIcon
|
|
50
|
+
}
|
|
51
|
+
];
|
|
52
|
+
const getButtonLabel = (name) => {
|
|
53
|
+
switch (name) {
|
|
54
|
+
case "bold": return content.bold.value;
|
|
55
|
+
case "italic": return content.italic.value;
|
|
56
|
+
case "underline": return content.underline.value;
|
|
57
|
+
case "strike": return content.strike.value;
|
|
58
|
+
case "code": return content.code.value;
|
|
59
|
+
default: return name;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
return /* @__PURE__ */ jsx("div", {
|
|
63
|
+
className: "flex",
|
|
64
|
+
children: items.map((item) => /* @__PURE__ */ jsx(EditorBubbleItem, {
|
|
65
|
+
onSelect: (selectedEditor) => item.command(selectedEditor),
|
|
66
|
+
children: /* @__PURE__ */ jsx(Button, {
|
|
67
|
+
label: getButtonLabel(item.name),
|
|
68
|
+
size: "icon-sm",
|
|
69
|
+
variant: "hoverable",
|
|
70
|
+
color: "text",
|
|
71
|
+
roundedSize: "none",
|
|
72
|
+
Icon: item.icon,
|
|
73
|
+
iconClassName: cn(item.isActive(editor) && "text-blue-500")
|
|
74
|
+
})
|
|
75
|
+
}, item.name))
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
//#endregion
|
|
80
|
+
export { TextButtons };
|
|
81
|
+
//# sourceMappingURL=TextButtons.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextButtons.mjs","names":[],"sources":["../../../../../src/components/MarkdownEditor/selectors/TextButtons.tsx"],"sourcesContent":["'use client';\n\nimport { Button } from '@components/Button';\nimport { cn } from '@utils/cn';\nimport {\n BoldIcon,\n CodeIcon,\n ItalicIcon,\n StrikethroughIcon,\n UnderlineIcon,\n} from 'lucide-react';\nimport { useIntlayer } from 'react-intlayer';\nimport { EditorBubbleItem, useEditor } from '../novel';\nimport type { SelectorItem } from './NodeSelector';\n\n/**\n * Inline mark toggles (bold / italic / underline / strike / code) shown in the\n * bubble menu.\n */\nexport const TextButtons = () => {\n const { editor } = useEditor();\n const content = useIntlayer('markdown-editor');\n\n if (!editor) return null;\n\n const items: SelectorItem[] = [\n {\n name: 'bold',\n isActive: (currentEditor) => currentEditor.isActive('bold'),\n command: (currentEditor) =>\n currentEditor.chain().focus().toggleBold().run(),\n icon: BoldIcon,\n },\n {\n name: 'italic',\n isActive: (currentEditor) => currentEditor.isActive('italic'),\n command: (currentEditor) =>\n currentEditor.chain().focus().toggleItalic().run(),\n icon: ItalicIcon,\n },\n {\n name: 'underline',\n isActive: (currentEditor) => currentEditor.isActive('underline'),\n command: (currentEditor) =>\n currentEditor.chain().focus().toggleUnderline().run(),\n icon: UnderlineIcon,\n },\n {\n name: 'strike',\n isActive: (currentEditor) => currentEditor.isActive('strike'),\n command: (currentEditor) =>\n currentEditor.chain().focus().toggleStrike().run(),\n icon: StrikethroughIcon,\n },\n {\n name: 'code',\n isActive: (currentEditor) => currentEditor.isActive('code'),\n command: (currentEditor) =>\n currentEditor.chain().focus().toggleCode().run(),\n icon: CodeIcon,\n },\n ];\n\n const getButtonLabel = (name: string) => {\n switch (name) {\n case 'bold':\n return content.bold.value;\n case 'italic':\n return content.italic.value;\n case 'underline':\n return content.underline.value;\n case 'strike':\n return content.strike.value;\n case 'code':\n return content.code.value;\n default:\n return name;\n }\n };\n\n return (\n <div className=\"flex\">\n {items.map((item) => (\n <EditorBubbleItem\n key={item.name}\n onSelect={(selectedEditor) => item.command(selectedEditor)}\n >\n <Button\n label={getButtonLabel(item.name)}\n size=\"icon-sm\"\n variant=\"hoverable\"\n color=\"text\"\n roundedSize=\"none\"\n Icon={item.icon}\n iconClassName={cn(item.isActive(editor) && 'text-blue-500')}\n />\n </EditorBubbleItem>\n ))}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;AAmBA,MAAa,oBAAoB;CAC/B,MAAM,EAAE,WAAW,WAAW;CAC9B,MAAM,UAAU,YAAY,kBAAkB;AAE9C,KAAI,CAAC,OAAQ,QAAO;CAEpB,MAAM,QAAwB;EAC5B;GACE,MAAM;GACN,WAAW,kBAAkB,cAAc,SAAS,OAAO;GAC3D,UAAU,kBACR,cAAc,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK;GAClD,MAAM;GACP;EACD;GACE,MAAM;GACN,WAAW,kBAAkB,cAAc,SAAS,SAAS;GAC7D,UAAU,kBACR,cAAc,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK;GACpD,MAAM;GACP;EACD;GACE,MAAM;GACN,WAAW,kBAAkB,cAAc,SAAS,YAAY;GAChE,UAAU,kBACR,cAAc,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK;GACvD,MAAM;GACP;EACD;GACE,MAAM;GACN,WAAW,kBAAkB,cAAc,SAAS,SAAS;GAC7D,UAAU,kBACR,cAAc,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK;GACpD,MAAM;GACP;EACD;GACE,MAAM;GACN,WAAW,kBAAkB,cAAc,SAAS,OAAO;GAC3D,UAAU,kBACR,cAAc,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK;GAClD,MAAM;GACP;EACF;CAED,MAAM,kBAAkB,SAAiB;AACvC,UAAQ,MAAR;GACE,KAAK,OACH,QAAO,QAAQ,KAAK;GACtB,KAAK,SACH,QAAO,QAAQ,OAAO;GACxB,KAAK,YACH,QAAO,QAAQ,UAAU;GAC3B,KAAK,SACH,QAAO,QAAQ,OAAO;GACxB,KAAK,OACH,QAAO,QAAQ,KAAK;GACtB,QACE,QAAO;;;AAIb,QACE,oBAAC,OAAD;EAAK,WAAU;YACZ,MAAM,KAAK,SACV,oBAAC,kBAAD;GAEE,WAAW,mBAAmB,KAAK,QAAQ,eAAe;aAE1D,oBAAC,QAAD;IACE,OAAO,eAAe,KAAK,KAAK;IAChC,MAAK;IACL,SAAQ;IACR,OAAM;IACN,aAAY;IACZ,MAAM,KAAK;IACX,eAAe,GAAG,KAAK,SAAS,OAAO,IAAI,gBAAgB;IAC3D;GACe,EAZZ,KAAK,KAYO,CACnB;EACE"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { YoutubeLogo } from "../SocialNetworks/YoutubeLogo.mjs";
|
|
2
|
+
import { Command, createSuggestionItems, renderItems } from "./novel/extensions/slash-command.mjs";
|
|
3
|
+
import { CheckSquare, Code, Heading1, Heading2, Heading3, ImageIcon, List, ListOrdered, Text, TextQuote } from "lucide-react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
|
|
6
|
+
//#region src/components/MarkdownEditor/slashCommand.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Builds the list of slash-command suggestions. The image command needs the
|
|
9
|
+
* runtime `uploadFn`, hence the factory.
|
|
10
|
+
*
|
|
11
|
+
* @param uploadFn - Novel upload handler used by the "Image" command.
|
|
12
|
+
* @param content - The internationalized content object from useIntlayer.
|
|
13
|
+
*/
|
|
14
|
+
const getSuggestionItems = (uploadFn, content) => createSuggestionItems([
|
|
15
|
+
{
|
|
16
|
+
title: content.text.value,
|
|
17
|
+
description: content.textDesc.value,
|
|
18
|
+
searchTerms: ["p", "paragraph"],
|
|
19
|
+
icon: /* @__PURE__ */ jsx(Text, { className: "size-10" }),
|
|
20
|
+
command: ({ editor, range }) => {
|
|
21
|
+
editor.chain().focus().deleteRange(range).toggleNode("paragraph", "paragraph").run();
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
title: content.todoList.value,
|
|
26
|
+
description: content.todoListDesc.value,
|
|
27
|
+
searchTerms: [
|
|
28
|
+
"todo",
|
|
29
|
+
"task",
|
|
30
|
+
"list",
|
|
31
|
+
"check",
|
|
32
|
+
"checkbox"
|
|
33
|
+
],
|
|
34
|
+
icon: /* @__PURE__ */ jsx(CheckSquare, { className: "size-10" }),
|
|
35
|
+
command: ({ editor, range }) => {
|
|
36
|
+
editor.chain().focus().deleteRange(range).toggleTaskList().run();
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
title: content.heading1.value,
|
|
41
|
+
description: content.heading1Desc.value,
|
|
42
|
+
searchTerms: [
|
|
43
|
+
"title",
|
|
44
|
+
"big",
|
|
45
|
+
"large"
|
|
46
|
+
],
|
|
47
|
+
icon: /* @__PURE__ */ jsx(Heading1, { className: "size-10" }),
|
|
48
|
+
command: ({ editor, range }) => {
|
|
49
|
+
editor.chain().focus().deleteRange(range).setNode("heading", { level: 1 }).run();
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
title: content.heading2.value,
|
|
54
|
+
description: content.heading2Desc.value,
|
|
55
|
+
searchTerms: ["subtitle", "medium"],
|
|
56
|
+
icon: /* @__PURE__ */ jsx(Heading2, { className: "size-10" }),
|
|
57
|
+
command: ({ editor, range }) => {
|
|
58
|
+
editor.chain().focus().deleteRange(range).setNode("heading", { level: 2 }).run();
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
title: content.heading3.value,
|
|
63
|
+
description: content.heading3Desc.value,
|
|
64
|
+
searchTerms: ["subtitle", "small"],
|
|
65
|
+
icon: /* @__PURE__ */ jsx(Heading3, { className: "size-10" }),
|
|
66
|
+
command: ({ editor, range }) => {
|
|
67
|
+
editor.chain().focus().deleteRange(range).setNode("heading", { level: 3 }).run();
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
title: content.bulletList.value,
|
|
72
|
+
description: content.bulletListDesc.value,
|
|
73
|
+
searchTerms: ["unordered", "point"],
|
|
74
|
+
icon: /* @__PURE__ */ jsx(List, { className: "size-10" }),
|
|
75
|
+
command: ({ editor, range }) => {
|
|
76
|
+
editor.chain().focus().deleteRange(range).toggleBulletList().run();
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
title: content.numberedList.value,
|
|
81
|
+
description: content.numberedListDesc.value,
|
|
82
|
+
searchTerms: ["ordered"],
|
|
83
|
+
icon: /* @__PURE__ */ jsx(ListOrdered, { className: "size-10" }),
|
|
84
|
+
command: ({ editor, range }) => {
|
|
85
|
+
editor.chain().focus().deleteRange(range).toggleOrderedList().run();
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
title: content.quote.value,
|
|
90
|
+
description: content.quoteDesc.value,
|
|
91
|
+
searchTerms: ["blockquote"],
|
|
92
|
+
icon: /* @__PURE__ */ jsx(TextQuote, { className: "size-10" }),
|
|
93
|
+
command: ({ editor, range }) => editor.chain().focus().deleteRange(range).toggleNode("paragraph", "paragraph").toggleBlockquote().run()
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
title: content.code.value,
|
|
97
|
+
description: content.codeDesc.value,
|
|
98
|
+
searchTerms: ["codeblock"],
|
|
99
|
+
icon: /* @__PURE__ */ jsx(Code, { className: "size-10" }),
|
|
100
|
+
command: ({ editor, range }) => editor.chain().focus().deleteRange(range).toggleCodeBlock().run()
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
title: content.image.value,
|
|
104
|
+
description: content.imageDesc.value,
|
|
105
|
+
searchTerms: [
|
|
106
|
+
"photo",
|
|
107
|
+
"picture",
|
|
108
|
+
"media"
|
|
109
|
+
],
|
|
110
|
+
icon: /* @__PURE__ */ jsx(ImageIcon, { className: "size-10" }),
|
|
111
|
+
command: ({ editor, range }) => {
|
|
112
|
+
editor.chain().focus().deleteRange(range).run();
|
|
113
|
+
const input = document.createElement("input");
|
|
114
|
+
input.type = "file";
|
|
115
|
+
input.accept = "image/*";
|
|
116
|
+
input.onchange = () => {
|
|
117
|
+
if (input.files?.length) {
|
|
118
|
+
const file = input.files[0];
|
|
119
|
+
const pos = editor.view.state.selection.from;
|
|
120
|
+
uploadFn(file, editor.view, pos);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
input.click();
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
title: content.youtube.value,
|
|
128
|
+
description: content.youtubeDesc.value,
|
|
129
|
+
searchTerms: [
|
|
130
|
+
"video",
|
|
131
|
+
"youtube",
|
|
132
|
+
"embed"
|
|
133
|
+
],
|
|
134
|
+
icon: /* @__PURE__ */ jsx(YoutubeLogo, { className: "size-10" }),
|
|
135
|
+
command: ({ editor, range }) => {
|
|
136
|
+
const videoLink = prompt(content.youtubePrompt.value);
|
|
137
|
+
if (videoLink && /^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w-]+\?v=|embed\/|v\/)?)([\w-]+)(\S+)?$/.test(videoLink)) editor.chain().focus().deleteRange(range).setYoutubeVideo({ src: videoLink }).run();
|
|
138
|
+
else if (videoLink !== null) alert(content.youtubeError.value);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
]);
|
|
142
|
+
/**
|
|
143
|
+
* Builds the slash-command extension wired to the given upload handler.
|
|
144
|
+
*
|
|
145
|
+
* @param uploadFn - Novel upload handler used by the "Image" command.
|
|
146
|
+
* @param content - The internationalized content object from useIntlayer.
|
|
147
|
+
*/
|
|
148
|
+
const createSlashCommand = (uploadFn, content) => {
|
|
149
|
+
const suggestionItems = getSuggestionItems(uploadFn, content);
|
|
150
|
+
return {
|
|
151
|
+
slashCommand: Command.configure({ suggestion: {
|
|
152
|
+
items: () => suggestionItems,
|
|
153
|
+
render: renderItems
|
|
154
|
+
} }),
|
|
155
|
+
suggestionItems
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
//#endregion
|
|
160
|
+
export { createSlashCommand, getSuggestionItems };
|
|
161
|
+
//# sourceMappingURL=slashCommand.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slashCommand.mjs","names":[],"sources":["../../../../src/components/MarkdownEditor/slashCommand.tsx"],"sourcesContent":["import { YoutubeLogo } from '@components/SocialNetworks';\nimport {\n CheckSquare,\n Code,\n Heading1,\n Heading2,\n Heading3,\n ImageIcon,\n List,\n ListOrdered,\n Text,\n TextQuote,\n} from 'lucide-react';\nimport {\n Command,\n createSuggestionItems,\n renderItems,\n type SuggestionItem,\n type UploadFn,\n} from './novel';\n\n/**\n * Builds the list of slash-command suggestions. The image command needs the\n * runtime `uploadFn`, hence the factory.\n *\n * @param uploadFn - Novel upload handler used by the \"Image\" command.\n * @param content - The internationalized content object from useIntlayer.\n */\nexport const getSuggestionItems = (\n uploadFn: UploadFn,\n content: any\n): SuggestionItem[] =>\n createSuggestionItems([\n {\n title: content.text.value,\n description: content.textDesc.value,\n searchTerms: ['p', 'paragraph'],\n icon: <Text className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode('paragraph', 'paragraph')\n .run();\n },\n },\n {\n title: content.todoList.value,\n description: content.todoListDesc.value,\n searchTerms: ['todo', 'task', 'list', 'check', 'checkbox'],\n icon: <CheckSquare className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleTaskList().run();\n },\n },\n {\n title: content.heading1.value,\n description: content.heading1Desc.value,\n searchTerms: ['title', 'big', 'large'],\n icon: <Heading1 className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 1 })\n .run();\n },\n },\n {\n title: content.heading2.value,\n description: content.heading2Desc.value,\n searchTerms: ['subtitle', 'medium'],\n icon: <Heading2 className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 2 })\n .run();\n },\n },\n {\n title: content.heading3.value,\n description: content.heading3Desc.value,\n searchTerms: ['subtitle', 'small'],\n icon: <Heading3 className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setNode('heading', { level: 3 })\n .run();\n },\n },\n {\n title: content.bulletList.value,\n description: content.bulletListDesc.value,\n searchTerms: ['unordered', 'point'],\n icon: <List className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleBulletList().run();\n },\n },\n {\n title: content.numberedList.value,\n description: content.numberedListDesc.value,\n searchTerms: ['ordered'],\n icon: <ListOrdered className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleOrderedList().run();\n },\n },\n {\n title: content.quote.value,\n description: content.quoteDesc.value,\n searchTerms: ['blockquote'],\n icon: <TextQuote className=\"size-10\" />,\n command: ({ editor, range }) =>\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .toggleNode('paragraph', 'paragraph')\n .toggleBlockquote()\n .run(),\n },\n {\n title: content.code.value,\n description: content.codeDesc.value,\n searchTerms: ['codeblock'],\n icon: <Code className=\"size-10\" />,\n command: ({ editor, range }) =>\n editor.chain().focus().deleteRange(range).toggleCodeBlock().run(),\n },\n {\n title: content.image.value,\n description: content.imageDesc.value,\n searchTerms: ['photo', 'picture', 'media'],\n icon: <ImageIcon className=\"size-10\" />,\n command: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).run();\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = 'image/*';\n input.onchange = () => {\n if (input.files?.length) {\n const file = input.files[0];\n const pos = editor.view.state.selection.from;\n uploadFn(file, editor.view, pos);\n }\n };\n input.click();\n },\n },\n {\n title: content.youtube.value,\n description: content.youtubeDesc.value,\n searchTerms: ['video', 'youtube', 'embed'],\n icon: <YoutubeLogo className=\"size-10\" />,\n command: ({ editor, range }) => {\n const videoLink = prompt(content.youtubePrompt.value);\n // From https://regexr.com/3dj5t\n const ytRegex =\n /^((?:https?:)?\\/\\/)?((?:www|m)\\.)?((?:youtube\\.com|youtu.be))(\\/(?:[\\w-]+\\?v=|embed\\/|v\\/)?)([\\w-]+)(\\S+)?$/;\n\n if (videoLink && ytRegex.test(videoLink)) {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .setYoutubeVideo({ src: videoLink })\n .run();\n } else if (videoLink !== null) {\n alert(content.youtubeError.value);\n }\n },\n },\n ]);\n\n/**\n * Builds the slash-command extension wired to the given upload handler.\n *\n * @param uploadFn - Novel upload handler used by the \"Image\" command.\n * @param content - The internationalized content object from useIntlayer.\n */\nexport const createSlashCommand = (uploadFn: UploadFn, content: any) => {\n const suggestionItems = getSuggestionItems(uploadFn, content);\n\n const slashCommand = Command.configure({\n suggestion: {\n items: () => suggestionItems,\n render: renderItems,\n },\n });\n\n return { slashCommand, suggestionItems };\n};\n"],"mappings":";;;;;;;;;;;;;AA4BA,MAAa,sBACX,UACA,YAEA,sBAAsB;CACpB;EACE,OAAO,QAAQ,KAAK;EACpB,aAAa,QAAQ,SAAS;EAC9B,aAAa,CAAC,KAAK,YAAY;EAC/B,MAAM,oBAAC,MAAD,EAAM,WAAU,WAAY;EAClC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UACG,OAAO,CACP,OAAO,CACP,YAAY,MAAM,CAClB,WAAW,aAAa,YAAY,CACpC,KAAK;;EAEX;CACD;EACE,OAAO,QAAQ,SAAS;EACxB,aAAa,QAAQ,aAAa;EAClC,aAAa;GAAC;GAAQ;GAAQ;GAAQ;GAAS;GAAW;EAC1D,MAAM,oBAAC,aAAD,EAAa,WAAU,WAAY;EACzC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UAAO,OAAO,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,gBAAgB,CAAC,KAAK;;EAEnE;CACD;EACE,OAAO,QAAQ,SAAS;EACxB,aAAa,QAAQ,aAAa;EAClC,aAAa;GAAC;GAAS;GAAO;GAAQ;EACtC,MAAM,oBAAC,UAAD,EAAU,WAAU,WAAY;EACtC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UACG,OAAO,CACP,OAAO,CACP,YAAY,MAAM,CAClB,QAAQ,WAAW,EAAE,OAAO,GAAG,CAAC,CAChC,KAAK;;EAEX;CACD;EACE,OAAO,QAAQ,SAAS;EACxB,aAAa,QAAQ,aAAa;EAClC,aAAa,CAAC,YAAY,SAAS;EACnC,MAAM,oBAAC,UAAD,EAAU,WAAU,WAAY;EACtC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UACG,OAAO,CACP,OAAO,CACP,YAAY,MAAM,CAClB,QAAQ,WAAW,EAAE,OAAO,GAAG,CAAC,CAChC,KAAK;;EAEX;CACD;EACE,OAAO,QAAQ,SAAS;EACxB,aAAa,QAAQ,aAAa;EAClC,aAAa,CAAC,YAAY,QAAQ;EAClC,MAAM,oBAAC,UAAD,EAAU,WAAU,WAAY;EACtC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UACG,OAAO,CACP,OAAO,CACP,YAAY,MAAM,CAClB,QAAQ,WAAW,EAAE,OAAO,GAAG,CAAC,CAChC,KAAK;;EAEX;CACD;EACE,OAAO,QAAQ,WAAW;EAC1B,aAAa,QAAQ,eAAe;EACpC,aAAa,CAAC,aAAa,QAAQ;EACnC,MAAM,oBAAC,MAAD,EAAM,WAAU,WAAY;EAClC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UAAO,OAAO,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,kBAAkB,CAAC,KAAK;;EAErE;CACD;EACE,OAAO,QAAQ,aAAa;EAC5B,aAAa,QAAQ,iBAAiB;EACtC,aAAa,CAAC,UAAU;EACxB,MAAM,oBAAC,aAAD,EAAa,WAAU,WAAY;EACzC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UAAO,OAAO,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,mBAAmB,CAAC,KAAK;;EAEtE;CACD;EACE,OAAO,QAAQ,MAAM;EACrB,aAAa,QAAQ,UAAU;EAC/B,aAAa,CAAC,aAAa;EAC3B,MAAM,oBAAC,WAAD,EAAW,WAAU,WAAY;EACvC,UAAU,EAAE,QAAQ,YAClB,OACG,OAAO,CACP,OAAO,CACP,YAAY,MAAM,CAClB,WAAW,aAAa,YAAY,CACpC,kBAAkB,CAClB,KAAK;EACX;CACD;EACE,OAAO,QAAQ,KAAK;EACpB,aAAa,QAAQ,SAAS;EAC9B,aAAa,CAAC,YAAY;EAC1B,MAAM,oBAAC,MAAD,EAAM,WAAU,WAAY;EAClC,UAAU,EAAE,QAAQ,YAClB,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,iBAAiB,CAAC,KAAK;EACpE;CACD;EACE,OAAO,QAAQ,MAAM;EACrB,aAAa,QAAQ,UAAU;EAC/B,aAAa;GAAC;GAAS;GAAW;GAAQ;EAC1C,MAAM,oBAAC,WAAD,EAAW,WAAU,WAAY;EACvC,UAAU,EAAE,QAAQ,YAAY;AAC9B,UAAO,OAAO,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,KAAK;GAC/C,MAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,SAAM,OAAO;AACb,SAAM,SAAS;AACf,SAAM,iBAAiB;AACrB,QAAI,MAAM,OAAO,QAAQ;KACvB,MAAM,OAAO,MAAM,MAAM;KACzB,MAAM,MAAM,OAAO,KAAK,MAAM,UAAU;AACxC,cAAS,MAAM,OAAO,MAAM,IAAI;;;AAGpC,SAAM,OAAO;;EAEhB;CACD;EACE,OAAO,QAAQ,QAAQ;EACvB,aAAa,QAAQ,YAAY;EACjC,aAAa;GAAC;GAAS;GAAW;GAAQ;EAC1C,MAAM,oBAAC,aAAD,EAAa,WAAU,WAAY;EACzC,UAAU,EAAE,QAAQ,YAAY;GAC9B,MAAM,YAAY,OAAO,QAAQ,cAAc,MAAM;AAKrD,OAAI,aAAa,8GAAQ,KAAK,UAAU,CACtC,QACG,OAAO,CACP,OAAO,CACP,YAAY,MAAM,CAClB,gBAAgB,EAAE,KAAK,WAAW,CAAC,CACnC,KAAK;YACC,cAAc,KACvB,OAAM,QAAQ,aAAa,MAAM;;EAGtC;CACF,CAAC;;;;;;;AAQJ,MAAa,sBAAsB,UAAoB,YAAiB;CACtE,MAAM,kBAAkB,mBAAmB,UAAU,QAAQ;AAS7D,QAAO;EAAE,cAPY,QAAQ,UAAU,EACrC,YAAY;GACV,aAAa;GACb,QAAQ;GACT,EACF,CAEoB;EAAE;EAAiB"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { cn } from "../../utils/cn.mjs";
|
|
4
|
-
import { useGetElementOrWindow } from "../../hooks/useGetElementOrWindow.mjs";
|
|
5
|
-
import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
|
|
6
4
|
import { Button } from "../Button/Button.mjs";
|
|
7
5
|
import { Container } from "../Container/index.mjs";
|
|
6
|
+
import { useGetElementOrWindow } from "../../hooks/useGetElementOrWindow.mjs";
|
|
7
|
+
import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
|
|
8
8
|
import { H3 } from "../Headers/index.mjs";
|
|
9
9
|
import { useEffect } from "react";
|
|
10
10
|
import { cva } from "class-variance-authority";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { cn } from "../../utils/cn.mjs";
|
|
4
|
+
import { MaxHeightSmoother } from "../MaxHeightSmoother/index.mjs";
|
|
4
5
|
import { useScrollBlockage } from "../../hooks/useScrollBlockage/index.mjs";
|
|
5
6
|
import { useScrollDetection } from "../../hooks/useScrollDetection.mjs";
|
|
6
|
-
import { MaxHeightSmoother } from "../MaxHeightSmoother/index.mjs";
|
|
7
7
|
import { Burger } from "./Burger.mjs";
|
|
8
8
|
import { useRef, useState } from "react";
|
|
9
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { cn } from "../../utils/cn.mjs";
|
|
4
|
-
import { useItemSelector } from "../../hooks/useItemSelector.mjs";
|
|
5
4
|
import { Button } from "../Button/Button.mjs";
|
|
5
|
+
import { useItemSelector } from "../../hooks/useItemSelector.mjs";
|
|
6
6
|
import { useEffect, useRef } from "react";
|
|
7
7
|
import { cva } from "class-variance-authority";
|
|
8
8
|
import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react";
|