notra-editor 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -8
- package/dist/components/blockquote-button/blockquote-button.cjs +91 -0
- package/dist/components/blockquote-button/blockquote-button.cjs.map +1 -0
- package/dist/components/blockquote-button/blockquote-button.d.cts +9 -0
- package/dist/components/blockquote-button/blockquote-button.d.ts +9 -0
- package/dist/components/blockquote-button/blockquote-button.mjs +67 -0
- package/dist/components/blockquote-button/blockquote-button.mjs.map +1 -0
- package/dist/components/code-block-button/code-block-button.cjs +91 -0
- package/dist/components/code-block-button/code-block-button.cjs.map +1 -0
- package/dist/components/code-block-button/code-block-button.d.cts +9 -0
- package/dist/components/code-block-button/code-block-button.d.ts +9 -0
- package/dist/components/code-block-button/code-block-button.mjs +67 -0
- package/dist/components/code-block-button/code-block-button.mjs.map +1 -0
- package/dist/components/code-block-view.cjs +39 -0
- package/dist/components/code-block-view.cjs.map +1 -0
- package/dist/components/code-block-view.d.cts +12 -0
- package/dist/components/code-block-view.d.ts +12 -0
- package/dist/components/code-block-view.mjs +17 -0
- package/dist/components/code-block-view.mjs.map +1 -0
- package/dist/components/copy-button.cjs +49 -0
- package/dist/components/copy-button.cjs.map +1 -0
- package/dist/components/copy-button.d.cts +9 -0
- package/dist/components/copy-button.d.ts +9 -0
- package/dist/components/copy-button.mjs +25 -0
- package/dist/components/copy-button.mjs.map +1 -0
- package/dist/components/heading-dropdown-menu/heading-dropdown-menu.cjs +67 -0
- package/dist/components/heading-dropdown-menu/heading-dropdown-menu.cjs.map +1 -0
- package/dist/components/heading-dropdown-menu/heading-dropdown-menu.d.cts +17 -0
- package/dist/components/heading-dropdown-menu/heading-dropdown-menu.d.ts +17 -0
- package/dist/components/heading-dropdown-menu/heading-dropdown-menu.mjs +51 -0
- package/dist/components/heading-dropdown-menu/heading-dropdown-menu.mjs.map +1 -0
- package/dist/components/heading-dropdown-menu/heading-menu-item.cjs +56 -0
- package/dist/components/heading-dropdown-menu/heading-menu-item.cjs.map +1 -0
- package/dist/components/heading-dropdown-menu/heading-menu-item.d.cts +12 -0
- package/dist/components/heading-dropdown-menu/heading-menu-item.d.ts +12 -0
- package/dist/components/heading-dropdown-menu/heading-menu-item.mjs +32 -0
- package/dist/components/heading-dropdown-menu/heading-menu-item.mjs.map +1 -0
- package/dist/components/heading-dropdown-menu/use-heading.cjs +109 -0
- package/dist/components/heading-dropdown-menu/use-heading.cjs.map +1 -0
- package/dist/components/heading-dropdown-menu/use-heading.d.cts +19 -0
- package/dist/components/heading-dropdown-menu/use-heading.d.ts +19 -0
- package/dist/components/heading-dropdown-menu/use-heading.mjs +83 -0
- package/dist/components/heading-dropdown-menu/use-heading.mjs.map +1 -0
- package/dist/components/link-popover/link-popover.cjs +148 -0
- package/dist/components/link-popover/link-popover.cjs.map +1 -0
- package/dist/components/link-popover/link-popover.d.cts +9 -0
- package/dist/components/link-popover/link-popover.d.ts +9 -0
- package/dist/components/link-popover/link-popover.mjs +129 -0
- package/dist/components/link-popover/link-popover.mjs.map +1 -0
- package/dist/components/link-popover/use-link-popover.cjs +71 -0
- package/dist/components/link-popover/use-link-popover.cjs.map +1 -0
- package/dist/components/link-popover/use-link-popover.d.cts +17 -0
- package/dist/components/link-popover/use-link-popover.d.ts +17 -0
- package/dist/components/link-popover/use-link-popover.mjs +47 -0
- package/dist/components/link-popover/use-link-popover.mjs.map +1 -0
- package/dist/components/list-dropdown-menu/list-dropdown-menu.cjs +73 -0
- package/dist/components/list-dropdown-menu/list-dropdown-menu.cjs.map +1 -0
- package/dist/components/list-dropdown-menu/list-dropdown-menu.d.cts +17 -0
- package/dist/components/list-dropdown-menu/list-dropdown-menu.d.ts +17 -0
- package/dist/components/list-dropdown-menu/list-dropdown-menu.mjs +57 -0
- package/dist/components/list-dropdown-menu/list-dropdown-menu.mjs.map +1 -0
- package/dist/components/list-dropdown-menu/list-menu-item.cjs +56 -0
- package/dist/components/list-dropdown-menu/list-menu-item.cjs.map +1 -0
- package/dist/components/list-dropdown-menu/list-menu-item.d.cts +12 -0
- package/dist/components/list-dropdown-menu/list-menu-item.d.ts +12 -0
- package/dist/components/list-dropdown-menu/list-menu-item.mjs +32 -0
- package/dist/components/list-dropdown-menu/list-menu-item.mjs.map +1 -0
- package/dist/components/list-dropdown-menu/use-list.cjs +111 -0
- package/dist/components/list-dropdown-menu/use-list.cjs.map +1 -0
- package/dist/components/list-dropdown-menu/use-list.d.cts +19 -0
- package/dist/components/list-dropdown-menu/use-list.d.ts +19 -0
- package/dist/components/list-dropdown-menu/use-list.mjs +85 -0
- package/dist/components/list-dropdown-menu/use-list.mjs.map +1 -0
- package/dist/components/mark-button/mark-button.cjs +72 -0
- package/dist/components/mark-button/mark-button.cjs.map +1 -0
- package/dist/components/mark-button/mark-button.d.cts +12 -0
- package/dist/components/mark-button/mark-button.d.ts +12 -0
- package/dist/components/mark-button/mark-button.mjs +48 -0
- package/dist/components/mark-button/mark-button.mjs.map +1 -0
- package/dist/components/mark-button/use-mark.cjs +71 -0
- package/dist/components/mark-button/use-mark.cjs.map +1 -0
- package/dist/components/mark-button/use-mark.d.cts +17 -0
- package/dist/components/mark-button/use-mark.d.ts +17 -0
- package/dist/components/mark-button/use-mark.mjs +47 -0
- package/dist/components/mark-button/use-mark.mjs.map +1 -0
- package/dist/components/toolbar/toolbar.cjs +77 -0
- package/dist/components/toolbar/toolbar.cjs.map +1 -0
- package/dist/components/toolbar/toolbar.d.cts +14 -0
- package/dist/components/toolbar/toolbar.d.ts +14 -0
- package/dist/components/toolbar/toolbar.mjs +51 -0
- package/dist/components/toolbar/toolbar.mjs.map +1 -0
- package/dist/components/ui/button.cjs +82 -0
- package/dist/components/ui/button.cjs.map +1 -0
- package/dist/components/ui/button.d.cts +14 -0
- package/dist/components/ui/button.d.ts +14 -0
- package/dist/components/ui/button.mjs +57 -0
- package/dist/components/ui/button.mjs.map +1 -0
- package/dist/components/ui/dropdown-menu.cjs +290 -0
- package/dist/components/ui/dropdown-menu.cjs.map +1 -0
- package/dist/components/ui/dropdown-menu.d.cts +32 -0
- package/dist/components/ui/dropdown-menu.d.ts +32 -0
- package/dist/components/ui/dropdown-menu.mjs +252 -0
- package/dist/components/ui/dropdown-menu.mjs.map +1 -0
- package/dist/components/ui/input.cjs +44 -0
- package/dist/components/ui/input.cjs.map +1 -0
- package/dist/components/ui/input.d.cts +6 -0
- package/dist/components/ui/input.d.ts +6 -0
- package/dist/components/ui/input.mjs +20 -0
- package/dist/components/ui/input.mjs.map +1 -0
- package/dist/components/ui/popover.cjs +72 -0
- package/dist/components/ui/popover.cjs.map +1 -0
- package/dist/components/ui/popover.d.cts +10 -0
- package/dist/components/ui/popover.d.ts +10 -0
- package/dist/components/ui/popover.mjs +45 -0
- package/dist/components/ui/popover.mjs.map +1 -0
- package/dist/components/ui/separator.cjs +51 -0
- package/dist/components/ui/separator.cjs.map +1 -0
- package/dist/components/ui/separator.d.cts +7 -0
- package/dist/components/ui/separator.d.ts +7 -0
- package/dist/components/ui/separator.mjs +27 -0
- package/dist/components/ui/separator.mjs.map +1 -0
- package/dist/components/ui/spacer.cjs +32 -0
- package/dist/components/ui/spacer.cjs.map +1 -0
- package/dist/components/ui/spacer.d.cts +5 -0
- package/dist/components/ui/spacer.d.ts +5 -0
- package/dist/components/ui/spacer.mjs +8 -0
- package/dist/components/ui/spacer.mjs.map +1 -0
- package/dist/components/undo-redo-button/undo-redo-button.cjs +63 -0
- package/dist/components/undo-redo-button/undo-redo-button.cjs.map +1 -0
- package/dist/components/undo-redo-button/undo-redo-button.d.cts +12 -0
- package/dist/components/undo-redo-button/undo-redo-button.d.ts +12 -0
- package/dist/components/undo-redo-button/undo-redo-button.mjs +39 -0
- package/dist/components/undo-redo-button/undo-redo-button.mjs.map +1 -0
- package/dist/components/undo-redo-button/use-undo-redo.cjs +68 -0
- package/dist/components/undo-redo-button/use-undo-redo.cjs.map +1 -0
- package/dist/components/undo-redo-button/use-undo-redo.d.cts +17 -0
- package/dist/components/undo-redo-button/use-undo-redo.d.ts +17 -0
- package/dist/components/undo-redo-button/use-undo-redo.mjs +44 -0
- package/dist/components/undo-redo-button/use-undo-redo.mjs.map +1 -0
- package/dist/extensions/code-block.cjs +46 -0
- package/dist/extensions/code-block.cjs.map +1 -0
- package/dist/extensions/code-block.d.cts +6 -0
- package/dist/extensions/code-block.d.ts +6 -0
- package/dist/extensions/code-block.mjs +12 -0
- package/dist/extensions/code-block.mjs.map +1 -0
- package/dist/extensions/editor.cjs +53 -0
- package/dist/extensions/editor.cjs.map +1 -0
- package/dist/extensions/editor.d.cts +9 -0
- package/dist/extensions/editor.d.ts +9 -0
- package/dist/extensions/editor.mjs +19 -0
- package/dist/extensions/editor.mjs.map +1 -0
- package/dist/extensions/index.cjs +32 -0
- package/dist/extensions/index.cjs.map +1 -0
- package/dist/extensions/index.d.cts +7 -0
- package/dist/extensions/index.d.ts +7 -0
- package/dist/extensions/index.mjs +7 -0
- package/dist/extensions/index.mjs.map +1 -0
- package/dist/extensions/shared.cjs +64 -0
- package/dist/extensions/shared.cjs.map +1 -0
- package/dist/extensions/shared.d.cts +8 -0
- package/dist/extensions/shared.d.ts +8 -0
- package/dist/extensions/shared.mjs +29 -0
- package/dist/extensions/shared.mjs.map +1 -0
- package/dist/hooks/use-copy-to-clipboard.cjs +50 -0
- package/dist/hooks/use-copy-to-clipboard.cjs.map +1 -0
- package/dist/hooks/use-copy-to-clipboard.d.cts +10 -0
- package/dist/hooks/use-copy-to-clipboard.d.ts +10 -0
- package/dist/hooks/use-copy-to-clipboard.mjs +26 -0
- package/dist/hooks/use-copy-to-clipboard.mjs.map +1 -0
- package/dist/hooks/use-markdown-editor.cjs +80 -0
- package/dist/hooks/use-markdown-editor.cjs.map +1 -0
- package/dist/hooks/use-markdown-editor.d.cts +13 -0
- package/dist/hooks/use-markdown-editor.d.ts +13 -0
- package/dist/hooks/use-markdown-editor.mjs +56 -0
- package/dist/hooks/use-markdown-editor.mjs.map +1 -0
- package/dist/icons/redo-icon.cjs +54 -0
- package/dist/icons/redo-icon.cjs.map +1 -0
- package/dist/icons/redo-icon.d.cts +7 -0
- package/dist/icons/redo-icon.d.ts +7 -0
- package/dist/icons/redo-icon.mjs +30 -0
- package/dist/icons/redo-icon.mjs.map +1 -0
- package/dist/icons/undo-icon.cjs +54 -0
- package/dist/icons/undo-icon.cjs.map +1 -0
- package/dist/icons/undo-icon.d.cts +7 -0
- package/dist/icons/undo-icon.d.ts +7 -0
- package/dist/icons/undo-icon.mjs +30 -0
- package/dist/icons/undo-icon.mjs.map +1 -0
- package/dist/index.cjs +24 -1322
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +22 -105
- package/dist/index.d.ts +22 -105
- package/dist/index.mjs +14 -1301
- package/dist/index.mjs.map +1 -1
- package/dist/lib/utils.cjs +33 -0
- package/dist/lib/utils.cjs.map +1 -0
- package/dist/lib/utils.d.cts +5 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.mjs +9 -0
- package/dist/lib/utils.mjs.map +1 -0
- package/dist/notra-editor.cjs +88 -0
- package/dist/notra-editor.cjs.map +1 -0
- package/dist/notra-editor.d.cts +17 -0
- package/dist/notra-editor.d.ts +17 -0
- package/dist/notra-editor.mjs +68 -0
- package/dist/notra-editor.mjs.map +1 -0
- package/dist/notra-reader.cjs +47 -0
- package/dist/notra-reader.cjs.map +1 -0
- package/dist/notra-reader.d.cts +11 -0
- package/dist/notra-reader.d.ts +11 -0
- package/dist/notra-reader.mjs +23 -0
- package/dist/notra-reader.mjs.map +1 -0
- package/dist/styles/globals.css +29 -0
- package/dist/themes/default/editor.css +2 -0
- package/dist/themes/default/reader.css +2 -0
- package/dist/utils/markdown-to-json.cjs +50 -0
- package/dist/utils/markdown-to-json.cjs.map +1 -0
- package/dist/utils/markdown-to-json.d.cts +7 -0
- package/dist/utils/markdown-to-json.d.ts +7 -0
- package/dist/utils/markdown-to-json.mjs +26 -0
- package/dist/utils/markdown-to-json.mjs.map +1 -0
- package/package.json +2 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/notra-editor.tsx","../src/components/blockquote-button/blockquote-button.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/code-block-button/code-block-button.tsx","../src/components/heading-dropdown-menu/heading-dropdown-menu.tsx","../src/components/heading-dropdown-menu/heading-menu-item.tsx","../src/components/heading-dropdown-menu/use-heading.ts","../src/components/ui/dropdown-menu.tsx","../src/components/link-popover/link-popover.tsx","../src/components/link-popover/use-link-popover.ts","../src/components/ui/input.tsx","../src/components/ui/popover.tsx","../src/components/ui/separator.tsx","../src/components/list-dropdown-menu/list-dropdown-menu.tsx","../src/components/list-dropdown-menu/list-menu-item.tsx","../src/components/list-dropdown-menu/use-list.ts","../src/components/mark-button/mark-button.tsx","../src/components/mark-button/use-mark.ts","../src/components/toolbar/toolbar.tsx","../src/components/ui-primitive/spacer.tsx","../src/components/undo-redo-button/undo-redo-button.tsx","../src/components/undo-redo-button/use-undo-redo.ts","../src/hooks/use-markdown-editor.ts","../src/extensions/shared.ts","../src/extensions/editor.ts","../src/notra-reader.tsx","../src/utils/markdown-to-json.ts","../src/components/ui-primitive/dropdown-menu.tsx"],"sourcesContent":["import './styles/globals.css';\n\nexport { NotraEditor } from './notra-editor';\nexport type { NotraEditorProps } from './notra-editor';\n\nexport { NotraReader } from './notra-reader';\nexport type { NotraReaderProps } from './notra-reader';\n\nexport {\n\tToolbar,\n\tToolbarGroup,\n\tToolbarSeparator\n} from './components/toolbar/toolbar';\nexport type {\n\tToolbarProps,\n\tToolbarSeparatorProps\n} from './components/toolbar/toolbar';\n\nexport { UndoRedoButton } from './components/undo-redo-button/undo-redo-button';\nexport type { UndoRedoButtonProps } from './components/undo-redo-button/undo-redo-button';\n\nexport { Spacer } from './components/ui-primitive/spacer';\nexport { DropdownMenu } from './components/ui-primitive/dropdown-menu';\nexport type { DropdownMenuProps } from './components/ui-primitive/dropdown-menu';\n\nexport { MarkButton } from './components/mark-button/mark-button';\nexport type { MarkButtonProps } from './components/mark-button/mark-button';\nexport type { MarkType } from './components/mark-button/use-mark';\n\nexport { HeadingDropdownMenu } from './components/heading-dropdown-menu/heading-dropdown-menu';\nexport type { HeadingDropdownMenuProps } from './components/heading-dropdown-menu/heading-dropdown-menu';\n\nexport { ListDropdownMenu } from './components/list-dropdown-menu/list-dropdown-menu';\nexport type { ListDropdownMenuProps } from './components/list-dropdown-menu/list-dropdown-menu';\n\nexport { BlockquoteButton } from './components/blockquote-button/blockquote-button';\nexport type { BlockquoteButtonProps } from './components/blockquote-button/blockquote-button';\n\nexport { CodeBlockButton } from './components/code-block-button/code-block-button';\nexport type { CodeBlockButtonProps } from './components/code-block-button/code-block-button';\n\nexport { LinkPopover } from './components/link-popover/link-popover';\nexport type { LinkPopoverProps } from './components/link-popover/link-popover';\n","import { EditorContent } from '@tiptap/react';\n\nimport { BlockquoteButton } from './components/blockquote-button/blockquote-button';\nimport { CodeBlockButton } from './components/code-block-button/code-block-button';\nimport { HeadingDropdownMenu } from './components/heading-dropdown-menu/heading-dropdown-menu';\nimport { LinkPopover } from './components/link-popover/link-popover';\nimport { ListDropdownMenu } from './components/list-dropdown-menu/list-dropdown-menu';\nimport { MarkButton } from './components/mark-button/mark-button';\nimport {\n\tToolbar,\n\tToolbarGroup,\n\tToolbarSeparator\n} from './components/toolbar/toolbar';\nimport { Spacer } from './components/ui-primitive/spacer';\nimport { UndoRedoButton } from './components/undo-redo-button/undo-redo-button';\nimport { useMarkdownEditor } from './hooks/use-markdown-editor';\n\nexport interface NotraEditorProps {\n\t/** Markdown content (source of truth) */\n\tvalue: string;\n\t/** Called when content changes, receives updated Markdown */\n\tonChange: (value: string) => void;\n\t/** Placeholder text shown when editor is empty */\n\tplaceholder?: string;\n\t/** Disable editing */\n\treadOnly?: boolean;\n\t/** Additional CSS class on the wrapper element */\n\tclassName?: string;\n}\n\nexport function NotraEditor({\n\tvalue,\n\tonChange,\n\tplaceholder,\n\treadOnly = false,\n\tclassName\n}: NotraEditorProps) {\n\tconst { editor } = useMarkdownEditor({\n\t\tvalue,\n\t\tonChange,\n\t\tplaceholder,\n\t\teditable: !readOnly\n\t});\n\n\tconst classNames = ['notra', 'notra-editor', className]\n\t\t.filter(Boolean)\n\t\t.join(' ');\n\n\treturn (\n\t\t<div className={classNames}>\n\t\t\t<Toolbar variant=\"fixed\">\n\t\t\t\t<Spacer />\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<UndoRedoButton action=\"undo\" editor={editor} />\n\t\t\t\t\t<UndoRedoButton action=\"redo\" editor={editor} />\n\t\t\t\t</ToolbarGroup>\n\t\t\t\t<ToolbarSeparator />\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<HeadingDropdownMenu editor={editor} levels={[1, 2, 3, 4]} />\n\t\t\t\t\t<ListDropdownMenu\n\t\t\t\t\t\teditor={editor}\n\t\t\t\t\t\ttypes={['bulletList', 'orderedList', 'taskList']}\n\t\t\t\t\t/>\n\t\t\t\t\t<BlockquoteButton editor={editor} />\n\t\t\t\t\t<CodeBlockButton editor={editor} />\n\t\t\t\t</ToolbarGroup>\n\t\t\t\t<ToolbarSeparator />\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<MarkButton editor={editor} type=\"bold\" />\n\t\t\t\t\t<MarkButton editor={editor} type=\"italic\" />\n\t\t\t\t\t<MarkButton editor={editor} type=\"strike\" />\n\t\t\t\t\t<MarkButton editor={editor} type=\"code\" />\n\t\t\t\t\t<LinkPopover editor={editor} />\n\t\t\t\t</ToolbarGroup>\n\t\t\t\t<Spacer />\n\t\t\t</Toolbar>\n\t\t\t<EditorContent className=\"notra-editor-content\" editor={editor} />\n\t\t</div>\n\t);\n}\n","import { TextQuote } from 'lucide-react';\nimport { forwardRef, useCallback, useEffect, useState } from 'react';\n\nimport { Button } from '../ui/button';\n\nimport type { Editor } from '@tiptap/core';\n\nexport interface BlockquoteButtonProps extends Omit<\n\tReact.ButtonHTMLAttributes<HTMLButtonElement>,\n\t'type'\n> {\n\teditor: Editor | null;\n}\n\nfunction canToggleBlockquote(editor: Editor | null): boolean {\n\tif (!editor || !editor.isEditable) return false;\n\n\treturn editor.can().toggleWrap('blockquote') || editor.can().clearNodes();\n}\n\nexport const BlockquoteButton = forwardRef<\n\tHTMLButtonElement,\n\tBlockquoteButtonProps\n>(({ editor, onClick, ...buttonProps }, ref) => {\n\tconst [isActive, setIsActive] = useState(false);\n\tconst [canToggle, setCanToggle] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst update = () => {\n\t\t\tsetIsActive(editor.isActive('blockquote'));\n\t\t\tsetCanToggle(canToggleBlockquote(editor));\n\t\t};\n\n\t\tupdate();\n\n\t\teditor.on('selectionUpdate', update);\n\t\teditor.on('transaction', update);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', update);\n\t\t\teditor.off('transaction', update);\n\t\t};\n\t}, [editor]);\n\n\tconst handleClick = useCallback(\n\t\t(event: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\tonClick?.(event);\n\n\t\t\tif (event.defaultPrevented) return;\n\n\t\t\tif (!editor) return;\n\n\t\t\tif (editor.isActive('blockquote')) {\n\t\t\t\teditor.chain().focus().lift('blockquote').run();\n\t\t\t} else {\n\t\t\t\t// clearNodes first to convert any block type to paragraph,\n\t\t\t\t// then wrap in blockquote\n\t\t\t\teditor.chain().focus().clearNodes().wrapIn('blockquote').run();\n\t\t\t}\n\t\t},\n\t\t[editor, onClick]\n\t);\n\n\treturn (\n\t\t<Button\n\t\t\tref={ref}\n\t\t\taria-label=\"Blockquote\"\n\t\t\taria-pressed={isActive}\n\t\t\tdata-active-state={isActive ? 'on' : 'off'}\n\t\t\tdisabled={!canToggle}\n\t\t\tsize=\"icon\"\n\t\t\ttabIndex={-1}\n\t\t\ttype=\"button\"\n\t\t\tvariant=\"ghost\"\n\t\t\tonClick={handleClick}\n\t\t\t{...buttonProps}\n\t\t>\n\t\t\t<TextQuote\n\t\t\t\tclassName={isActive ? 'nt:text-[var(--tt-brand-color-500)]' : undefined}\n\t\t\t/>\n\t\t</Button>\n\t);\n});\n\nBlockquoteButton.displayName = 'BlockquoteButton';\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport { Slot } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nconst buttonVariants = cva(\n\t'nt:group/button nt:inline-flex nt:shrink-0 nt:items-center nt:justify-center nt:rounded-lg nt:border nt:border-transparent nt:bg-clip-padding nt:text-sm nt:font-medium nt:whitespace-nowrap nt:transition-all nt:outline-none nt:select-none nt:focus-visible:border-ring nt:focus-visible:ring-3 nt:focus-visible:ring-ring/50 nt:active:not-aria-[haspopup]:translate-y-px nt:disabled:pointer-events-none nt:disabled:opacity-50 nt:aria-invalid:border-destructive nt:aria-invalid:ring-3 nt:aria-invalid:ring-destructive/20 nt:dark:aria-invalid:border-destructive/50 nt:dark:aria-invalid:ring-destructive/40 nt:[&_svg]:pointer-events-none nt:[&_svg]:shrink-0 nt:[&_svg:not([class*=size-])]:size-4',\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault:\n\t\t\t\t\t'nt:bg-primary nt:text-primary-foreground nt:[a]:hover:bg-primary/80',\n\t\t\t\toutline:\n\t\t\t\t\t'nt:border-border nt:bg-background nt:hover:bg-muted nt:hover:text-foreground nt:aria-expanded:bg-muted nt:aria-expanded:text-foreground nt:dark:border-input nt:dark:bg-input/30 nt:dark:hover:bg-input/50',\n\t\t\t\tsecondary:\n\t\t\t\t\t'nt:bg-secondary nt:text-secondary-foreground nt:hover:bg-secondary/80 nt:aria-expanded:bg-secondary nt:aria-expanded:text-secondary-foreground',\n\t\t\t\tghost:\n\t\t\t\t\t'nt:hover:bg-muted nt:hover:text-foreground nt:aria-expanded:bg-muted nt:aria-expanded:text-foreground nt:dark:hover:bg-muted/50',\n\t\t\t\tdestructive:\n\t\t\t\t\t'nt:bg-destructive/10 nt:text-destructive nt:hover:bg-destructive/20 nt:focus-visible:border-destructive/40 nt:focus-visible:ring-destructive/20 nt:dark:bg-destructive/20 nt:dark:hover:bg-destructive/30 nt:dark:focus-visible:ring-destructive/40',\n\t\t\t\tlink: 'nt:text-primary nt:underline-offset-4 nt:hover:underline'\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault:\n\t\t\t\t\t'nt:h-8 nt:gap-1.5 nt:px-2.5 nt:has-data-[icon=inline-end]:pr-2 nt:has-data-[icon=inline-start]:pl-2',\n\t\t\t\txs: 'nt:h-6 nt:gap-1 nt:rounded-[min(var(--radius-md),10px)] nt:px-2 nt:text-xs nt:in-data-[slot=button-group]:rounded-lg nt:has-data-[icon=inline-end]:pr-1.5 nt:has-data-[icon=inline-start]:pl-1.5 nt:[&_svg:not([class*=size-])]:size-3',\n\t\t\t\tsm: 'nt:h-7 nt:gap-1 nt:rounded-[min(var(--radius-md),12px)] nt:px-2.5 nt:text-[0.8rem] nt:in-data-[slot=button-group]:rounded-lg nt:has-data-[icon=inline-end]:pr-1.5 nt:has-data-[icon=inline-start]:pl-1.5 nt:[&_svg:not([class*=size-])]:size-3.5',\n\t\t\t\tlg: 'nt:h-9 nt:gap-1.5 nt:px-2.5 nt:has-data-[icon=inline-end]:pr-2 nt:has-data-[icon=inline-start]:pl-2',\n\t\t\t\ticon: 'nt:size-8',\n\t\t\t\t'icon-xs':\n\t\t\t\t\t'nt:size-6 nt:rounded-[min(var(--radius-md),10px)] nt:in-data-[slot=button-group]:rounded-lg nt:[&_svg:not([class*=size-])]:size-3',\n\t\t\t\t'icon-sm':\n\t\t\t\t\t'nt:size-7 nt:rounded-[min(var(--radius-md),12px)] nt:in-data-[slot=button-group]:rounded-lg',\n\t\t\t\t'icon-lg': 'nt:size-9'\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: 'default',\n\t\t\tsize: 'default'\n\t\t}\n\t}\n);\n\nfunction Button({\n\tclassName,\n\tvariant = 'default',\n\tsize = 'default',\n\tasChild = false,\n\t...props\n}: React.ComponentProps<'button'> &\n\tVariantProps<typeof buttonVariants> & {\n\t\tasChild?: boolean;\n\t}) {\n\tconst Comp = asChild ? Slot.Root : 'button';\n\n\treturn (\n\t\t<Comp\n\t\t\tclassName={cn(buttonVariants({ variant, size, className }))}\n\t\t\tdata-size={size}\n\t\t\tdata-slot=\"button\"\n\t\t\tdata-variant={variant}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Button, buttonVariants };\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","import { SquareCode } from 'lucide-react';\nimport { forwardRef, useCallback, useEffect, useState } from 'react';\n\nimport { Button } from '../ui/button';\n\nimport type { Editor } from '@tiptap/core';\n\nexport interface CodeBlockButtonProps extends Omit<\n\tReact.ButtonHTMLAttributes<HTMLButtonElement>,\n\t'type'\n> {\n\teditor: Editor | null;\n}\n\nfunction canToggleCodeBlock(editor: Editor | null): boolean {\n\tif (!editor || !editor.isEditable) return false;\n\n\treturn (\n\t\teditor.can().toggleNode('codeBlock', 'paragraph') ||\n\t\teditor.can().clearNodes()\n\t);\n}\n\nexport const CodeBlockButton = forwardRef<\n\tHTMLButtonElement,\n\tCodeBlockButtonProps\n>(({ editor, onClick, ...buttonProps }, ref) => {\n\tconst [isActive, setIsActive] = useState(false);\n\tconst [canToggle, setCanToggle] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst update = () => {\n\t\t\tsetIsActive(editor.isActive('codeBlock'));\n\t\t\tsetCanToggle(canToggleCodeBlock(editor));\n\t\t};\n\n\t\tupdate();\n\n\t\teditor.on('selectionUpdate', update);\n\t\teditor.on('transaction', update);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', update);\n\t\t\teditor.off('transaction', update);\n\t\t};\n\t}, [editor]);\n\n\tconst handleClick = useCallback(\n\t\t(event: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\tonClick?.(event);\n\n\t\t\tif (event.defaultPrevented) return;\n\n\t\t\tif (!editor) return;\n\n\t\t\tif (editor.isActive('codeBlock')) {\n\t\t\t\teditor.chain().focus().setNode('paragraph').run();\n\t\t\t} else {\n\t\t\t\t// clearNodes first to convert any block type to paragraph,\n\t\t\t\t// then toggle to codeBlock\n\t\t\t\teditor\n\t\t\t\t\t.chain()\n\t\t\t\t\t.focus()\n\t\t\t\t\t.clearNodes()\n\t\t\t\t\t.toggleNode('codeBlock', 'paragraph')\n\t\t\t\t\t.run();\n\t\t\t}\n\t\t},\n\t\t[editor, onClick]\n\t);\n\n\treturn (\n\t\t<Button\n\t\t\tref={ref}\n\t\t\taria-label=\"Code Block\"\n\t\t\taria-pressed={isActive}\n\t\t\tdata-active-state={isActive ? 'on' : 'off'}\n\t\t\tdisabled={!canToggle}\n\t\t\tsize=\"icon\"\n\t\t\ttabIndex={-1}\n\t\t\ttype=\"button\"\n\t\t\tvariant=\"ghost\"\n\t\t\tonClick={handleClick}\n\t\t\t{...buttonProps}\n\t\t>\n\t\t\t<SquareCode\n\t\t\t\tclassName={isActive ? 'nt:text-[var(--tt-brand-color-500)]' : undefined}\n\t\t\t/>\n\t\t</Button>\n\t);\n});\n\nCodeBlockButton.displayName = 'CodeBlockButton';\n","import { ChevronDown } from 'lucide-react';\nimport { forwardRef } from 'react';\n\nimport { HeadingMenuItem } from './heading-menu-item';\nimport {\n\tgetHeadingTriggerIcon,\n\tuseActiveHeadingLevel,\n\ttype HeadingLevel\n} from './use-heading';\nimport { Button } from '../ui/button';\nimport {\n\tDropdownMenu,\n\tDropdownMenuTrigger,\n\tDropdownMenuContent,\n\tDropdownMenuGroup\n} from '../ui/dropdown-menu';\n\nimport type { Editor } from '@tiptap/core';\nimport type { ComponentProps } from 'react';\n\nexport interface HeadingDropdownMenuProps extends Omit<\n\tComponentProps<typeof Button>,\n\t'type'\n> {\n\teditor: Editor | null;\n\tlevels?: HeadingLevel[];\n}\n\nexport const HeadingDropdownMenu = forwardRef<\n\tHTMLButtonElement,\n\tHeadingDropdownMenuProps\n>(({ editor, levels = [1, 2, 3, 4], ...buttonProps }, ref) => {\n\tconst activeLevel = useActiveHeadingLevel(editor, levels);\n\tconst TriggerIcon = getHeadingTriggerIcon(activeLevel);\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\tref={ref}\n\t\t\t\t\taria-label=\"Heading\"\n\t\t\t\t\tclassName=\"nt:gap-1 nt:px-2\"\n\t\t\t\t\tdata-active-state={activeLevel !== null ? 'on' : 'off'}\n\t\t\t\t\tsize=\"default\"\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t{...buttonProps}\n\t\t\t\t>\n\t\t\t\t\t<TriggerIcon\n\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\tactiveLevel !== null\n\t\t\t\t\t\t\t\t? 'nt:text-[var(--tt-brand-color-500)]'\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t<ChevronDown className=\"nt:size-3\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent align=\"start\">\n\t\t\t\t<DropdownMenuGroup>\n\t\t\t\t\t{levels.map((level) => (\n\t\t\t\t\t\t<HeadingMenuItem key={level} editor={editor} level={level} />\n\t\t\t\t\t))}\n\t\t\t\t</DropdownMenuGroup>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n});\n\nHeadingDropdownMenu.displayName = 'HeadingDropdownMenu';\n","import { forwardRef } from 'react';\n\nimport { useHeading, type HeadingLevel } from './use-heading';\nimport { DropdownMenuItem } from '../ui/dropdown-menu';\n\nimport type { Editor } from '@tiptap/core';\n\nexport interface HeadingMenuItemProps {\n\teditor: Editor | null;\n\tlevel: HeadingLevel;\n}\n\nexport const HeadingMenuItem = forwardRef<HTMLDivElement, HeadingMenuItemProps>(\n\t({ editor, level }, ref) => {\n\t\tconst { isActive, canToggle, handleToggle, label, Icon } = useHeading({\n\t\t\teditor,\n\t\t\tlevel\n\t\t});\n\n\t\treturn (\n\t\t\t<DropdownMenuItem\n\t\t\t\tref={ref}\n\t\t\t\taria-label={label}\n\t\t\t\tclassName=\"nt:data-[active-state=on]:bg-accent nt:data-[active-state=on]:text-[var(--tt-brand-color-500)]\"\n\t\t\t\tdata-active-state={isActive ? 'on' : 'off'}\n\t\t\t\tdisabled={!canToggle}\n\t\t\t\tonSelect={handleToggle}\n\t\t\t>\n\t\t\t\t<Icon />\n\t\t\t\t<span>{label}</span>\n\t\t\t</DropdownMenuItem>\n\t\t);\n\t}\n);\n\nHeadingMenuItem.displayName = 'HeadingMenuItem';\n","import { Heading, Heading1, Heading2, Heading3, Heading4 } from 'lucide-react';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { Editor } from '@tiptap/core';\nimport type { LucideIcon } from 'lucide-react';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4;\n\ntype IconComponent = LucideIcon;\n\nconst headingIcons: Record<HeadingLevel, IconComponent> = {\n\t1: Heading1,\n\t2: Heading2,\n\t3: Heading3,\n\t4: Heading4\n};\n\nconst headingLabels: Record<HeadingLevel, string> = {\n\t1: 'Heading 1',\n\t2: 'Heading 2',\n\t3: 'Heading 3',\n\t4: 'Heading 4'\n};\n\nfunction canToggleHeading(editor: Editor | null, level: HeadingLevel): boolean {\n\tif (!editor || !editor.isEditable) return false;\n\n\treturn (\n\t\teditor.can().setNode('heading', { level }) || editor.can().clearNodes()\n\t);\n}\n\nexport function useHeading({\n\teditor,\n\tlevel\n}: {\n\teditor: Editor | null;\n\tlevel: HeadingLevel;\n}) {\n\tconst [isActive, setIsActive] = useState(false);\n\tconst [canToggle, setCanToggle] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tsetIsActive(editor.isActive('heading', { level }));\n\t\t\tsetCanToggle(canToggleHeading(editor, level));\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, level]);\n\n\tconst handleToggle = useCallback(() => {\n\t\tif (!editor || !editor.isEditable) return false;\n\n\t\tif (editor.isActive('heading', { level })) {\n\t\t\treturn editor.chain().focus().setNode('paragraph').run();\n\t\t}\n\n\t\t// clearNodes first to convert any block type to paragraph,\n\t\t// then set heading\n\t\treturn editor\n\t\t\t.chain()\n\t\t\t.focus()\n\t\t\t.clearNodes()\n\t\t\t.setNode('heading', { level })\n\t\t\t.run();\n\t}, [editor, level]);\n\n\treturn {\n\t\tisActive,\n\t\tcanToggle,\n\t\thandleToggle,\n\t\tlabel: headingLabels[level],\n\t\tIcon: headingIcons[level]\n\t};\n}\n\nexport function useActiveHeadingLevel(\n\teditor: Editor | null,\n\tlevels: HeadingLevel[]\n): HeadingLevel | null {\n\tconst [activeLevel, setActiveLevel] = useState<HeadingLevel | null>(null);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tconst found = levels.find((level) =>\n\t\t\t\teditor.isActive('heading', { level })\n\t\t\t);\n\n\t\t\tsetActiveLevel(found ?? null);\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, levels]);\n\n\treturn activeLevel;\n}\n\nexport function getHeadingTriggerIcon(\n\tactiveLevel: HeadingLevel | null\n): IconComponent {\n\tif (activeLevel === null) return Heading;\n\n\treturn headingIcons[activeLevel];\n}\n","import { CheckIcon, ChevronRightIcon } from 'lucide-react';\nimport { DropdownMenu as DropdownMenuPrimitive } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nfunction DropdownMenu({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n\treturn <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuPortal({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n\t);\n}\n\nfunction DropdownMenuTrigger({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Trigger\n\t\t\tdata-slot=\"dropdown-menu-trigger\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuContent({\n\tclassName,\n\talign = 'start',\n\tsideOffset = 4,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Portal>\n\t\t\t<DropdownMenuPrimitive.Content\n\t\t\t\talign={align}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'nt:z-50 nt:max-h-(--radix-dropdown-menu-content-available-height) nt:w-(--radix-dropdown-menu-trigger-width) nt:min-w-32 nt:origin-(--radix-dropdown-menu-content-transform-origin) nt:overflow-x-hidden nt:overflow-y-auto nt:rounded-lg nt:bg-popover nt:p-1 nt:text-popover-foreground nt:shadow-md nt:ring-1 nt:ring-foreground/10 nt:duration-100 nt:data-[side=bottom]:slide-in-from-top-2 nt:data-[side=left]:slide-in-from-right-2 nt:data-[side=right]:slide-in-from-left-2 nt:data-[side=top]:slide-in-from-bottom-2 nt:data-[state=closed]:overflow-hidden nt:data-open:animate-in nt:data-open:fade-in-0 nt:data-open:zoom-in-95 nt:data-closed:animate-out nt:data-closed:fade-out-0 nt:data-closed:zoom-out-95',\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\tdata-slot=\"dropdown-menu-content\"\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</DropdownMenuPrimitive.Portal>\n\t);\n}\n\nfunction DropdownMenuGroup({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n\t);\n}\n\nfunction DropdownMenuItem({\n\tclassName,\n\tinset,\n\tvariant = 'default',\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n\tinset?: boolean;\n\tvariant?: 'default' | 'destructive';\n}) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Item\n\t\t\tclassName={cn(\n\t\t\t\t'nt:group/dropdown-menu-item nt:relative nt:flex nt:cursor-default nt:items-center nt:gap-1.5 nt:rounded-md nt:px-1.5 nt:py-1 nt:text-sm nt:outline-hidden nt:select-none nt:focus:bg-accent nt:focus:text-accent-foreground nt:not-data-[variant=destructive]:focus:**:text-accent-foreground nt:data-inset:pl-7 nt:data-[variant=destructive]:text-destructive nt:data-[variant=destructive]:focus:bg-destructive/10 nt:data-[variant=destructive]:focus:text-destructive nt:dark:data-[variant=destructive]:focus:bg-destructive/20 nt:data-disabled:pointer-events-none nt:data-disabled:opacity-50 nt:[&_svg]:pointer-events-none nt:[&_svg]:shrink-0 nt:[&_svg:not([class*=size-])]:size-4 nt:data-[variant=destructive]:*:[svg]:text-destructive',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-inset={inset}\n\t\t\tdata-slot=\"dropdown-menu-item\"\n\t\t\tdata-variant={variant}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuCheckboxItem({\n\tclassName,\n\tchildren,\n\tchecked,\n\tinset,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<DropdownMenuPrimitive.CheckboxItem\n\t\t\tchecked={checked}\n\t\t\tclassName={cn(\n\t\t\t\t'nt:relative nt:flex nt:cursor-default nt:items-center nt:gap-1.5 nt:rounded-md nt:py-1 nt:pr-8 nt:pl-1.5 nt:text-sm nt:outline-hidden nt:select-none nt:focus:bg-accent nt:focus:text-accent-foreground nt:focus:**:text-accent-foreground nt:data-inset:pl-7 nt:data-disabled:pointer-events-none nt:data-disabled:opacity-50 nt:[&_svg]:pointer-events-none nt:[&_svg]:shrink-0 nt:[&_svg:not([class*=size-])]:size-4',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-inset={inset}\n\t\t\tdata-slot=\"dropdown-menu-checkbox-item\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<span\n\t\t\t\tclassName=\"nt:pointer-events-none nt:absolute nt:right-2 nt:flex nt:items-center nt:justify-center\"\n\t\t\t\tdata-slot=\"dropdown-menu-checkbox-item-indicator\"\n\t\t\t>\n\t\t\t\t<DropdownMenuPrimitive.ItemIndicator>\n\t\t\t\t\t<CheckIcon />\n\t\t\t\t</DropdownMenuPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</DropdownMenuPrimitive.CheckboxItem>\n\t);\n}\n\nfunction DropdownMenuRadioGroup({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.RadioGroup\n\t\t\tdata-slot=\"dropdown-menu-radio-group\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuRadioItem({\n\tclassName,\n\tchildren,\n\tinset,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<DropdownMenuPrimitive.RadioItem\n\t\t\tclassName={cn(\n\t\t\t\t'nt:relative nt:flex nt:cursor-default nt:items-center nt:gap-1.5 nt:rounded-md nt:py-1 nt:pr-8 nt:pl-1.5 nt:text-sm nt:outline-hidden nt:select-none nt:focus:bg-accent nt:focus:text-accent-foreground nt:focus:**:text-accent-foreground nt:data-inset:pl-7 nt:data-disabled:pointer-events-none nt:data-disabled:opacity-50 nt:[&_svg]:pointer-events-none nt:[&_svg]:shrink-0 nt:[&_svg:not([class*=size-])]:size-4',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-inset={inset}\n\t\t\tdata-slot=\"dropdown-menu-radio-item\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<span\n\t\t\t\tclassName=\"nt:pointer-events-none nt:absolute nt:right-2 nt:flex nt:items-center nt:justify-center\"\n\t\t\t\tdata-slot=\"dropdown-menu-radio-item-indicator\"\n\t\t\t>\n\t\t\t\t<DropdownMenuPrimitive.ItemIndicator>\n\t\t\t\t\t<CheckIcon />\n\t\t\t\t</DropdownMenuPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</DropdownMenuPrimitive.RadioItem>\n\t);\n}\n\nfunction DropdownMenuLabel({\n\tclassName,\n\tinset,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Label\n\t\t\tclassName={cn(\n\t\t\t\t'nt:px-1.5 nt:py-1 nt:text-xs nt:font-medium nt:text-muted-foreground nt:data-inset:pl-7',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-inset={inset}\n\t\t\tdata-slot=\"dropdown-menu-label\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuSeparator({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.Separator\n\t\t\tclassName={cn('nt:-mx-1 nt:my-1 nt:h-px nt:bg-border', className)}\n\t\t\tdata-slot=\"dropdown-menu-separator\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuShortcut({\n\tclassName,\n\t...props\n}: React.ComponentProps<'span'>) {\n\treturn (\n\t\t<span\n\t\t\tclassName={cn(\n\t\t\t\t'nt:ml-auto nt:text-xs nt:tracking-widest nt:text-muted-foreground nt:group-focus/dropdown-menu-item:text-accent-foreground',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-slot=\"dropdown-menu-shortcut\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuSub({\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n\treturn <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n\tclassName,\n\tinset,\n\tchildren,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n\tinset?: boolean;\n}) {\n\treturn (\n\t\t<DropdownMenuPrimitive.SubTrigger\n\t\t\tclassName={cn(\n\t\t\t\t'nt:flex nt:cursor-default nt:items-center nt:gap-1.5 nt:rounded-md nt:px-1.5 nt:py-1 nt:text-sm nt:outline-hidden nt:select-none nt:focus:bg-accent nt:focus:text-accent-foreground nt:not-data-[variant=destructive]:focus:**:text-accent-foreground nt:data-inset:pl-7 nt:data-open:bg-accent nt:data-open:text-accent-foreground nt:[&_svg]:pointer-events-none nt:[&_svg]:shrink-0 nt:[&_svg:not([class*=size-])]:size-4',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-inset={inset}\n\t\t\tdata-slot=\"dropdown-menu-sub-trigger\"\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ChevronRightIcon className=\"nt:ml-auto\" />\n\t\t</DropdownMenuPrimitive.SubTrigger>\n\t);\n}\n\nfunction DropdownMenuSubContent({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n\treturn (\n\t\t<DropdownMenuPrimitive.SubContent\n\t\t\tclassName={cn(\n\t\t\t\t'nt:z-50 nt:min-w-[96px] nt:origin-(--radix-dropdown-menu-content-transform-origin) nt:overflow-hidden nt:rounded-lg nt:bg-popover nt:p-1 nt:text-popover-foreground nt:shadow-lg nt:ring-1 nt:ring-foreground/10 nt:duration-100 nt:data-[side=bottom]:slide-in-from-top-2 nt:data-[side=left]:slide-in-from-right-2 nt:data-[side=right]:slide-in-from-left-2 nt:data-[side=top]:slide-in-from-bottom-2 nt:data-open:animate-in nt:data-open:fade-in-0 nt:data-open:zoom-in-95 nt:data-closed:animate-out nt:data-closed:fade-out-0 nt:data-closed:zoom-out-95',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-slot=\"dropdown-menu-sub-content\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tDropdownMenu,\n\tDropdownMenuPortal,\n\tDropdownMenuTrigger,\n\tDropdownMenuContent,\n\tDropdownMenuGroup,\n\tDropdownMenuLabel,\n\tDropdownMenuItem,\n\tDropdownMenuCheckboxItem,\n\tDropdownMenuRadioGroup,\n\tDropdownMenuRadioItem,\n\tDropdownMenuSeparator,\n\tDropdownMenuShortcut,\n\tDropdownMenuSub,\n\tDropdownMenuSubTrigger,\n\tDropdownMenuSubContent\n};\n","import {\n\tCornerDownLeft,\n\tExternalLink,\n\tLink as LinkIcon,\n\tTrash2\n} from 'lucide-react';\nimport { forwardRef, useCallback, useEffect, useState } from 'react';\n\nimport { useLinkPopover } from './use-link-popover';\nimport { Button } from '../ui/button';\nimport { Input } from '../ui/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport { Separator } from '../ui/separator';\n\nimport type { Editor } from '@tiptap/core';\n\nexport interface LinkPopoverProps extends Omit<\n\tReact.ButtonHTMLAttributes<HTMLButtonElement>,\n\t'type'\n> {\n\teditor: Editor | null;\n}\n\nexport const LinkPopover = forwardRef<HTMLButtonElement, LinkPopoverProps>(\n\t({ editor, ...buttonProps }, ref) => {\n\t\tconst [isOpen, setIsOpen] = useState(false);\n\n\t\tconst { url, setUrl, isActive, canSet, setLink, removeLink, openLink } =\n\t\t\tuseLinkPopover({ editor });\n\n\t\t// Auto-open popover when a link becomes active\n\t\tuseEffect(() => {\n\t\t\tif (isActive) {\n\t\t\t\tsetIsOpen(true);\n\t\t\t}\n\t\t}, [isActive]);\n\n\t\tconst handleSetLink = useCallback(() => {\n\t\t\tsetLink();\n\t\t\tsetIsOpen(false);\n\t\t}, [setLink]);\n\n\t\tconst handleRemoveLink = useCallback(() => {\n\t\t\tremoveLink();\n\t\t\tsetIsOpen(false);\n\t\t}, [removeLink]);\n\n\t\tconst handleKeyDown = useCallback(\n\t\t\t(event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\t\tif (event.key === 'Enter') {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\thandleSetLink();\n\t\t\t\t}\n\t\t\t},\n\t\t\t[handleSetLink]\n\t\t);\n\n\t\treturn (\n\t\t\t<Popover open={isOpen} onOpenChange={setIsOpen}>\n\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\taria-label=\"Link\"\n\t\t\t\t\t\taria-pressed={isActive}\n\t\t\t\t\t\tdata-active-state={isActive ? 'on' : 'off'}\n\t\t\t\t\t\tdisabled={!canSet}\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t{...buttonProps}\n\t\t\t\t\t>\n\t\t\t\t\t\t<LinkIcon\n\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\tisActive ? 'nt:text-[var(--tt-brand-color-500)]' : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Button>\n\t\t\t\t</PopoverTrigger>\n\t\t\t\t<PopoverContent\n\t\t\t\t\talign=\"start\"\n\t\t\t\t\tclassName=\"nt:flex nt:w-auto nt:items-center nt:gap-1 nt:p-1\"\n\t\t\t\t>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\tclassName=\"nt:h-7 nt:min-w-48 nt:border-none nt:shadow-none nt:focus-visible:ring-0\"\n\t\t\t\t\t\tplaceholder=\"Paste a link...\"\n\t\t\t\t\t\ttype=\"url\"\n\t\t\t\t\t\tvalue={url}\n\t\t\t\t\t\tonChange={(e) => setUrl(e.target.value)}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t/>\n\t\t\t\t\t<Button\n\t\t\t\t\t\taria-label=\"Apply link\"\n\t\t\t\t\t\tdisabled={!url && !isActive}\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tonClick={handleSetLink}\n\t\t\t\t\t>\n\t\t\t\t\t\t<CornerDownLeft />\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Separator className=\"nt:h-5\" orientation=\"vertical\" />\n\t\t\t\t\t<Button\n\t\t\t\t\t\taria-label=\"Open link in new window\"\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tonClick={openLink}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ExternalLink />\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\taria-label=\"Remove link\"\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tonClick={handleRemoveLink}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trash2 />\n\t\t\t\t\t</Button>\n\t\t\t\t</PopoverContent>\n\t\t\t</Popover>\n\t\t);\n\t}\n);\n\nLinkPopover.displayName = 'LinkPopover';\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { Editor } from '@tiptap/core';\n\nexport interface UseLinkPopoverConfig {\n\teditor: Editor | null;\n}\n\nexport function useLinkPopover({ editor }: UseLinkPopoverConfig) {\n\tconst [url, setUrl] = useState('');\n\tconst [isActive, setIsActive] = useState(false);\n\tconst [canSet, setCanSet] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tconst active = editor.isActive('link');\n\n\t\t\tsetIsActive(active);\n\t\t\tsetCanSet(editor.isEditable);\n\n\t\t\tif (active) {\n\t\t\t\tsetUrl(editor.getAttributes('link').href ?? '');\n\t\t\t}\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor]);\n\n\tconst setLink = useCallback(() => {\n\t\tif (!editor) return;\n\n\t\tif (!url) {\n\t\t\teditor.chain().focus().extendMarkRange('link').unsetLink().run();\n\n\t\t\treturn;\n\t\t}\n\n\t\teditor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\n\t}, [editor, url]);\n\n\tconst removeLink = useCallback(() => {\n\t\tif (!editor) return;\n\n\t\teditor.chain().focus().extendMarkRange('link').unsetLink().run();\n\t\tsetUrl('');\n\t}, [editor]);\n\n\tconst openLink = useCallback(() => {\n\t\tif (!url) return;\n\n\t\tconst sanitized = /^https?:\\/\\//i.test(url) ? url : `https://${url}`;\n\n\t\twindow.open(sanitized, '_blank', 'noopener,noreferrer');\n\t}, [url]);\n\n\treturn { url, setUrl, isActive, canSet, setLink, removeLink, openLink };\n}\n","import * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nfunction Input({ className, type, ...props }: React.ComponentProps<'input'>) {\n\treturn (\n\t\t<input\n\t\t\tclassName={cn(\n\t\t\t\t'nt:flex nt:h-9 nt:w-full nt:min-w-0 nt:rounded-md nt:border nt:border-input nt:bg-transparent nt:px-3 nt:py-1 nt:text-base nt:shadow-xs nt:transition-[color,box-shadow] nt:outline-none nt:file:inline-flex nt:file:h-7 nt:file:border-0 nt:file:bg-transparent nt:file:text-sm nt:file:font-medium nt:file:text-foreground nt:placeholder:text-muted-foreground nt:selection:bg-primary nt:selection:text-primary-foreground nt:dark:bg-input/30 nt:md:text-sm nt:focus-visible:border-ring nt:focus-visible:ring-3 nt:focus-visible:ring-ring/50 nt:aria-invalid:border-destructive nt:aria-invalid:ring-3 nt:aria-invalid:ring-destructive/20 nt:dark:aria-invalid:ring-destructive/40 nt:disabled:cursor-not-allowed nt:disabled:opacity-50',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-slot=\"input\"\n\t\t\ttype={type}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Input };\n","import { Popover as PopoverPrimitive } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nfunction Popover({\n\t...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n\treturn <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nfunction PopoverTrigger({\n\t...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n\treturn <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nfunction PopoverAnchor({\n\t...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n\treturn <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />;\n}\n\nfunction PopoverContent({\n\tclassName,\n\talign = 'center',\n\tsideOffset = 4,\n\t...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n\treturn (\n\t\t<PopoverPrimitive.Portal>\n\t\t\t<PopoverPrimitive.Content\n\t\t\t\talign={align}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'nt:z-50 nt:w-72 nt:origin-(--radix-popover-content-transform-origin) nt:rounded-lg nt:bg-popover nt:p-4 nt:text-popover-foreground nt:shadow-md nt:ring-1 nt:ring-foreground/10 nt:outline-none nt:data-[side=bottom]:slide-in-from-top-2 nt:data-[side=left]:slide-in-from-right-2 nt:data-[side=right]:slide-in-from-left-2 nt:data-[side=top]:slide-in-from-bottom-2 nt:data-open:animate-in nt:data-open:fade-in-0 nt:data-open:zoom-in-95 nt:data-closed:animate-out nt:data-closed:fade-out-0 nt:data-closed:zoom-out-95',\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\tdata-slot=\"popover-content\"\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</PopoverPrimitive.Portal>\n\t);\n}\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };\n","import { Separator as SeparatorPrimitive } from 'radix-ui';\nimport * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nfunction Separator({\n\tclassName,\n\torientation = 'horizontal',\n\tdecorative = true,\n\t...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n\treturn (\n\t\t<SeparatorPrimitive.Root\n\t\t\tclassName={cn(\n\t\t\t\t'nt:shrink-0 nt:bg-border nt:data-[orientation=horizontal]:h-px nt:data-[orientation=horizontal]:w-full nt:data-[orientation=vertical]:h-full nt:data-[orientation=vertical]:w-px',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-slot=\"separator\"\n\t\t\tdecorative={decorative}\n\t\t\torientation={orientation}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Separator };\n","import { ChevronDown } from 'lucide-react';\nimport { forwardRef } from 'react';\n\nimport { ListMenuItem } from './list-menu-item';\nimport {\n\tgetListTriggerIcon,\n\tuseActiveListType,\n\ttype ListType\n} from './use-list';\nimport { Button } from '../ui/button';\nimport {\n\tDropdownMenu,\n\tDropdownMenuTrigger,\n\tDropdownMenuContent,\n\tDropdownMenuGroup\n} from '../ui/dropdown-menu';\n\nimport type { Editor } from '@tiptap/core';\nimport type { ComponentProps } from 'react';\n\nexport interface ListDropdownMenuProps extends Omit<\n\tComponentProps<typeof Button>,\n\t'type'\n> {\n\teditor: Editor | null;\n\ttypes?: ListType[];\n}\n\nexport const ListDropdownMenu = forwardRef<\n\tHTMLButtonElement,\n\tListDropdownMenuProps\n>(\n\t(\n\t\t{\n\t\t\teditor,\n\t\t\ttypes = ['bulletList', 'orderedList', 'taskList'],\n\t\t\t...buttonProps\n\t\t},\n\t\tref\n\t) => {\n\t\tconst activeType = useActiveListType(editor, types);\n\t\tconst TriggerIcon = getListTriggerIcon(activeType);\n\n\t\treturn (\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\taria-label=\"List\"\n\t\t\t\t\t\tclassName=\"nt:gap-1 nt:px-2\"\n\t\t\t\t\t\tdata-active-state={activeType !== null ? 'on' : 'off'}\n\t\t\t\t\t\tsize=\"default\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t{...buttonProps}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TriggerIcon\n\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\tactiveType !== null\n\t\t\t\t\t\t\t\t\t? 'nt:text-[var(--tt-brand-color-500)]'\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<ChevronDown className=\"nt:size-3\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"start\">\n\t\t\t\t\t<DropdownMenuGroup>\n\t\t\t\t\t\t{types.map((type) => (\n\t\t\t\t\t\t\t<ListMenuItem key={type} editor={editor} listType={type} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t</DropdownMenuGroup>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t);\n\t}\n);\n\nListDropdownMenu.displayName = 'ListDropdownMenu';\n","import { forwardRef } from 'react';\n\nimport { useList, type ListType } from './use-list';\nimport { DropdownMenuItem } from '../ui/dropdown-menu';\n\nimport type { Editor } from '@tiptap/core';\n\nexport interface ListMenuItemProps {\n\teditor: Editor | null;\n\tlistType: ListType;\n}\n\nexport const ListMenuItem = forwardRef<HTMLDivElement, ListMenuItemProps>(\n\t({ editor, listType }, ref) => {\n\t\tconst { isActive, canToggle, handleToggle, label, Icon } = useList({\n\t\t\teditor,\n\t\t\ttype: listType\n\t\t});\n\n\t\treturn (\n\t\t\t<DropdownMenuItem\n\t\t\t\tref={ref}\n\t\t\t\taria-label={label}\n\t\t\t\tclassName=\"nt:data-[active-state=on]:bg-accent nt:data-[active-state=on]:text-[var(--tt-brand-color-500)]\"\n\t\t\t\tdata-active-state={isActive ? 'on' : 'off'}\n\t\t\t\tdisabled={!canToggle}\n\t\t\t\tonSelect={handleToggle}\n\t\t\t>\n\t\t\t\t<Icon />\n\t\t\t\t<span>{label}</span>\n\t\t\t</DropdownMenuItem>\n\t\t);\n\t}\n);\n\nListMenuItem.displayName = 'ListMenuItem';\n","import { List, ListOrdered, ListTodo } from 'lucide-react';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { Editor } from '@tiptap/core';\nimport type { LucideIcon } from 'lucide-react';\n\nexport type ListType = 'bulletList' | 'orderedList' | 'taskList';\n\ntype IconComponent = LucideIcon;\n\nconst listIcons: Record<ListType, IconComponent> = {\n\tbulletList: List,\n\torderedList: ListOrdered,\n\ttaskList: ListTodo\n};\n\nconst listLabels: Record<ListType, string> = {\n\tbulletList: 'Bullet List',\n\torderedList: 'Ordered List',\n\ttaskList: 'Task List'\n};\n\nconst listItemTypes: Record<ListType, string> = {\n\tbulletList: 'listItem',\n\torderedList: 'listItem',\n\ttaskList: 'taskItem'\n};\n\nfunction canToggleList(editor: Editor | null): boolean {\n\tif (!editor || !editor.isEditable) return false;\n\n\treturn (\n\t\teditor.can().toggleList('bulletList', 'listItem') ||\n\t\teditor.can().clearNodes()\n\t);\n}\n\nexport function useList({\n\teditor,\n\ttype\n}: {\n\teditor: Editor | null;\n\ttype: ListType;\n}) {\n\tconst [isActive, setIsActive] = useState(false);\n\tconst [canToggle, setCanToggle] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tsetIsActive(editor.isActive(type));\n\t\t\tsetCanToggle(canToggleList(editor));\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, type]);\n\n\tconst handleToggle = useCallback(() => {\n\t\tif (!editor || !editor.isEditable) return false;\n\n\t\tconst itemType = listItemTypes[type];\n\n\t\tif (editor.isActive(type)) {\n\t\t\t// Currently this list type → convert back to paragraph\n\t\t\treturn editor.chain().focus().clearNodes().run();\n\t\t}\n\n\t\t// clearNodes first to convert any block type to paragraph,\n\t\t// then toggle list\n\t\treturn editor.chain().focus().clearNodes().toggleList(type, itemType).run();\n\t}, [editor, type]);\n\n\treturn {\n\t\tisActive,\n\t\tcanToggle,\n\t\thandleToggle,\n\t\tlabel: listLabels[type],\n\t\tIcon: listIcons[type]\n\t};\n}\n\nexport function useActiveListType(\n\teditor: Editor | null,\n\ttypes: ListType[]\n): ListType | null {\n\tconst [activeType, setActiveType] = useState<ListType | null>(null);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tconst found = types.find((type) => editor.isActive(type));\n\n\t\t\tsetActiveType(found ?? null);\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, types]);\n\n\treturn activeType;\n}\n\nexport function getListTriggerIcon(activeType: ListType | null): IconComponent {\n\tif (activeType === null) return List;\n\n\treturn listIcons[activeType];\n}\n","import { forwardRef, useCallback } from 'react';\n\nimport { useMark } from './use-mark';\nimport { Button } from '../ui/button';\n\nimport type { MarkType } from './use-mark';\nimport type { Editor } from '@tiptap/core';\n\nexport interface MarkButtonProps extends Omit<\n\tReact.ButtonHTMLAttributes<HTMLButtonElement>,\n\t'type'\n> {\n\teditor: Editor | null;\n\ttype: MarkType;\n}\n\nexport const MarkButton = forwardRef<HTMLButtonElement, MarkButtonProps>(\n\t({ editor, type, onClick, ...buttonProps }, ref) => {\n\t\tconst { isActive, canToggle, handleToggle, label, Icon } = useMark({\n\t\t\teditor,\n\t\t\ttype\n\t\t});\n\n\t\tconst handleClick = useCallback(\n\t\t\t(event: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tonClick?.(event);\n\n\t\t\t\tif (event.defaultPrevented) return;\n\n\t\t\t\thandleToggle();\n\t\t\t},\n\t\t\t[handleToggle, onClick]\n\t\t);\n\n\t\treturn (\n\t\t\t<Button\n\t\t\t\tref={ref}\n\t\t\t\taria-label={label}\n\t\t\t\taria-pressed={isActive}\n\t\t\t\tdata-active-state={isActive ? 'on' : 'off'}\n\t\t\t\tdisabled={!canToggle}\n\t\t\t\tsize=\"icon\"\n\t\t\t\ttabIndex={-1}\n\t\t\t\ttype=\"button\"\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tonClick={handleClick}\n\t\t\t\t{...buttonProps}\n\t\t\t>\n\t\t\t\t<Icon\n\t\t\t\t\tclassName={\n\t\t\t\t\t\tisActive ? 'nt:text-[var(--tt-brand-color-500)]' : undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</Button>\n\t\t);\n\t}\n);\n\nMarkButton.displayName = 'MarkButton';\n","import { Bold, Code, Italic, Strikethrough } from 'lucide-react';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { Editor } from '@tiptap/core';\nimport type { LucideIcon } from 'lucide-react';\n\nexport type MarkType = 'bold' | 'italic' | 'strike' | 'code';\n\nexport interface UseMarkConfig {\n\teditor: Editor | null;\n\ttype: MarkType;\n}\n\nconst markLabels: Record<MarkType, string> = {\n\tbold: 'Bold',\n\titalic: 'Italic',\n\tstrike: 'Strikethrough',\n\tcode: 'Code'\n};\n\nconst markIcons: Record<MarkType, LucideIcon> = {\n\tbold: Bold,\n\titalic: Italic,\n\tstrike: Strikethrough,\n\tcode: Code\n};\n\nexport function useMark({ editor, type }: UseMarkConfig) {\n\tconst [isActive, setIsActive] = useState(false);\n\tconst [canToggle, setCanToggle] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tsetIsActive(editor.isActive(type));\n\t\t\tsetCanToggle(editor.isEditable && editor.can().toggleMark(type));\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, type]);\n\n\tconst handleToggle = useCallback(() => {\n\t\tif (!editor || !editor.isEditable) return false;\n\n\t\treturn editor.chain().focus().toggleMark(type).run();\n\t}, [editor, type]);\n\n\treturn {\n\t\tisActive,\n\t\tcanToggle,\n\t\thandleToggle,\n\t\tlabel: markLabels[type],\n\t\tIcon: markIcons[type]\n\t};\n}\n","import { forwardRef } from 'react';\n\nexport interface ToolbarProps extends React.HTMLAttributes<HTMLDivElement> {\n\tvariant?: 'fixed' | 'floating';\n}\n\nexport const Toolbar = forwardRef<HTMLDivElement, ToolbarProps>(\n\t({ children, className, variant = 'fixed', ...props }, ref) => {\n\t\tconst classNames = ['tiptap-toolbar', className].filter(Boolean).join(' ');\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\taria-label=\"toolbar\"\n\t\t\t\tclassName={classNames}\n\t\t\t\tdata-variant={variant}\n\t\t\t\trole=\"toolbar\"\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t);\n\t}\n);\n\nToolbar.displayName = 'Toolbar';\n\nexport function ToolbarGroup({\n\tchildren,\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n\tconst classNames = ['tiptap-toolbar-group', className]\n\t\t.filter(Boolean)\n\t\t.join(' ');\n\n\treturn (\n\t\t<div className={classNames} role=\"group\" {...props}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nexport interface ToolbarSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n\torientation?: 'horizontal' | 'vertical';\n}\n\nexport function ToolbarSeparator({\n\torientation = 'vertical',\n\tclassName,\n\t...props\n}: ToolbarSeparatorProps) {\n\tconst classNames = ['tiptap-separator', className].filter(Boolean).join(' ');\n\n\treturn (\n\t\t<div\n\t\t\taria-orientation={orientation === 'vertical' ? orientation : undefined}\n\t\t\tclassName={classNames}\n\t\t\tdata-orientation={orientation}\n\t\t\trole=\"separator\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n","export function Spacer() {\n\treturn <div style={{ flex: 1 }} />;\n}\n","import { forwardRef, useCallback } from 'react';\n\nimport { useUndoRedo } from './use-undo-redo';\nimport { Button } from '../ui/button';\n\nimport type { UndoRedoAction } from './use-undo-redo';\nimport type { Editor } from '@tiptap/core';\n\nexport interface UndoRedoButtonProps extends Omit<\n\tReact.ButtonHTMLAttributes<HTMLButtonElement>,\n\t'type'\n> {\n\teditor: Editor | null;\n\taction: UndoRedoAction;\n}\n\nexport const UndoRedoButton = forwardRef<\n\tHTMLButtonElement,\n\tUndoRedoButtonProps\n>(({ editor, action, onClick, ...buttonProps }, ref) => {\n\tconst { canExecute, handleAction, label, Icon } = useUndoRedo({\n\t\teditor,\n\t\taction\n\t});\n\n\tconst handleClick = useCallback(\n\t\t(event: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\tonClick?.(event);\n\n\t\t\tif (event.defaultPrevented) return;\n\n\t\t\thandleAction();\n\t\t},\n\t\t[handleAction, onClick]\n\t);\n\n\treturn (\n\t\t<Button\n\t\t\tref={ref}\n\t\t\taria-label={label}\n\t\t\tdisabled={!canExecute}\n\t\t\tsize=\"icon\"\n\t\t\ttabIndex={-1}\n\t\t\ttype=\"button\"\n\t\t\tvariant=\"ghost\"\n\t\t\tonClick={handleClick}\n\t\t\t{...buttonProps}\n\t\t>\n\t\t\t<Icon />\n\t\t</Button>\n\t);\n});\n\nUndoRedoButton.displayName = 'UndoRedoButton';\n","import { Undo2, Redo2 } from 'lucide-react';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { Editor } from '@tiptap/core';\n\nexport type UndoRedoAction = 'undo' | 'redo';\n\nexport interface UseUndoRedoConfig {\n\teditor: Editor | null;\n\taction: UndoRedoAction;\n}\n\nconst actionLabels: Record<UndoRedoAction, string> = {\n\tundo: 'Undo',\n\tredo: 'Redo'\n};\n\nconst actionIcons = {\n\tundo: Undo2,\n\tredo: Redo2\n};\n\nfunction canExecuteAction(\n\teditor: Editor | null,\n\taction: UndoRedoAction\n): boolean {\n\tif (!editor || !editor.isEditable) return false;\n\n\treturn action === 'undo' ? editor.can().undo() : editor.can().redo();\n}\n\nexport function useUndoRedo({ editor, action }: UseUndoRedoConfig) {\n\tconst [canExecute, setCanExecute] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = () => {\n\t\t\tsetCanExecute(canExecuteAction(editor, action));\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor, action]);\n\n\tconst handleAction = useCallback(() => {\n\t\tif (!editor || !editor.isEditable) return false;\n\n\t\tif (!canExecuteAction(editor, action)) return false;\n\n\t\tconst chain = editor.chain().focus();\n\n\t\treturn action === 'undo' ? chain.undo().run() : chain.redo().run();\n\t}, [editor, action]);\n\n\treturn {\n\t\tcanExecute,\n\t\thandleAction,\n\t\tlabel: actionLabels[action],\n\t\tIcon: actionIcons[action]\n\t};\n}\n","import { EditorState } from '@tiptap/pm/state';\nimport { useEditor } from '@tiptap/react';\nimport { useEffect, useRef } from 'react';\n\nimport { editorExtensions } from '../extensions';\n\nimport type { MarkdownStorage } from 'tiptap-markdown';\n\nexport interface UseMarkdownEditorOptions {\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tplaceholder?: string;\n\teditable?: boolean;\n}\n\nfunction getMarkdown(storage: Record<string, unknown>): string {\n\treturn (storage.markdown as MarkdownStorage).getMarkdown();\n}\n\nexport function useMarkdownEditor({\n\tvalue,\n\tonChange,\n\teditable = true\n}: UseMarkdownEditorOptions) {\n\tconst externalValue = useRef(value);\n\tconst onChangeRef = useRef(onChange);\n\n\tonChangeRef.current = onChange;\n\n\tconst editor = useEditor({\n\t\textensions: editorExtensions,\n\t\teditable,\n\t\tcontent: value,\n\t\tonUpdate({ editor }) {\n\t\t\tconst md = getMarkdown(\n\t\t\t\teditor.storage as unknown as Record<string, unknown>\n\t\t\t);\n\n\t\t\texternalValue.current = md;\n\t\t\tonChangeRef.current(md);\n\t\t},\n\t\tonCreate({ editor }) {\n\t\t\t// Browser-specific behaviors (MutationObserver, DOM reconciliation)\n\t\t\t// may create unwanted transactions during mount, polluting the history\n\t\t\t// and making undo available before the user has made any changes.\n\t\t\t// Reset the editor state after initialization to ensure a clean history.\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (editor.isDestroyed) return;\n\n\t\t\t\tconst { state } = editor;\n\t\t\t\tconst freshState = EditorState.create({\n\t\t\t\t\tdoc: state.doc,\n\t\t\t\t\tselection: state.selection,\n\t\t\t\t\tplugins: state.plugins\n\t\t\t\t});\n\n\t\t\t\teditor.view.updateState(freshState);\n\t\t\t\t// Dispatch empty transaction to notify state listeners (undo/redo buttons)\n\t\t\t\teditor.view.dispatch(editor.view.state.tr);\n\t\t\t}, 0);\n\t\t}\n\t});\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tif (value === externalValue.current) return;\n\n\t\texternalValue.current = value;\n\t\teditor.commands.setContent(value);\n\t}, [value, editor]);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\teditor.setEditable(editable);\n\t}, [editable, editor]);\n\n\treturn { editor };\n}\n","import { ListKit } from '@tiptap/extension-list';\nimport StarterKit, { type StarterKitOptions } from '@tiptap/starter-kit';\n\n// Shared StarterKit config: content nodes/marks, no lists (use ListKit instead)\nexport const starterKitBaseConfig: Partial<StarterKitOptions> = {\n\theading: { levels: [1, 2, 3, 4, 5, 6] },\n\tlink: {\n\t\topenOnClick: false,\n\t\tautolink: true\n\t},\n\t// Disable StarterKit's built-in list handling; use @tiptap/extension-list instead\n\tbulletList: false,\n\torderedList: false,\n\tlistItem: false,\n\tlistKeymap: false\n};\n\n// Content model extensions — shared by editor and reader\n// No interactive features (dropcursor, gapcursor, undoRedo, trailingNode)\nexport const sharedExtensions = [\n\tStarterKit.configure({\n\t\t...starterKitBaseConfig,\n\t\tdropcursor: false,\n\t\tgapcursor: false,\n\t\tundoRedo: false,\n\t\ttrailingNode: false\n\t}),\n\tListKit\n];\n","import { ListKit } from '@tiptap/extension-list';\nimport StarterKit from '@tiptap/starter-kit';\nimport { Markdown } from 'tiptap-markdown';\n\nimport { starterKitBaseConfig } from './shared';\n\n// Editor extensions = shared content model + interactive features + Markdown\nexport const editorExtensions = [\n\tStarterKit.configure(starterKitBaseConfig),\n\tListKit,\n\tMarkdown.configure({\n\t\thtml: false,\n\t\ttransformPastedText: true,\n\t\ttransformCopiedText: true\n\t})\n];\n","import { renderToReactElement } from '@tiptap/static-renderer/pm/react';\n\nimport { sharedExtensions } from './extensions';\nimport { markdownToJSON } from './utils/markdown-to-json';\n\nexport interface NotraReaderProps {\n\t/** Markdown content to render */\n\tcontent: string;\n\t/** Additional CSS class on the wrapper element */\n\tclassName?: string;\n}\n\nexport function NotraReader({ content, className }: NotraReaderProps) {\n\tconst json = markdownToJSON(content);\n\n\tconst rendered = renderToReactElement({\n\t\textensions: sharedExtensions,\n\t\tcontent: json\n\t});\n\n\tconst classNames = ['notra', 'notra-reader', className]\n\t\t.filter(Boolean)\n\t\t.join(' ');\n\n\treturn <div className={classNames}>{rendered}</div>;\n}\n","import { Editor } from '@tiptap/core';\nimport { Markdown } from 'tiptap-markdown';\n\nimport { sharedExtensions } from '../extensions';\n\n// Parser needs shared content model + Markdown for markdown→JSON conversion\n// No clipboard features needed (transformPastedText/transformCopiedText are editor-only)\nconst parserExtensions = [\n\t...sharedExtensions,\n\tMarkdown.configure({ html: false })\n];\n\nlet parserEditor: Editor | null = null;\n\nfunction getParserEditor(): Editor {\n\tif (!parserEditor) {\n\t\tparserEditor = new Editor({\n\t\t\textensions: parserExtensions,\n\t\t\tcontent: ''\n\t\t});\n\t}\n\n\treturn parserEditor;\n}\n\n/**\n * Convert a Markdown string to Tiptap-compatible JSON (ProseMirror document).\n * Uses a singleton headless Tiptap editor for parsing.\n */\nexport function markdownToJSON(markdown: string): Record<string, unknown> {\n\tconst editor = getParserEditor();\n\n\teditor.commands.setContent(markdown);\n\n\treturn editor.getJSON() as Record<string, unknown>;\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport type { ReactNode } from 'react';\n\nexport interface DropdownMenuProps {\n\ttrigger: ReactNode;\n\tchildren: ReactNode;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n}\n\nexport function DropdownMenu({\n\ttrigger,\n\tchildren,\n\topen: controlledOpen,\n\tonOpenChange\n}: DropdownMenuProps) {\n\tconst isControlled = controlledOpen !== undefined;\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n\tconst open = isControlled ? controlledOpen : uncontrolledOpen;\n\tconst triggerRef = useRef<HTMLDivElement>(null);\n\tconst contentRef = useRef<HTMLDivElement>(null);\n\tconst [position, setPosition] = useState({ top: 0, left: 0 });\n\n\tconst setOpen = (value: boolean) => {\n\t\tif (!isControlled) {\n\t\t\tsetUncontrolledOpen(value);\n\t\t}\n\n\t\tonOpenChange?.(value);\n\t};\n\n\t// Compute position from trigger bounding rect\n\tuseEffect(() => {\n\t\tif (!open || !triggerRef.current) return;\n\n\t\tconst updatePosition = () => {\n\t\t\tif (!triggerRef.current) return;\n\n\t\t\tconst rect = triggerRef.current.getBoundingClientRect();\n\n\t\t\tsetPosition({\n\t\t\t\ttop: rect.bottom + 4,\n\t\t\t\tleft: rect.left + rect.width / 2\n\t\t\t});\n\t\t};\n\n\t\tupdatePosition();\n\n\t\twindow.addEventListener('scroll', updatePosition, true);\n\t\twindow.addEventListener('resize', updatePosition);\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener('scroll', updatePosition, true);\n\t\t\twindow.removeEventListener('resize', updatePosition);\n\t\t};\n\t}, [open]);\n\n\t// Close on click outside\n\tuseEffect(() => {\n\t\tif (!open) return;\n\n\t\tconst handleMouseDown = (event: MouseEvent) => {\n\t\t\tconst target = event.target as Node;\n\n\t\t\tif (\n\t\t\t\ttriggerRef.current?.contains(target) ||\n\t\t\t\tcontentRef.current?.contains(target)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetOpen(false);\n\t\t};\n\n\t\tdocument.addEventListener('mousedown', handleMouseDown);\n\n\t\treturn () => document.removeEventListener('mousedown', handleMouseDown);\n\t}, [open]);\n\n\t// Close on Escape key\n\tuseEffect(() => {\n\t\tif (!open) return;\n\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener('keydown', handleKeyDown);\n\n\t\treturn () => document.removeEventListener('keydown', handleKeyDown);\n\t}, [open]);\n\n\treturn (\n\t\t<>\n\t\t\t<div ref={triggerRef} onClick={() => setOpen(!open)}>\n\t\t\t\t{trigger}\n\t\t\t</div>\n\t\t\t{open &&\n\t\t\t\tcreatePortal(\n\t\t\t\t\t<div className=\"notra-editor\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref={contentRef}\n\t\t\t\t\t\t\tclassName=\"tiptap-dropdown-menu-content\"\n\t\t\t\t\t\t\tdata-state=\"open\"\n\t\t\t\t\t\t\trole=\"menu\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\t\ttop: position.top,\n\t\t\t\t\t\t\t\tleft: position.left\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"tiptap-dropdown-menu-group\"\n\t\t\t\t\t\t\t\tonClick={() => setOpen(false)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>,\n\t\t\t\t\tdocument.body\n\t\t\t\t)}\n\t\t</>\n\t);\n}\n"],"mappings":"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","names":["jsx","forwardRef","useCallback","useEffect","useState","jsx","forwardRef","useState","useEffect","useCallback","forwardRef","forwardRef","useCallback","useEffect","useState","jsx","jsx","jsx","jsxs","forwardRef","jsx","jsxs","forwardRef","forwardRef","useCallback","useEffect","useState","useCallback","useEffect","useState","jsx","jsx","jsx","jsx","jsx","jsxs","forwardRef","useState","useEffect","useCallback","ChevronDown","forwardRef","forwardRef","useCallback","useEffect","useState","jsx","jsxs","forwardRef","jsx","jsxs","forwardRef","ChevronDown","forwardRef","useCallback","useCallback","useEffect","useState","jsx","forwardRef","useCallback","forwardRef","jsx","jsx","forwardRef","useCallback","useCallback","useEffect","useState","jsx","forwardRef","useCallback","useEffect","ListKit","StarterKit","StarterKit","ListKit","editor","useEffect","jsx","jsxs","Markdown","Markdown","jsx","useEffect","useRef","useState","jsx","jsxs","DropdownMenu"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import './styles/globals.css';\n\nexport { NotraEditor } from './notra-editor';\nexport type { NotraEditorProps } from './notra-editor';\n\nexport { NotraReader } from './notra-reader';\nexport type { NotraReaderProps } from './notra-reader';\n\nexport {\n\tToolbar,\n\tToolbarGroup,\n\tToolbarSeparator\n} from './components/toolbar/toolbar';\nexport type {\n\tToolbarProps,\n\tToolbarSeparatorProps\n} from './components/toolbar/toolbar';\n\nexport { UndoRedoButton } from './components/undo-redo-button/undo-redo-button';\nexport type { UndoRedoButtonProps } from './components/undo-redo-button/undo-redo-button';\n\nexport { Spacer } from './components/ui/spacer';\n\nexport { MarkButton } from './components/mark-button/mark-button';\nexport type { MarkButtonProps } from './components/mark-button/mark-button';\nexport type { MarkType } from './components/mark-button/use-mark';\n\nexport { HeadingDropdownMenu } from './components/heading-dropdown-menu/heading-dropdown-menu';\nexport type { HeadingDropdownMenuProps } from './components/heading-dropdown-menu/heading-dropdown-menu';\n\nexport { ListDropdownMenu } from './components/list-dropdown-menu/list-dropdown-menu';\nexport type { ListDropdownMenuProps } from './components/list-dropdown-menu/list-dropdown-menu';\n\nexport { BlockquoteButton } from './components/blockquote-button/blockquote-button';\nexport type { BlockquoteButtonProps } from './components/blockquote-button/blockquote-button';\n\nexport { CodeBlockButton } from './components/code-block-button/code-block-button';\nexport type { CodeBlockButtonProps } from './components/code-block-button/code-block-button';\n\nexport { LinkPopover } from './components/link-popover/link-popover';\nexport type { LinkPopoverProps } from './components/link-popover/link-popover';\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,mBAAmB;AAG5B,SAAS,mBAAmB;AAG5B;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAMP,SAAS,sBAAsB;AAG/B,SAAS,cAAc;AAEvB,SAAS,kBAAkB;AAI3B,SAAS,2BAA2B;AAGpC,SAAS,wBAAwB;AAGjC,SAAS,wBAAwB;AAGjC,SAAS,uBAAuB;AAGhC,SAAS,mBAAmB;","names":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var utils_exports = {};
|
|
20
|
+
__export(utils_exports, {
|
|
21
|
+
cn: () => cn
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(utils_exports);
|
|
24
|
+
var import_clsx = require("clsx");
|
|
25
|
+
var import_tailwind_merge = require("tailwind-merge");
|
|
26
|
+
function cn(...inputs) {
|
|
27
|
+
return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
|
|
28
|
+
}
|
|
29
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
30
|
+
0 && (module.exports = {
|
|
31
|
+
cn
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC3C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC5B;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n"],"mappings":"AAAA,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC3C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC5B;","names":[]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var notra_editor_exports = {};
|
|
21
|
+
__export(notra_editor_exports, {
|
|
22
|
+
NotraEditor: () => NotraEditor
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(notra_editor_exports);
|
|
25
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
|
+
var import_react = require("@tiptap/react");
|
|
27
|
+
var import_blockquote_button = require("./components/blockquote-button/blockquote-button");
|
|
28
|
+
var import_code_block_button = require("./components/code-block-button/code-block-button");
|
|
29
|
+
var import_heading_dropdown_menu = require("./components/heading-dropdown-menu/heading-dropdown-menu");
|
|
30
|
+
var import_link_popover = require("./components/link-popover/link-popover");
|
|
31
|
+
var import_list_dropdown_menu = require("./components/list-dropdown-menu/list-dropdown-menu");
|
|
32
|
+
var import_mark_button = require("./components/mark-button/mark-button");
|
|
33
|
+
var import_toolbar = require("./components/toolbar/toolbar");
|
|
34
|
+
var import_spacer = require("./components/ui/spacer");
|
|
35
|
+
var import_undo_redo_button = require("./components/undo-redo-button/undo-redo-button");
|
|
36
|
+
var import_use_markdown_editor = require("./hooks/use-markdown-editor");
|
|
37
|
+
function NotraEditor({
|
|
38
|
+
value,
|
|
39
|
+
onChange,
|
|
40
|
+
placeholder,
|
|
41
|
+
readOnly = false,
|
|
42
|
+
className
|
|
43
|
+
}) {
|
|
44
|
+
const { editor } = (0, import_use_markdown_editor.useMarkdownEditor)({
|
|
45
|
+
value,
|
|
46
|
+
onChange,
|
|
47
|
+
placeholder,
|
|
48
|
+
editable: !readOnly
|
|
49
|
+
});
|
|
50
|
+
const classNames = ["notra", "notra-editor", className].filter(Boolean).join(" ");
|
|
51
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: classNames, children: [
|
|
52
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_toolbar.Toolbar, { variant: "fixed", children: [
|
|
53
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_spacer.Spacer, {}),
|
|
54
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_toolbar.ToolbarGroup, { children: [
|
|
55
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_undo_redo_button.UndoRedoButton, { action: "undo", editor }),
|
|
56
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_undo_redo_button.UndoRedoButton, { action: "redo", editor })
|
|
57
|
+
] }),
|
|
58
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_toolbar.ToolbarSeparator, {}),
|
|
59
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_toolbar.ToolbarGroup, { children: [
|
|
60
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_heading_dropdown_menu.HeadingDropdownMenu, { editor, levels: [1, 2, 3, 4] }),
|
|
61
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
62
|
+
import_list_dropdown_menu.ListDropdownMenu,
|
|
63
|
+
{
|
|
64
|
+
editor,
|
|
65
|
+
types: ["bulletList", "orderedList", "taskList"]
|
|
66
|
+
}
|
|
67
|
+
),
|
|
68
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_blockquote_button.BlockquoteButton, { editor }),
|
|
69
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_code_block_button.CodeBlockButton, { editor })
|
|
70
|
+
] }),
|
|
71
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_toolbar.ToolbarSeparator, {}),
|
|
72
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_toolbar.ToolbarGroup, { children: [
|
|
73
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_mark_button.MarkButton, { editor, type: "bold" }),
|
|
74
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_mark_button.MarkButton, { editor, type: "italic" }),
|
|
75
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_mark_button.MarkButton, { editor, type: "strike" }),
|
|
76
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_mark_button.MarkButton, { editor, type: "code" }),
|
|
77
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link_popover.LinkPopover, { editor })
|
|
78
|
+
] }),
|
|
79
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_spacer.Spacer, {})
|
|
80
|
+
] }),
|
|
81
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.EditorContent, { className: "notra-editor-content", editor })
|
|
82
|
+
] });
|
|
83
|
+
}
|
|
84
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
85
|
+
0 && (module.exports = {
|
|
86
|
+
NotraEditor
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=notra-editor.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/notra-editor.tsx"],"sourcesContent":["'use client';\n\nimport { EditorContent } from '@tiptap/react';\n\nimport { BlockquoteButton } from './components/blockquote-button/blockquote-button';\nimport { CodeBlockButton } from './components/code-block-button/code-block-button';\nimport { HeadingDropdownMenu } from './components/heading-dropdown-menu/heading-dropdown-menu';\nimport { LinkPopover } from './components/link-popover/link-popover';\nimport { ListDropdownMenu } from './components/list-dropdown-menu/list-dropdown-menu';\nimport { MarkButton } from './components/mark-button/mark-button';\nimport {\n\tToolbar,\n\tToolbarGroup,\n\tToolbarSeparator\n} from './components/toolbar/toolbar';\nimport { Spacer } from './components/ui/spacer';\nimport { UndoRedoButton } from './components/undo-redo-button/undo-redo-button';\nimport { useMarkdownEditor } from './hooks/use-markdown-editor';\n\nexport interface NotraEditorProps {\n\t/** Markdown content (source of truth) */\n\tvalue: string;\n\t/** Called when content changes, receives updated Markdown */\n\tonChange: (value: string) => void;\n\t/** Placeholder text shown when editor is empty */\n\tplaceholder?: string;\n\t/** Disable editing */\n\treadOnly?: boolean;\n\t/** Additional CSS class on the wrapper element */\n\tclassName?: string;\n}\n\nexport function NotraEditor({\n\tvalue,\n\tonChange,\n\tplaceholder,\n\treadOnly = false,\n\tclassName\n}: NotraEditorProps) {\n\tconst { editor } = useMarkdownEditor({\n\t\tvalue,\n\t\tonChange,\n\t\tplaceholder,\n\t\teditable: !readOnly\n\t});\n\n\tconst classNames = ['notra', 'notra-editor', className]\n\t\t.filter(Boolean)\n\t\t.join(' ');\n\n\treturn (\n\t\t<div className={classNames}>\n\t\t\t<Toolbar variant=\"fixed\">\n\t\t\t\t<Spacer />\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<UndoRedoButton action=\"undo\" editor={editor} />\n\t\t\t\t\t<UndoRedoButton action=\"redo\" editor={editor} />\n\t\t\t\t</ToolbarGroup>\n\t\t\t\t<ToolbarSeparator />\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<HeadingDropdownMenu editor={editor} levels={[1, 2, 3, 4]} />\n\t\t\t\t\t<ListDropdownMenu\n\t\t\t\t\t\teditor={editor}\n\t\t\t\t\t\ttypes={['bulletList', 'orderedList', 'taskList']}\n\t\t\t\t\t/>\n\t\t\t\t\t<BlockquoteButton editor={editor} />\n\t\t\t\t\t<CodeBlockButton editor={editor} />\n\t\t\t\t</ToolbarGroup>\n\t\t\t\t<ToolbarSeparator />\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<MarkButton editor={editor} type=\"bold\" />\n\t\t\t\t\t<MarkButton editor={editor} type=\"italic\" />\n\t\t\t\t\t<MarkButton editor={editor} type=\"strike\" />\n\t\t\t\t\t<MarkButton editor={editor} type=\"code\" />\n\t\t\t\t\t<LinkPopover editor={editor} />\n\t\t\t\t</ToolbarGroup>\n\t\t\t\t<Spacer />\n\t\t\t</Toolbar>\n\t\t\t<EditorContent className=\"notra-editor-content\" editor={editor} />\n\t\t</div>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqDI;AAnDJ,mBAA8B;AAE9B,+BAAiC;AACjC,+BAAgC;AAChC,mCAAoC;AACpC,0BAA4B;AAC5B,gCAAiC;AACjC,yBAA2B;AAC3B,qBAIO;AACP,oBAAuB;AACvB,8BAA+B;AAC/B,iCAAkC;AAe3B,SAAS,YAAY;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACD,GAAqB;AACpB,QAAM,EAAE,OAAO,QAAI,8CAAkB;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,CAAC;AAAA,EACZ,CAAC;AAED,QAAM,aAAa,CAAC,SAAS,gBAAgB,SAAS,EACpD,OAAO,OAAO,EACd,KAAK,GAAG;AAEV,SACC,6CAAC,SAAI,WAAW,YACf;AAAA,iDAAC,0BAAQ,SAAQ,SAChB;AAAA,kDAAC,wBAAO;AAAA,MACR,6CAAC,+BACA;AAAA,oDAAC,0CAAe,QAAO,QAAO,QAAgB;AAAA,QAC9C,4CAAC,0CAAe,QAAO,QAAO,QAAgB;AAAA,SAC/C;AAAA,MACA,4CAAC,mCAAiB;AAAA,MAClB,6CAAC,+BACA;AAAA,oDAAC,oDAAoB,QAAgB,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG;AAAA,QAC3D;AAAA,UAAC;AAAA;AAAA,YACA;AAAA,YACA,OAAO,CAAC,cAAc,eAAe,UAAU;AAAA;AAAA,QAChD;AAAA,QACA,4CAAC,6CAAiB,QAAgB;AAAA,QAClC,4CAAC,4CAAgB,QAAgB;AAAA,SAClC;AAAA,MACA,4CAAC,mCAAiB;AAAA,MAClB,6CAAC,+BACA;AAAA,oDAAC,iCAAW,QAAgB,MAAK,QAAO;AAAA,QACxC,4CAAC,iCAAW,QAAgB,MAAK,UAAS;AAAA,QAC1C,4CAAC,iCAAW,QAAgB,MAAK,UAAS;AAAA,QAC1C,4CAAC,iCAAW,QAAgB,MAAK,QAAO;AAAA,QACxC,4CAAC,mCAAY,QAAgB;AAAA,SAC9B;AAAA,MACA,4CAAC,wBAAO;AAAA,OACT;AAAA,IACA,4CAAC,8BAAc,WAAU,wBAAuB,QAAgB;AAAA,KACjE;AAEF;","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface NotraEditorProps {
|
|
4
|
+
/** Markdown content (source of truth) */
|
|
5
|
+
value: string;
|
|
6
|
+
/** Called when content changes, receives updated Markdown */
|
|
7
|
+
onChange: (value: string) => void;
|
|
8
|
+
/** Placeholder text shown when editor is empty */
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
/** Disable editing */
|
|
11
|
+
readOnly?: boolean;
|
|
12
|
+
/** Additional CSS class on the wrapper element */
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
declare function NotraEditor({ value, onChange, placeholder, readOnly, className }: NotraEditorProps): react_jsx_runtime.JSX.Element;
|
|
16
|
+
|
|
17
|
+
export { NotraEditor, type NotraEditorProps };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface NotraEditorProps {
|
|
4
|
+
/** Markdown content (source of truth) */
|
|
5
|
+
value: string;
|
|
6
|
+
/** Called when content changes, receives updated Markdown */
|
|
7
|
+
onChange: (value: string) => void;
|
|
8
|
+
/** Placeholder text shown when editor is empty */
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
/** Disable editing */
|
|
11
|
+
readOnly?: boolean;
|
|
12
|
+
/** Additional CSS class on the wrapper element */
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
declare function NotraEditor({ value, onChange, placeholder, readOnly, className }: NotraEditorProps): react_jsx_runtime.JSX.Element;
|
|
16
|
+
|
|
17
|
+
export { NotraEditor, type NotraEditorProps };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { EditorContent } from "@tiptap/react";
|
|
4
|
+
import { BlockquoteButton } from "./components/blockquote-button/blockquote-button";
|
|
5
|
+
import { CodeBlockButton } from "./components/code-block-button/code-block-button";
|
|
6
|
+
import { HeadingDropdownMenu } from "./components/heading-dropdown-menu/heading-dropdown-menu";
|
|
7
|
+
import { LinkPopover } from "./components/link-popover/link-popover";
|
|
8
|
+
import { ListDropdownMenu } from "./components/list-dropdown-menu/list-dropdown-menu";
|
|
9
|
+
import { MarkButton } from "./components/mark-button/mark-button";
|
|
10
|
+
import {
|
|
11
|
+
Toolbar,
|
|
12
|
+
ToolbarGroup,
|
|
13
|
+
ToolbarSeparator
|
|
14
|
+
} from "./components/toolbar/toolbar";
|
|
15
|
+
import { Spacer } from "./components/ui/spacer";
|
|
16
|
+
import { UndoRedoButton } from "./components/undo-redo-button/undo-redo-button";
|
|
17
|
+
import { useMarkdownEditor } from "./hooks/use-markdown-editor";
|
|
18
|
+
function NotraEditor({
|
|
19
|
+
value,
|
|
20
|
+
onChange,
|
|
21
|
+
placeholder,
|
|
22
|
+
readOnly = false,
|
|
23
|
+
className
|
|
24
|
+
}) {
|
|
25
|
+
const { editor } = useMarkdownEditor({
|
|
26
|
+
value,
|
|
27
|
+
onChange,
|
|
28
|
+
placeholder,
|
|
29
|
+
editable: !readOnly
|
|
30
|
+
});
|
|
31
|
+
const classNames = ["notra", "notra-editor", className].filter(Boolean).join(" ");
|
|
32
|
+
return /* @__PURE__ */ jsxs("div", { className: classNames, children: [
|
|
33
|
+
/* @__PURE__ */ jsxs(Toolbar, { variant: "fixed", children: [
|
|
34
|
+
/* @__PURE__ */ jsx(Spacer, {}),
|
|
35
|
+
/* @__PURE__ */ jsxs(ToolbarGroup, { children: [
|
|
36
|
+
/* @__PURE__ */ jsx(UndoRedoButton, { action: "undo", editor }),
|
|
37
|
+
/* @__PURE__ */ jsx(UndoRedoButton, { action: "redo", editor })
|
|
38
|
+
] }),
|
|
39
|
+
/* @__PURE__ */ jsx(ToolbarSeparator, {}),
|
|
40
|
+
/* @__PURE__ */ jsxs(ToolbarGroup, { children: [
|
|
41
|
+
/* @__PURE__ */ jsx(HeadingDropdownMenu, { editor, levels: [1, 2, 3, 4] }),
|
|
42
|
+
/* @__PURE__ */ jsx(
|
|
43
|
+
ListDropdownMenu,
|
|
44
|
+
{
|
|
45
|
+
editor,
|
|
46
|
+
types: ["bulletList", "orderedList", "taskList"]
|
|
47
|
+
}
|
|
48
|
+
),
|
|
49
|
+
/* @__PURE__ */ jsx(BlockquoteButton, { editor }),
|
|
50
|
+
/* @__PURE__ */ jsx(CodeBlockButton, { editor })
|
|
51
|
+
] }),
|
|
52
|
+
/* @__PURE__ */ jsx(ToolbarSeparator, {}),
|
|
53
|
+
/* @__PURE__ */ jsxs(ToolbarGroup, { children: [
|
|
54
|
+
/* @__PURE__ */ jsx(MarkButton, { editor, type: "bold" }),
|
|
55
|
+
/* @__PURE__ */ jsx(MarkButton, { editor, type: "italic" }),
|
|
56
|
+
/* @__PURE__ */ jsx(MarkButton, { editor, type: "strike" }),
|
|
57
|
+
/* @__PURE__ */ jsx(MarkButton, { editor, type: "code" }),
|
|
58
|
+
/* @__PURE__ */ jsx(LinkPopover, { editor })
|
|
59
|
+
] }),
|
|
60
|
+
/* @__PURE__ */ jsx(Spacer, {})
|
|
61
|
+
] }),
|
|
62
|
+
/* @__PURE__ */ jsx(EditorContent, { className: "notra-editor-content", editor })
|
|
63
|
+
] });
|
|
64
|
+
}
|
|
65
|
+
export {
|
|
66
|
+
NotraEditor
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=notra-editor.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/notra-editor.tsx"],"sourcesContent":["'use client';\n\nimport { EditorContent } from '@tiptap/react';\n\nimport { BlockquoteButton } from './components/blockquote-button/blockquote-button';\nimport { CodeBlockButton } from './components/code-block-button/code-block-button';\nimport { HeadingDropdownMenu } from './components/heading-dropdown-menu/heading-dropdown-menu';\nimport { LinkPopover } from './components/link-popover/link-popover';\nimport { ListDropdownMenu } from './components/list-dropdown-menu/list-dropdown-menu';\nimport { MarkButton } from './components/mark-button/mark-button';\nimport {\n\tToolbar,\n\tToolbarGroup,\n\tToolbarSeparator\n} from './components/toolbar/toolbar';\nimport { Spacer } from './components/ui/spacer';\nimport { UndoRedoButton } from './components/undo-redo-button/undo-redo-button';\nimport { useMarkdownEditor } from './hooks/use-markdown-editor';\n\nexport interface NotraEditorProps {\n\t/** Markdown content (source of truth) */\n\tvalue: string;\n\t/** Called when content changes, receives updated Markdown */\n\tonChange: (value: string) => void;\n\t/** Placeholder text shown when editor is empty */\n\tplaceholder?: string;\n\t/** Disable editing */\n\treadOnly?: boolean;\n\t/** Additional CSS class on the wrapper element */\n\tclassName?: string;\n}\n\nexport function NotraEditor({\n\tvalue,\n\tonChange,\n\tplaceholder,\n\treadOnly = false,\n\tclassName\n}: NotraEditorProps) {\n\tconst { editor } = useMarkdownEditor({\n\t\tvalue,\n\t\tonChange,\n\t\tplaceholder,\n\t\teditable: !readOnly\n\t});\n\n\tconst classNames = ['notra', 'notra-editor', className]\n\t\t.filter(Boolean)\n\t\t.join(' ');\n\n\treturn (\n\t\t<div className={classNames}>\n\t\t\t<Toolbar variant=\"fixed\">\n\t\t\t\t<Spacer />\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<UndoRedoButton action=\"undo\" editor={editor} />\n\t\t\t\t\t<UndoRedoButton action=\"redo\" editor={editor} />\n\t\t\t\t</ToolbarGroup>\n\t\t\t\t<ToolbarSeparator />\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<HeadingDropdownMenu editor={editor} levels={[1, 2, 3, 4]} />\n\t\t\t\t\t<ListDropdownMenu\n\t\t\t\t\t\teditor={editor}\n\t\t\t\t\t\ttypes={['bulletList', 'orderedList', 'taskList']}\n\t\t\t\t\t/>\n\t\t\t\t\t<BlockquoteButton editor={editor} />\n\t\t\t\t\t<CodeBlockButton editor={editor} />\n\t\t\t\t</ToolbarGroup>\n\t\t\t\t<ToolbarSeparator />\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<MarkButton editor={editor} type=\"bold\" />\n\t\t\t\t\t<MarkButton editor={editor} type=\"italic\" />\n\t\t\t\t\t<MarkButton editor={editor} type=\"strike\" />\n\t\t\t\t\t<MarkButton editor={editor} type=\"code\" />\n\t\t\t\t\t<LinkPopover editor={editor} />\n\t\t\t\t</ToolbarGroup>\n\t\t\t\t<Spacer />\n\t\t\t</Toolbar>\n\t\t\t<EditorContent className=\"notra-editor-content\" editor={editor} />\n\t\t</div>\n\t);\n}\n"],"mappings":";AAqDI,cACA,YADA;AAnDJ,SAAS,qBAAqB;AAE9B,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC,SAAS,2BAA2B;AACpC,SAAS,mBAAmB;AAC5B,SAAS,wBAAwB;AACjC,SAAS,kBAAkB;AAC3B;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B,SAAS,yBAAyB;AAe3B,SAAS,YAAY;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACD,GAAqB;AACpB,QAAM,EAAE,OAAO,IAAI,kBAAkB;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,CAAC;AAAA,EACZ,CAAC;AAED,QAAM,aAAa,CAAC,SAAS,gBAAgB,SAAS,EACpD,OAAO,OAAO,EACd,KAAK,GAAG;AAEV,SACC,qBAAC,SAAI,WAAW,YACf;AAAA,yBAAC,WAAQ,SAAQ,SAChB;AAAA,0BAAC,UAAO;AAAA,MACR,qBAAC,gBACA;AAAA,4BAAC,kBAAe,QAAO,QAAO,QAAgB;AAAA,QAC9C,oBAAC,kBAAe,QAAO,QAAO,QAAgB;AAAA,SAC/C;AAAA,MACA,oBAAC,oBAAiB;AAAA,MAClB,qBAAC,gBACA;AAAA,4BAAC,uBAAoB,QAAgB,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG;AAAA,QAC3D;AAAA,UAAC;AAAA;AAAA,YACA;AAAA,YACA,OAAO,CAAC,cAAc,eAAe,UAAU;AAAA;AAAA,QAChD;AAAA,QACA,oBAAC,oBAAiB,QAAgB;AAAA,QAClC,oBAAC,mBAAgB,QAAgB;AAAA,SAClC;AAAA,MACA,oBAAC,oBAAiB;AAAA,MAClB,qBAAC,gBACA;AAAA,4BAAC,cAAW,QAAgB,MAAK,QAAO;AAAA,QACxC,oBAAC,cAAW,QAAgB,MAAK,UAAS;AAAA,QAC1C,oBAAC,cAAW,QAAgB,MAAK,UAAS;AAAA,QAC1C,oBAAC,cAAW,QAAgB,MAAK,QAAO;AAAA,QACxC,oBAAC,eAAY,QAAgB;AAAA,SAC9B;AAAA,MACA,oBAAC,UAAO;AAAA,OACT;AAAA,IACA,oBAAC,iBAAc,WAAU,wBAAuB,QAAgB;AAAA,KACjE;AAEF;","names":[]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var notra_reader_exports = {};
|
|
20
|
+
__export(notra_reader_exports, {
|
|
21
|
+
NotraReader: () => NotraReader
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(notra_reader_exports);
|
|
24
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
25
|
+
var import_react = require("@tiptap/static-renderer/pm/react");
|
|
26
|
+
var import_code_block_view = require("./components/code-block-view");
|
|
27
|
+
var import_extensions = require("./extensions");
|
|
28
|
+
var import_markdown_to_json = require("./utils/markdown-to-json");
|
|
29
|
+
function NotraReader({ content, className }) {
|
|
30
|
+
const json = (0, import_markdown_to_json.markdownToJSON)(content);
|
|
31
|
+
const rendered = (0, import_react.renderToReactElement)({
|
|
32
|
+
extensions: import_extensions.sharedExtensions,
|
|
33
|
+
content: json,
|
|
34
|
+
options: {
|
|
35
|
+
nodeMapping: {
|
|
36
|
+
codeBlock: ({ node, children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_code_block_view.CodeBlockShell, { value: node.textContent, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { children }) })
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
const classNames = ["notra", "notra-reader", className].filter(Boolean).join(" ");
|
|
41
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: classNames, children: rendered });
|
|
42
|
+
}
|
|
43
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
44
|
+
0 && (module.exports = {
|
|
45
|
+
NotraReader
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=notra-reader.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/notra-reader.tsx"],"sourcesContent":["import { renderToReactElement } from '@tiptap/static-renderer/pm/react';\n\nimport { CodeBlockShell } from './components/code-block-view';\nimport { sharedExtensions } from './extensions';\nimport { markdownToJSON } from './utils/markdown-to-json';\n\nexport interface NotraReaderProps {\n\t/** Markdown content to render */\n\tcontent: string;\n\t/** Additional CSS class on the wrapper element */\n\tclassName?: string;\n}\n\nexport function NotraReader({ content, className }: NotraReaderProps) {\n\tconst json = markdownToJSON(content);\n\n\tconst rendered = renderToReactElement({\n\t\textensions: sharedExtensions,\n\t\tcontent: json,\n\t\toptions: {\n\t\t\tnodeMapping: {\n\t\t\t\tcodeBlock: ({ node, children }) => (\n\t\t\t\t\t<CodeBlockShell value={node.textContent}>\n\t\t\t\t\t\t<code>{children}</code>\n\t\t\t\t\t</CodeBlockShell>\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t});\n\n\tconst classNames = ['notra', 'notra-reader', className]\n\t\t.filter(Boolean)\n\t\t.join(' ');\n\n\treturn <div className={classNames}>{rendered}</div>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBM;AAvBN,mBAAqC;AAErC,6BAA+B;AAC/B,wBAAiC;AACjC,8BAA+B;AASxB,SAAS,YAAY,EAAE,SAAS,UAAU,GAAqB;AACrE,QAAM,WAAO,wCAAe,OAAO;AAEnC,QAAM,eAAW,mCAAqB;AAAA,IACrC,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,MACR,aAAa;AAAA,QACZ,WAAW,CAAC,EAAE,MAAM,SAAS,MAC5B,4CAAC,yCAAe,OAAO,KAAK,aAC3B,sDAAC,UAAM,UAAS,GACjB;AAAA,MAEF;AAAA,IACD;AAAA,EACD,CAAC;AAED,QAAM,aAAa,CAAC,SAAS,gBAAgB,SAAS,EACpD,OAAO,OAAO,EACd,KAAK,GAAG;AAEV,SAAO,4CAAC,SAAI,WAAW,YAAa,oBAAS;AAC9C;","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface NotraReaderProps {
|
|
4
|
+
/** Markdown content to render */
|
|
5
|
+
content: string;
|
|
6
|
+
/** Additional CSS class on the wrapper element */
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
declare function NotraReader({ content, className }: NotraReaderProps): react_jsx_runtime.JSX.Element;
|
|
10
|
+
|
|
11
|
+
export { NotraReader, type NotraReaderProps };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface NotraReaderProps {
|
|
4
|
+
/** Markdown content to render */
|
|
5
|
+
content: string;
|
|
6
|
+
/** Additional CSS class on the wrapper element */
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
declare function NotraReader({ content, className }: NotraReaderProps): react_jsx_runtime.JSX.Element;
|
|
10
|
+
|
|
11
|
+
export { NotraReader, type NotraReaderProps };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { renderToReactElement } from "@tiptap/static-renderer/pm/react";
|
|
3
|
+
import { CodeBlockShell } from "./components/code-block-view";
|
|
4
|
+
import { sharedExtensions } from "./extensions";
|
|
5
|
+
import { markdownToJSON } from "./utils/markdown-to-json";
|
|
6
|
+
function NotraReader({ content, className }) {
|
|
7
|
+
const json = markdownToJSON(content);
|
|
8
|
+
const rendered = renderToReactElement({
|
|
9
|
+
extensions: sharedExtensions,
|
|
10
|
+
content: json,
|
|
11
|
+
options: {
|
|
12
|
+
nodeMapping: {
|
|
13
|
+
codeBlock: ({ node, children }) => /* @__PURE__ */ jsx(CodeBlockShell, { value: node.textContent, children: /* @__PURE__ */ jsx("code", { children }) })
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
const classNames = ["notra", "notra-reader", className].filter(Boolean).join(" ");
|
|
18
|
+
return /* @__PURE__ */ jsx("div", { className: classNames, children: rendered });
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
NotraReader
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=notra-reader.mjs.map
|