diff --git a/client/components/editor/index.jsx b/client/components/editor/index.jsx new file mode 100644 index 0000000..a6b93cc --- /dev/null +++ b/client/components/editor/index.jsx @@ -0,0 +1,736 @@ +import { + IconArrowBackUp, + IconArrowForwardUp, + IconBinary, + IconBold, + IconBrandCodesandbox, + IconCode, + IconCopy, + IconH1, + IconH2, + IconH3, + IconItalic, + IconKey, + IconLetterP, + IconLink, + IconLinkOff, + IconList, + IconListNumbers, + IconQuote, + IconStrikethrough, + IconTextCaption, + IconX, +} from '@tabler/icons'; +import { Color } from '@tiptap/extension-color'; +import Link from '@tiptap/extension-link'; +import ListItem from '@tiptap/extension-list-item'; +import TextStyle from '@tiptap/extension-text-style'; +import { EditorProvider, useCurrentEditor } from '@tiptap/react'; +import StarterKit from '@tiptap/starter-kit'; +import { generate } from 'generate-password-browser'; +import { useCallback, useEffect, useRef, useState } from 'react'; +import { useTranslation } from 'react-i18next'; + +const generatePassword = ( + length = 16, + options = { numbers: true, symbols: true, uppercase: true, lowercase: true } +) => { + const password = generate({ + length, + numbers: options.numbers, + symbols: options.symbols, + uppercase: options.uppercase, + lowercase: options.lowercase, + }); + + return password; +}; + +// Tooltip component for buttons +const Tooltip = ({ text, children }) => { + const [isVisible, setIsVisible] = useState(false); + + return ( +
+
setIsVisible(true)} onMouseLeave={() => setIsVisible(false)}> + {children} +
+ {isVisible && ( +
+ {text} +
+
+ )} +
+ ); +}; + +// Link Modal Component +const LinkModal = ({ isOpen, onClose, onSubmit, initialUrl = '' }) => { + const [url, setUrl] = useState(initialUrl); + const inputRef = useRef(null); + const { t } = useTranslation(); + + // Focus the input when the modal opens + useEffect(() => { + if (isOpen && inputRef.current) { + setTimeout(() => { + inputRef.current.focus(); + }, 50); + } + }, [isOpen]); + + if (!isOpen) return null; + + const handleSubmit = (e) => { + e.preventDefault(); + onSubmit(url); + onClose(); + }; + + return ( +
+
+
+

+ {t('editor.link_modal.title')} +

+ +
+
+
+ + setUrl(e.target.value)} + placeholder={t('editor.link_modal.url_placeholder')} + className="w-full px-3 py-2 bg-gray-700 border border-gray-600 rounded-md text-gray-100 placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500" + /> +
+
+ + +
+
+
+
+ ); +}; + +// Password Modal Component +const PasswordModal = ({ isOpen, onClose, onSubmit }) => { + const [passwordLength, setPasswordLength] = useState(16); + const [password, setPassword] = useState(generatePassword(16)); + const [options, setOptions] = useState({ + numbers: true, + symbols: true, + uppercase: true, + lowercase: true, + }); + const { t } = useTranslation(); + + if (!isOpen) return null; + + const regeneratePassword = () => { + setPassword(generatePassword(passwordLength, options)); + }; + + const handleOptionChange = (option) => { + // Prevent disabling all options - at least one must be enabled + const newOptions = { ...options, [option]: !options[option] }; + if (Object.values(newOptions).some((value) => value)) { + setOptions(newOptions); + setPassword(generatePassword(passwordLength, newOptions)); + } + }; + + const handleSubmit = (e) => { + e.preventDefault(); + onSubmit(password); + onClose(); + }; + + return ( +
+
+
+

+ {t('editor.password_modal.title')} +

+ +
+
+
+ +
+ { + const newLength = parseInt(e.target.value); + setPasswordLength(newLength); + setPassword(generatePassword(newLength, options)); + }} + className="w-full mr-3 accent-primary" + style={{ + // Fallback for browsers that don't support accent-color + '--tw-accent-color': 'var(--color-primary)', + }} + /> + {passwordLength} +
+ +
+ +
+
+ handleOptionChange('numbers')} + className="mr-2 checked:bg-primary checked:hover:bg-primary/80 checked:focus:bg-primary/60 checked:active:bg-primary/60" + /> + +
+
+ handleOptionChange('symbols')} + className="mr-2 checked:bg-primary checked:hover:bg-primary/80 checked:active:bg-primary/60 checked:focus:bg-primary/60" + /> + +
+
+ handleOptionChange('uppercase')} + className="mr-2 checked:bg-primary checked:hover:bg-primary/80 checked:active:bg-primary/60 checked:focus:bg-primary/60" + /> + +
+
+ handleOptionChange('lowercase')} + className="mr-2 checked:bg-primary checked:hover:bg-primary/80 checked:active:bg-primary/60 checked:focus:bg-primary/60" + /> + +
+
+
+ + +
+ + +
+
+
+ + +
+
+
+
+ ); +}; + +// ReadOnlyMenuBar component for non-editable mode +const ReadOnlyMenuBar = () => { + const { editor } = useCurrentEditor(); + const [copySuccess, setCopySuccess] = useState(''); + const { t } = useTranslation(); + + if (!editor) { + return null; + } + + const copyAsHTML = () => { + const html = editor.getHTML(); + navigator.clipboard + .writeText(html) + .then(() => { + setCopySuccess(t('editor.copy_success.html')); + setTimeout(() => setCopySuccess(''), 2000); + }) + .catch((err) => { + console.error('Failed to copy: ', err); + }); + }; + + const copyAsPlainText = () => { + const text = editor.getText(); + navigator.clipboard + .writeText(text) + .then(() => { + setCopySuccess(t('editor.copy_success.text')); + setTimeout(() => setCopySuccess(''), 2000); + }) + .catch((err) => { + console.error('Failed to copy: ', err); + }); + }; + + const copyAsBase64 = () => { + const text = editor.getText(); + // Convert to Base64 + const base64Content = btoa( + new TextEncoder() + .encode(text) + .reduce((acc, byte) => acc + String.fromCharCode(byte), '') + ); + navigator.clipboard + .writeText(base64Content) + .then(() => { + setCopySuccess(t('editor.copy_success.base64')); + setTimeout(() => setCopySuccess(''), 2000); + }) + .catch((err) => { + console.error('Failed to copy: ', err); + }); + }; + + const buttonClass = + 'p-1.5 text-sm rounded-md hover:bg-gray-700 text-gray-200 transition-colors'; + const groupClass = 'flex items-center border border-gray-700 rounded-md bg-gray-800 shadow-sm'; + + return ( +
+
+
+ + + + + + + + + +
+
+ {copySuccess && ( +
{copySuccess}
+ )} +
+ ); +}; + +const MenuBar = ({ content }) => { + const { editor } = useCurrentEditor(); + const [linkModalOpen, setLinkModalOpen] = useState(false); + const [passwordModalOpen, setPasswordModalOpen] = useState(false); + const { t } = useTranslation(); + + if (!editor) { + return null; + } + + // If the content is empty, clear the editor content + // this is a hack until I figure out how to handle this better + useEffect(() => { + if (content === '') { + editor.commands.clearContent(); + } + }, []); + + // Updated button styles without dark mode prefixes + const buttonClass = + 'p-1.5 text-sm rounded-md hover:bg-gray-700 text-gray-200 transition-colors'; + const activeButtonClass = + 'p-1.5 text-sm rounded-md bg-blue-900/30 text-blue-400 transition-colors'; + + // Updated group styles without dark mode prefixes + const groupClass = 'flex items-center border border-gray-700 rounded-md bg-gray-800 shadow-sm'; + + // Updated link handling function + const openLinkModal = useCallback(() => { + const previousUrl = editor.getAttributes('link').href || ''; + setLinkModalOpen(true); + }, [editor]); + + const handleLinkSubmit = useCallback( + (url) => { + // Empty + if (url === '') { + editor.chain().focus().extendMarkRange('link').unsetLink().run(); + return; + } + + // Add protocol if missing + if (!/^https?:\/\//i.test(url)) { + url = 'https://' + url; + } + + // Update link + try { + editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run(); + } catch (e) { + alert(e.message); + } + }, + [editor] + ); + + // Password handling function + const handlePasswordSubmit = useCallback( + (password) => { + editor.chain().focus().insertContent(password).run(); + }, + [editor] + ); + + return ( + <> +
+
+ {/* Text formatting group */} +
+ + + + + + + + + + + + + + + + + + + + + +
+ + {/* Paragraph formatting group */} +
+ + + + + + + + + + + + +
+ + {/* List formatting group */} +
+ + + + + + + + + + + + +
+ + {/* History controls */} +
+ + + + + + +
+
+
+ + {/* Link Modal */} + setLinkModalOpen(false)} + onSubmit={handleLinkSubmit} + initialUrl={editor?.getAttributes('link').href || ''} + /> + + {/* Password Modal */} + setPasswordModalOpen(false)} + onSubmit={handlePasswordSubmit} + /> + + ); +}; + +const extensions = [ + Color.configure({ types: [TextStyle.name, ListItem.name] }), + TextStyle.configure({ types: [ListItem.name] }), + Link.configure({ + openOnClick: false, + autolink: true, + defaultProtocol: 'https', + protocols: ['http', 'https'], + validate: (href) => /^https?:\/\//.test(href), + }), + StarterKit.configure({ + bulletList: { + keepMarks: true, + keepAttributes: false, // TODO : Making this as `false` becase marks are not preserved when I try to preserve attrs, awaiting a bit of help + }, + orderedList: { + keepMarks: true, + keepAttributes: false, // TODO : Making this as `false` becase marks are not preserved when I try to preserve attrs, awaiting a bit of help + }, + }), +]; + +export default function Editor({ content = '', setContent, editable = true, ...props }) { + return ( +
+ : } + extensions={extensions} + editable={editable} + content={content} + onUpdate={({ editor }) => { + if (setContent) { + setContent(editor.getHTML()); + } + }} + editorProps={{ + attributes: { + class: 'flex-1 overflow-auto focus:outline-none text-gray-100 prose-headings:mt-6 prose-headings:first:mt-0 prose-headings:text-gray-100 prose-h1:text-2xl prose-h1:font-bold prose-h1:mb-4 prose-h2:text-xl prose-h2:font-bold prose-h2:mb-3 prose-h3:text-lg prose-h3:font-semibold prose-h3:mb-3 prose-p:my-3 prose-p:leading-relaxed prose-p:text-gray-200 prose-strong:text-gray-200 prose-strong:font-bold prose-em:text-gray-200 prose-ul:pl-5 prose-ul:my-3 prose-ol:pl-5 prose-ol:my-3 prose-li:my-1 prose-li:leading-normal prose-li:text-gray-200 prose-a:text-gray-100 prose-a:underline prose-a:font-medium hover:prose-a:text-gray-50 prose-code:bg-gray-800 prose-code:text-gray-200 prose-code:px-1.5 prose-code:py-0.5 prose-code:rounded prose-code:text-sm prose-code:font-mono prose-pre:bg-gray-900 prose-pre:text-white prose-pre:p-4 prose-pre:rounded-lg prose-pre:my-4 prose-pre:overflow-auto prose-pre:code:bg-transparent prose-pre:code:p-0 prose-pre:code:text-sm prose-pre:code:font-mono prose-blockquote:border-l-4 prose-blockquote:border-gray-600 prose-blockquote:pl-4 prose-blockquote:py-1 prose-blockquote:my-4 prose-blockquote:italic prose-blockquote:text-gray-300 prose-hr:my-6 prose-hr:border-gray-700', + }, + }} + {...props} + /> +
+ ); +} diff --git a/client/components/quill/index.jsx b/client/components/quill/index.jsx deleted file mode 100644 index e68e3a8..0000000 --- a/client/components/quill/index.jsx +++ /dev/null @@ -1,133 +0,0 @@ -import { IconKey } from '@tabler/icons'; -import { generate } from 'generate-password-browser'; -import { useEffect, useRef } from 'react'; -import { useTranslation } from 'react-i18next'; -import ReactQuill from 'react-quill'; -import 'react-quill/dist/quill.snow.css'; - -// https://github.com/zenoamaro/react-quill/issues/836#issuecomment-2440290893 -class ReactQuillFixed extends ReactQuill { - destroyEditor() { - super.destroyEditor(); - delete this.editor; - } -} - -// Custom button component for password generation -const PasswordButton = ({ onClick, tooltip }) => ( - -); - -const Quill = ({ value, onChange, readOnly, defaultValue }) => { - const quillRef = useRef(null); - const containerRef = useRef(null); - const { t } = useTranslation(); - - useEffect(() => { - const handleClickOutside = (event) => { - if ( - containerRef.current && - !containerRef.current.contains(event.target) && - quillRef.current - ) { - const editor = quillRef.current.getEditor(); - if (editor) { - editor.blur(); - } - } - }; - - document.addEventListener('mousedown', handleClickOutside); - return () => { - document.removeEventListener('mousedown', handleClickOutside); - }; - }, []); - - // Custom handler for password generation - const handlePasswordGeneration = () => { - if (!quillRef.current) return; - - const editor = quillRef.current.getEditor(); - if (!editor) return; - - const password = generate({ - length: 16, - numbers: true, - symbols: true, - uppercase: true, - lowercase: true, - }); - const range = editor.getSelection(true); - editor.insertText(range.index, password + '\n'); - }; - - // Define modules based on readOnly state - const modules = readOnly - ? { - toolbar: false, // Disable toolbar in read-only mode - } - : { - toolbar: { - container: [ - [{ header: [1, 2, 3, false] }], - ['bold', 'italic', 'underline', 'strike'], - [{ list: 'ordered' }, { list: 'bullet' }], - ['link', 'code-block'], - ['clean'], - // Custom button container - [{ 'custom-button': 'password' }], - ], - handlers: { - 'custom-button': handlePasswordGeneration, - }, - }, - }; - - return ( -
-
- - {!readOnly && ( -
-
- -
- )} -
-
- ); -}; - -export default Quill; diff --git a/client/components/switch/index.jsx b/client/components/switch/index.jsx index 31c6e2a..5883f78 100644 --- a/client/components/switch/index.jsx +++ b/client/components/switch/index.jsx @@ -1,4 +1,4 @@ -export function Switch({ checked, onChange, className = '', children }) { +export function Switch({ checked, onChange, className = '', children, ...props }) { return ( - - ))} - - )} - - )} - {disableFileUpload && ( -
-
-
- -
-
-
- {t('home.login_to_upload')} + title={t('home.remove_file')} + > + +
+ ))} +
+ )} +
+ )} + {disableFileUpload && ( +
+
+
+ +
+
+
+ {t('home.login_to_upload')}
- - {t('home.sign_in')} -
- )} -
- + + {t('home.sign_in')} + +
+ )} + + - -
-
-
- +
+ +
+
+ -
+ {enablePassword && ( +
+
+
+ +
+ { + e.preventDefault(); + setField('formData.password', e.target.value); + }} + readOnly={inputReadOnly} + className="w-full pl-10 pr-10 py-3 text-sm bg-black/20 border border-white/[0.08] + rounded-lg text-gray-100 placeholder-gray-500 + hover:border-white/[0.12] focus:border-primary focus:ring-1 + focus:ring-primary/50 transition-all duration-200" + placeholder={t('home.password')} + /> +
+ +
+
+
+ )} +
+
+ + {!settings.hide_allowed_ip_input && (
- {enablePassword && ( + {enableIpRange && (
-
- +
+
- { - e.preventDefault(); - setField( - 'formData.password', - e.target.value - ); - }} - readOnly={inputReadOnly} - className="w-full pl-10 pr-10 py-3 text-sm bg-black/20 border border-white/[0.08] - rounded-lg text-gray-100 placeholder-gray-500 - hover:border-white/[0.12] focus:border-primary focus:ring-1 - focus:ring-primary/50 transition-all duration-200" - placeholder={t('home.password')} - /> -
- +
+ { + e.preventDefault(); + setField( + 'formData.allowedIp', + e.target.value + ); + }} + readOnly={inputReadOnly} + className="w-full pl-10 pr-3 text-sm py-3 bg-black/20 border border-white/[0.08] + rounded-lg text-gray-100 placeholder-gray-500 + hover:border-white/[0.12] focus:border-primary focus:ring-1 + focus:ring-primary/50 transition-all duration-200" + />
)}
+ )} +
- {!settings.hide_allowed_ip_input && ( -
-
- - - {enableIpRange && ( -
-
-
- -
-
- { - e.preventDefault(); - setField( - 'formData.allowedIp', - e.target.value - ); - }} - readOnly={inputReadOnly} - className="w-full pl-10 pr-3 text-sm py-3 bg-black/20 border border-white/[0.08] - rounded-lg text-gray-100 placeholder-gray-500 - hover:border-white/[0.12] focus:border-primary focus:ring-1 - focus:ring-primary/50 transition-all duration-200" - /> -
-
-
- )} -
+
+
+
+
+
- )} -
- -
-
-
-
- -
- setField('formData.ttl', e.target.value)} + className="w-full pl-10 pr-8 py-3 text-sm bg-black/20 border border-white/[0.08] rounded-lg text-gray-100 placeholder-gray-500 hover:border-white/[0.12] focus:border-primary focus:ring-1 focus:ring-primary/50 transition-all duration-200 appearance-none cursor-pointer [&>option]:bg-gray-800 [&>option]:text-gray-100" - style={{ - backgroundImage: `url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e")`, - backgroundPosition: 'right 0.5rem center', - backgroundRepeat: 'no-repeat', - backgroundSize: '1.5em 1.5em', - }} - > - {ttlValues.map((option) => ( - - ))} - -
-

- {t('home.ttl_description')} -

+ style={{ + backgroundImage: `url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e")`, + backgroundPosition: 'right 0.5rem center', + backgroundRepeat: 'no-repeat', + backgroundSize: '1.5em 1.5em', + }} + > + {ttlValues.map((option) => ( + + ))} +
+

+ {t('home.ttl_description')} +

+
- {!formData.preventBurn && ( -
-
-
- -
-
-
- - {t('home.max_views')} - -
-
- -
- +
+ +
+
+
+ + {t('home.max_views')} + +
+
+ +
+ - {t('home.max_views_description')} - -
-
-
- {formData.maxViews} {t('home.views')} + > + {t('home.max_views_description')} +
+
+ {formData.maxViews} {t('home.views')} +
- - setField('formData.maxViews', parseInt(e.target.value)) - } - className="w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer - accent-primary focus:outline-none focus:ring-2 focus:ring-primary/50" - />
- )} + + setField('formData.maxViews', parseInt(e.target.value)) + } + disabled={inputReadOnly} + className={`w-full h-2 bg-gray-700 rounded-lg appearance-none + ${inputReadOnly ? 'cursor-not-allowed opacity-80' : 'cursor-pointer'} + accent-primary focus:outline-none focus:ring-2 focus:ring-primary/50`} + /> +
+ )} -
-
-
-
- +
+
+
+
+ +
+
+
+ {t('home.burn_after_time')}
-
-
- {t('home.burn_after_time')} -
-
- {t('home.burn_aftertime')} -
+
+ {t('home.burn_aftertime')}
- - setField('formData.preventBurn', checked) - } - > - {t('home.burn_after_time')} -
+ + setField('formData.preventBurn', checked) + } + disabled={inputReadOnly} + > + {t('home.burn_after_time')} +
- +
+ -
- {!secretId && ( - - )} -
+ > + {t('home.text_required')} + + )} + + )} +
- {secretId && ( - <> - -
-
- -
- - - - +
+ +
+ + + + -
- -
+ /> +
+
- -
- -
- - - - -
- -
-
-
- -
- -
- - -
-
-
- - - - + +
+ + + + -
- -
+ /> +
+
+
-
-
+
+ + + +
+
+
+ + + + +
+ +
+
+
+ +
+ + > + + {t('home.share')} + - + > + + {t('home.create_new')} + - -
+ > + + {t('home.burn')} +
-
- - )} - +
+
+ + )}

Hemmelig, [he`m:(ə)li], {t('home.norwegian_meaning')} @@ -816,7 +823,7 @@ const FormSection = ({ title, subtitle, children, error, collapsible }) => { const [isCollapsed, setIsCollapsed] = useState(collapsible); return ( -

+
{title && (
{ const id = '#encryption_key='; @@ -42,7 +41,6 @@ const Secret = () => { const [files, setFiles] = useState(null); const [isDownloaded, setIsDownloaded] = useState([]); const [error, setError] = useState(null); - const [hasConvertedBase64ToPlain, setHasConvertedBase64ToPlain] = useState(false); // Fetch secret existence on mount useEffect(() => { @@ -142,15 +140,6 @@ const Secret = () => { } }; - const convertBase64ToPlain = () => { - if (!hasConvertedBase64ToPlain) { - setSecret(btoa(secret)); - } else { - setSecret(atob(secret)); - } - setHasConvertedBase64ToPlain(!hasConvertedBase64ToPlain); - }; - return (
@@ -176,7 +165,7 @@ const Secret = () => { {/* Main Content */}
{ {/* Secret Content */}
- +
{/* File Downloads Section */} @@ -321,20 +310,6 @@ const Secret = () => { )} - {/* Convert Base64 Button */} - {isSecretOpen && ( - - )} - {/* Create New Secret Button */} {isSecretOpen && ( =14" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@prisma/client": { "version": "4.16.2", "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", @@ -2315,6 +2332,13 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/@remirror/core-constants": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", + "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", + "dev": true, + "license": "MIT" + }, "node_modules/@remix-run/router": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", @@ -3298,6 +3322,479 @@ "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20" } }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", + "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + } + }, + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@tiptap/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.11.5.tgz", + "integrity": "sha512-jb0KTdUJaJY53JaN7ooY3XAxHQNoMYti/H6ANo707PsLXVeEqJ9o8+eBup1JU5CuwzrgnDc2dECt2WIGX9f8Jw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-blockquote": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.11.5.tgz", + "integrity": "sha512-MZfcRIzKRD8/J1hkt/eYv49060GTL6qGR3NY/oTDuw2wYzbQXXLEbjk8hxAtjwNn7G+pWQv3L+PKFzZDxibLuA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bold": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.11.5.tgz", + "integrity": "sha512-OAq03MHEbl7MtYCUzGuwb0VpOPnM0k5ekMbEaRILFU5ZC7cEAQ36XmPIw1dQayrcuE8GZL35BKub2qtRxyC9iA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.11.5.tgz", + "integrity": "sha512-rx+rMd7EEdht5EHLWldpkzJ56SWYA9799b33ustePqhXd6linnokJCzBqY13AfZ9+xp3RsR6C0ZHI9GGea0tIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bullet-list": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.11.5.tgz", + "integrity": "sha512-VXwHlX6A/T6FAspnyjbKDO0TQ+oetXuat6RY1/JxbXphH42nLuBaGWJ6pgy6xMl6XY8/9oPkTNrfJw/8/eeRwA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-code": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.11.5.tgz", + "integrity": "sha512-xOvHevNIQIcCCVn9tpvXa1wBp0wHN/2umbAZGTVzS+AQtM7BTo0tz8IyzwxkcZJaImONcUVYLOLzt2AgW1LltA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-code-block": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.11.5.tgz", + "integrity": "sha512-ksxMMvqLDlC+ftcQLynqZMdlJT1iHYZorXsXw/n+wuRd7YElkRkd6YWUX/Pq/njFY6lDjKiqFLEXBJB8nrzzBA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-color": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.11.5.tgz", + "integrity": "sha512-9gZF6EIpfOJYUt1TtFY37e8iqwKcOmBl8CkFaxq+4mWVvYd2D7KbA0r4tYTxSO0fOBJ5fA/1qJrpvgRlyocp/A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/extension-text-style": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-document": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.11.5.tgz", + "integrity": "sha512-7I4BRTpIux2a0O2qS3BDmyZ5LGp3pszKbix32CmeVh7lN9dV7W5reDqtJJ9FCZEEF+pZ6e1/DQA362dflwZw2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-dropcursor": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.11.5.tgz", + "integrity": "sha512-uIN7L3FU0904ec7FFFbndO7RQE/yiON4VzAMhNn587LFMyWO8US139HXIL4O8dpZeYwYL3d1FnDTflZl6CwLlg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-floating-menu": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.11.5.tgz", + "integrity": "sha512-HsMI0hV5Lwzm530Z5tBeyNCBNG38eJ3qjfdV2OHlfSf3+KOEfn6a5AUdoNaZO02LF79/8+7BaYU2drafag9cxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-gapcursor": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.11.5.tgz", + "integrity": "sha512-kcWa+Xq9cb6lBdiICvLReuDtz/rLjFKHWpW3jTTF3FiP3wx4H8Rs6bzVtty7uOVTfwupxZRiKICAMEU6iT0xrQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-hard-break": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.11.5.tgz", + "integrity": "sha512-q9doeN+Yg9F5QNTG8pZGYfNye3tmntOwch683v0CCVCI4ldKaLZ0jG3NbBTq+mosHYdgOH2rNbIORlRRsQ+iYQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-heading": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.11.5.tgz", + "integrity": "sha512-x/MV53psJ9baRcZ4k4WjnCUBMt8zCX7mPlKVT+9C/o+DEs/j/qxPLs95nHeQv70chZpSwCQCt93xMmuF0kPoAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-history": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.11.5.tgz", + "integrity": "sha512-b+wOS33Dz1azw6F1i9LFTEIJ/gUui0Jwz5ZvmVDpL2ZHBhq1Ui0/spTT+tuZOXq7Y/uCbKL8Liu4WoedIvhboQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-horizontal-rule": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.11.5.tgz", + "integrity": "sha512-3up2r1Du8/5/4ZYzTC0DjTwhgPI3dn8jhOCLu73m5F3OGvK/9whcXoeWoX103hYMnGDxBlfOje71yQuN35FL4A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-italic": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.11.5.tgz", + "integrity": "sha512-9VGfb2/LfPhQ6TjzDwuYLRvw0A6VGbaIp3F+5Mql8XVdTBHb2+rhELbyhNGiGVR78CaB/EiKb6dO9xu/tBWSYA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-link": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.11.5.tgz", + "integrity": "sha512-4Iu/aPzevbYpe50xDI0ZkqRa6nkZ9eF270Ue2qaF3Ab47nehj+9Jl78XXzo8+LTyFMnrETI73TAs1aC/IGySeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "linkifyjs": "^4.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-list-item": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.11.5.tgz", + "integrity": "sha512-Mp5RD/pbkfW1vdc6xMVxXYcta73FOwLmblQlFNn/l/E5/X1DUSA4iGhgDDH4EWO3swbs03x2f7Zka/Xoj3+WLg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-ordered-list": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.11.5.tgz", + "integrity": "sha512-Cu8KwruBNWAaEfshRQR0yOSaUKAeEwxW7UgbvF9cN/zZuKgK5uZosPCPTehIFCcRe+TBpRtZQh+06f/gNYpYYg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-paragraph": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.11.5.tgz", + "integrity": "sha512-YFBWeg7xu/sBnsDIF/+nh9Arf7R0h07VZMd0id5Ydd2Qe3c1uIZwXxeINVtH0SZozuPIQFAT8ICe9M0RxmE+TA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-strike": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.11.5.tgz", + "integrity": "sha512-PVfUiCqrjvsLpbIoVlegSY8RlkR64F1Rr2RYmiybQfGbg+AkSZXDeO0eIrc03//4gua7D9DfIozHmAKv1KN3ow==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-text": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.11.5.tgz", + "integrity": "sha512-Gq1WwyhFpCbEDrLPIHt5A8aLSlf8bfz4jm417c8F/JyU0J5dtYdmx0RAxjnLw1i7ZHE7LRyqqAoS0sl7JHDNSQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-text-style": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.11.5.tgz", + "integrity": "sha512-YUmYl0gILSd/u/ZkOmNxjNXVw+mu8fpC2f8G4I4tLODm0zCx09j9DDEJXSrM5XX72nxJQqtSQsCpNKnL0hfeEQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/pm": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.11.5.tgz", + "integrity": "sha512-z9JFtqc5ZOsdQLd9vRnXfTCQ8v5ADAfRt9Nm7SqP6FUHII8E1hs38ACzf5xursmth/VonJYb5+73Pqxk1hGIPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-changeset": "^2.2.1", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.6.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.13.1", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.23.0", + "prosemirror-schema-basic": "^1.2.3", + "prosemirror-schema-list": "^1.4.1", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.6.3", + "prosemirror-trailing-node": "^3.0.0", + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.37.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/react": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.11.5.tgz", + "integrity": "sha512-Dp8eHL1G+R/C4+QzAczyb3t1ovexEIZx9ln7SGEM+cT1KHKAw9XGPRgsp92+NQaYI+EdEb/YqoBOSzQcd18/OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tiptap/extension-bubble-menu": "^2.11.5", + "@tiptap/extension-floating-menu": "^2.11.5", + "@types/use-sync-external-store": "^0.0.6", + "fast-deep-equal": "^3", + "use-sync-external-store": "^1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tiptap/starter-kit": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.11.5.tgz", + "integrity": "sha512-SLI7Aj2ruU1t//6Mk8f+fqW+18uTqpdfLUJYgwu0CkqBckrkRZYZh6GVLk/02k3H2ki7QkFxiFbZrdbZdng0JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tiptap/core": "^2.11.5", + "@tiptap/extension-blockquote": "^2.11.5", + "@tiptap/extension-bold": "^2.11.5", + "@tiptap/extension-bullet-list": "^2.11.5", + "@tiptap/extension-code": "^2.11.5", + "@tiptap/extension-code-block": "^2.11.5", + "@tiptap/extension-document": "^2.11.5", + "@tiptap/extension-dropcursor": "^2.11.5", + "@tiptap/extension-gapcursor": "^2.11.5", + "@tiptap/extension-hard-break": "^2.11.5", + "@tiptap/extension-heading": "^2.11.5", + "@tiptap/extension-history": "^2.11.5", + "@tiptap/extension-horizontal-rule": "^2.11.5", + "@tiptap/extension-italic": "^2.11.5", + "@tiptap/extension-list-item": "^2.11.5", + "@tiptap/extension-ordered-list": "^2.11.5", + "@tiptap/extension-paragraph": "^2.11.5", + "@tiptap/extension-strike": "^2.11.5", + "@tiptap/extension-text": "^2.11.5", + "@tiptap/extension-text-style": "^2.11.5", + "@tiptap/pm": "^2.11.5" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", @@ -3423,6 +3920,31 @@ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "license": "MIT" }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -3442,15 +3964,12 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/quill": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", - "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "dev": true, - "license": "MIT", - "dependencies": { - "parchment": "^1.1.2" - } + "license": "MIT" }, "node_modules/@vitejs/plugin-react": { "version": "4.3.3", @@ -3868,56 +4387,6 @@ "ieee754": "^1.2.1" } }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4112,16 +4581,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -4258,6 +4717,13 @@ "node": ">= 6" } }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "dev": true, + "license": "MIT" + }, "node_modules/cross-fetch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", @@ -4575,27 +5041,6 @@ "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", "license": "MIT" }, - "node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -4606,42 +5051,6 @@ "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4714,21 +5123,6 @@ "node": ">=12" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -4799,39 +5193,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -4898,13 +5259,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eventemitter3": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", - "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==", - "dev": true, - "license": "MIT" - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -4938,13 +5292,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, "node_modules/fast-decode-uri-component": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", @@ -4957,13 +5304,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, - "node_modules/fast-diff": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", - "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/fast-equals": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", @@ -5346,16 +5686,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/generate-password-browser": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/generate-password-browser/-/generate-password-browser-1.1.0.tgz", @@ -5385,31 +5715,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "get-proto": "^1.0.0", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -5417,20 +5722,6 @@ "dev": true, "license": "ISC" }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -5486,19 +5777,6 @@ "node": ">=4" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -5524,48 +5802,6 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -5868,23 +6104,6 @@ "node": ">= 0.10" } }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -5928,23 +6147,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6009,25 +6211,6 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "license": "MIT" }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", @@ -6315,6 +6498,23 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/linkifyjs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.2.0.tgz", + "integrity": "sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw==", + "dev": true, + "license": "MIT" + }, "node_modules/lint-staged": { "version": "11.2.6", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.2.6.tgz", @@ -6401,6 +6601,27 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -6503,16 +6724,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" } }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, "node_modules/meow": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-11.0.0.tgz", @@ -7001,33 +7237,6 @@ "node": ">= 6" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/obliterator": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", @@ -7069,6 +7278,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/orderedmap": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "dev": true, + "license": "MIT" + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -7130,13 +7346,6 @@ "dev": true, "license": "(MIT AND Zlib)" }, - "node_modules/parchment": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", - "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7612,6 +7821,219 @@ "react-is": "^16.13.1" } }, + "node_modules/prosemirror-changeset": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz", + "integrity": "sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-collab": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", + "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.0.tgz", + "integrity": "sha512-6toodS4R/Aah5pdsrIwnTYPEjW70SlO5a66oo5Kk+CIrgJz3ukOoS+FYDGqvQlAX5PxoGWDX1oD++tn5X3pyRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz", + "integrity": "sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", + "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz", + "integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz", + "integrity": "sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz", + "integrity": "sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-markdown": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.1.tgz", + "integrity": "sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/markdown-it": "^14.0.0", + "markdown-it": "^14.0.0", + "prosemirror-model": "^1.20.0" + } + }, + "node_modules/prosemirror-menu": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz", + "integrity": "sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "crelt": "^1.0.0", + "prosemirror-commands": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.24.1.tgz", + "integrity": "sha512-YM053N+vTThzlWJ/AtPtF1j0ebO36nvbmDy4U7qA2XQB8JVaQp1FmB9Jhrps8s+z+uxhhVTny4m20ptUvhk0Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-basic": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.3.tgz", + "integrity": "sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.19.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.0.tgz", + "integrity": "sha512-gg1tAfH1sqpECdhIHOA/aLg2VH3ROKBWQ4m8Qp9mBKrOxQRW61zc+gMCI8nh22gnBzd1t2u1/NPLmO3nAa3ssg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", + "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.6.4.tgz", + "integrity": "sha512-TkDY3Gw52gRFRfRn2f4wJv5WOgAOXLJA2CQJYIJ5+kdFbfj3acR4JUW6LX2e1hiEBiUwvEhzH5a3cZ5YSztpIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.2.2", + "prosemirror-model": "^1.24.1", + "prosemirror-state": "^1.4.3", + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.37.2" + } + }, + "node_modules/prosemirror-trailing-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", + "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@remirror/core-constants": "3.0.0", + "escape-string-regexp": "^4.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.22.1", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.33.8" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.2.tgz", + "integrity": "sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.38.0.tgz", + "integrity": "sha512-O45kxXQTaP9wPdXhp8TKqCR+/unS/gnfg9Q93svQcB3j0mlp2XSPAmsPefxHADwzC+fbNS404jqRxm3UQaGvgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -7634,6 +8056,16 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/qr.js": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/qr.js/-/qr.js-0.0.0.tgz", @@ -7685,36 +8117,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/quill": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", - "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "clone": "^2.1.1", - "deep-equal": "^1.0.1", - "eventemitter3": "^2.0.3", - "extend": "^3.0.2", - "parchment": "^1.1.4", - "quill-delta": "^3.6.2" - } - }, - "node_modules/quill-delta": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", - "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-equal": "^1.0.1", - "extend": "^3.0.2", - "fast-diff": "1.1.2" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -7792,22 +8194,6 @@ "react": "*" } }, - "node_modules/react-quill": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz", - "integrity": "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/quill": "^1.3.10", - "lodash": "^4.17.4", - "quill": "^1.3.7" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18" - } - }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -8241,27 +8627,6 @@ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "license": "MIT" }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8390,6 +8755,13 @@ "fsevents": "~2.3.2" } }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", + "dev": true, + "license": "MIT" + }, "node_modules/rrweb-cssom": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", @@ -8561,40 +8933,6 @@ "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", "license": "MIT" }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -9126,6 +9464,16 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, + "node_modules/tippy.js": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", + "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.9.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -9294,6 +9642,13 @@ "node": ">=14.17" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -9362,8 +9717,6 @@ "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } @@ -9503,6 +9856,13 @@ "node": ">=0.10.0" } }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "dev": true, + "license": "MIT" + }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", diff --git a/package.json b/package.json index b0af94c..b5f9987 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "@fastify/vite": "^7.0.1", "@prisma/client": "^4.12.0", "@vitejs/plugin-react": "^4.2.1", - "tailwindcss": "^3.4.14", "bcryptjs": "^2.4.3", "config": "^3.3.6", "email-validator": "^2.0.4", @@ -62,18 +61,22 @@ "pretty-bytes": "^4.0.2", "recharts": "^2.13.0", "sanitize-filename": "^1.6.3", + "tailwindcss": "^3.4.14", "unfetch": "^4.2.0", "validator": "^13.7.0", "y8": "^1.0.5" }, "devDependencies": { - "autoprefixer": "^10.4.20", - "react-qr-code": "^2.0.8", "@tabler/icons": "^1.83.1", "@tailwindcss/forms": "^0.5.9", - "tweetnacl": "^0.14.5", - "tweetnacl-util": "^0.15.1", - "react-router-dom": "^6.21.3", + "@tailwindcss/typography": "^0.5.16", + "@tiptap/extension-color": "^2.11.5", + "@tiptap/extension-link": "^2.11.5", + "@tiptap/extension-list-item": "^2.11.5", + "@tiptap/extension-text-style": "^2.11.5", + "@tiptap/react": "^2.11.5", + "@tiptap/starter-kit": "^2.11.5", + "autoprefixer": "^10.4.20", "buffer": "^6.0.3", "classcat": "^5.0.3", "dayjs": "^1.11.7", @@ -95,7 +98,10 @@ "react": "^18.3.1", "react-dom": "^18.0.0", "react-i18next": "^11.18.5", - "react-quill": "^2.0.0", + "react-qr-code": "^2.0.8", + "react-router-dom": "^6.21.3", + "tweetnacl": "^0.14.5", + "tweetnacl-util": "^0.15.1", "vite": "^5.4.10", "zustand": "^5.0.0" }, diff --git a/public/locales/cs/translation.json b/public/locales/cs/translation.json index e45186a..0792d3e 100644 --- a/public/locales/cs/translation.json +++ b/public/locales/cs/translation.json @@ -274,5 +274,55 @@ "not_logged_in": "Nejste přihlášeni", "something_went_wrong": "Něco se pokazilo!", "loading": "Načítání", - "common": {} + "common": {}, + "editor": { + "tooltips": { + "bold": "Tučné", + "italic": "Kurzíva", + "strikethrough": "Přeškrtnuté", + "inline_code": "Inline kód", + "link": "Odkaz", + "remove_link": "Odstranit odkaz", + "insert_password": "Vložit heslo", + "paragraph": "Odstavec", + "heading1": "Nadpis 1", + "heading2": "Nadpis 2", + "heading3": "Nadpis 3", + "bullet_list": "Odrážkový seznam", + "numbered_list": "Číslovaný seznam", + "blockquote": "Citace", + "code_block": "Blok kódu", + "undo": "Zpět", + "redo": "Znovu", + "copy_html": "Kopírovat jako HTML", + "copy_text": "Kopírovat jako prostý text", + "copy_base64": "Kopírovat jako Base64" + }, + "link_modal": { + "title": "Vložit odkaz", + "url_label": "URL", + "url_placeholder": "https://priklad.cz", + "cancel": "Zrušit", + "insert": "Vložit", + "update": "Aktualizovat" + }, + "password_modal": { + "title": "Vložit heslo", + "length_label": "Délka hesla", + "options_label": "Možnosti hesla", + "include_numbers": "Zahrnout čísla", + "include_symbols": "Zahrnout symboly", + "include_uppercase": "Zahrnout velká písmena", + "include_lowercase": "Zahrnout malá písmena", + "generated_password": "Vygenerované heslo", + "refresh": "Obnovit", + "cancel": "Zrušit", + "insert": "Vložit" + }, + "copy_success": { + "html": "HTML zkopírováno!", + "text": "Prostý text zkopírován!", + "base64": "Base64 zkopírováno!" + } + } } diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 5755908..db6c577 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -259,5 +259,55 @@ "password_protected": "Passwortgeschützt", "ip_restricted": "IP-beschränkt", "average_max_views": "Durchschnittlich erlaubte Aufrufe pro Geheimnis" + }, + "editor": { + "tooltips": { + "bold": "Fett", + "italic": "Kursiv", + "strikethrough": "Durchgestrichen", + "inline_code": "Inline-Code", + "link": "Link", + "remove_link": "Link entfernen", + "insert_password": "Passwort einfügen", + "paragraph": "Absatz", + "heading1": "Überschrift 1", + "heading2": "Überschrift 2", + "heading3": "Überschrift 3", + "bullet_list": "Aufzählungsliste", + "numbered_list": "Nummerierte Liste", + "blockquote": "Zitat", + "code_block": "Codeblock", + "undo": "Rückgängig", + "redo": "Wiederherstellen", + "copy_html": "Als HTML kopieren", + "copy_text": "Als Klartext kopieren", + "copy_base64": "Als Base64 kopieren" + }, + "link_modal": { + "title": "Link einfügen", + "url_label": "URL", + "url_placeholder": "https://beispiel.de", + "cancel": "Abbrechen", + "insert": "Einfügen", + "update": "Aktualisieren" + }, + "password_modal": { + "title": "Passwort einfügen", + "length_label": "Passwortlänge", + "options_label": "Passwortoptionen", + "include_numbers": "Zahlen einschließen", + "include_symbols": "Symbole einschließen", + "include_uppercase": "Großbuchstaben einschließen", + "include_lowercase": "Kleinbuchstaben einschließen", + "generated_password": "Generiertes Passwort", + "refresh": "Aktualisieren", + "cancel": "Abbrechen", + "insert": "Einfügen" + }, + "copy_success": { + "html": "HTML kopiert!", + "text": "Klartext kopiert!", + "base64": "Base64 kopiert!" + } } } diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index fd421bc..5431abd 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -275,5 +275,55 @@ "password_protected": "Password Protected", "ip_restricted": "IP Restricted", "average_max_views": "Average Max Views Per Secret" + }, + "editor": { + "tooltips": { + "bold": "Bold", + "italic": "Italic", + "strikethrough": "Strikethrough", + "inline_code": "Inline Code", + "link": "Link", + "remove_link": "Remove Link", + "insert_password": "Insert Password", + "paragraph": "Paragraph", + "heading1": "Heading 1", + "heading2": "Heading 2", + "heading3": "Heading 3", + "bullet_list": "Bullet List", + "numbered_list": "Numbered List", + "blockquote": "Blockquote", + "code_block": "Code Block", + "undo": "Undo", + "redo": "Redo", + "copy_html": "Copy as HTML", + "copy_text": "Copy as Plain Text", + "copy_base64": "Copy as Base64" + }, + "link_modal": { + "title": "Insert Link", + "url_label": "URL", + "url_placeholder": "https://example.com", + "cancel": "Cancel", + "insert": "Insert", + "update": "Update" + }, + "password_modal": { + "title": "Insert Password", + "length_label": "Password Length", + "options_label": "Password Options", + "include_numbers": "Include Numbers", + "include_symbols": "Include Symbols", + "include_uppercase": "Include Uppercase", + "include_lowercase": "Include Lowercase", + "generated_password": "Generated Password", + "refresh": "Refresh", + "cancel": "Cancel", + "insert": "Insert" + }, + "copy_success": { + "html": "HTML copied!", + "text": "Plain text copied!", + "base64": "Base64 copied!" + } } } diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 4b445da..8cb0638 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -276,5 +276,55 @@ "password_protected": "Protegidos con contraseña", "ip_restricted": "Restringidos por IP", "average_max_views": "Promedio de vistas máximas por secreto" + }, + "editor": { + "tooltips": { + "bold": "Negrita", + "italic": "Cursiva", + "strikethrough": "Tachado", + "inline_code": "Código en línea", + "link": "Enlace", + "remove_link": "Eliminar enlace", + "insert_password": "Insertar contraseña", + "paragraph": "Párrafo", + "heading1": "Encabezado 1", + "heading2": "Encabezado 2", + "heading3": "Encabezado 3", + "bullet_list": "Lista con viñetas", + "numbered_list": "Lista numerada", + "blockquote": "Cita", + "code_block": "Bloque de código", + "undo": "Deshacer", + "redo": "Rehacer", + "copy_html": "Copiar como HTML", + "copy_text": "Copiar como texto plano", + "copy_base64": "Copiar como Base64" + }, + "link_modal": { + "title": "Insertar enlace", + "url_label": "URL", + "url_placeholder": "https://ejemplo.com", + "cancel": "Cancelar", + "insert": "Insertar", + "update": "Actualizar" + }, + "password_modal": { + "title": "Insertar contraseña", + "length_label": "Longitud de la contraseña", + "options_label": "Opciones de contraseña", + "include_numbers": "Incluir números", + "include_symbols": "Incluir símbolos", + "include_uppercase": "Incluir mayúsculas", + "include_lowercase": "Incluir minúsculas", + "generated_password": "Contraseña generada", + "refresh": "Actualizar", + "cancel": "Cancelar", + "insert": "Insertar" + }, + "copy_success": { + "html": "¡HTML copiado!", + "text": "¡Texto plano copiado!", + "base64": "¡Base64 copiado!" + } } } diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 1ab9b81..52fc8d3 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -3,7 +3,7 @@ "sign_out": "Se déconnecter", "sign_up": "S'enregistrer", "not_logged_in": "Non connecté", - "something_went_wrong": "Quelque chose s'est mal passé !", + "something_went_wrong": "Quelque chose s'est mal passé !", "loading": "Chargement", "common": {}, "account": { @@ -16,7 +16,7 @@ "upload_files": "Téléversement de fichiers", "expiration": "Délai d'expiration de secret de 14 ou 28 jours", "secrets": "Lister et supprimer vos secrets", - "more": "Merci d'avoir rejoint Hemmelig.app !", + "more": "Merci d'avoir rejoint Hemmelig.app !", "features": "Fonctionnalités" }, "account": { @@ -24,7 +24,7 @@ "can_not_update_profile": "Impossible de mettre à jour votre compte utilisateur", "can_not_delete": "Impossible de supprimer l'utilisateur", "delete_account": "Supprimer votre compte", - "do_you_want_delete": "Êtes-vous sûr(e) de vouloir supprimer votre compte ?", + "do_you_want_delete": "Êtes-vous sûr(e) de vouloir supprimer votre compte ?", "dont_delete_account": "Non, ne pas le supprimer", "email": "Email", "your_password": "Mot de passe actuel", @@ -44,13 +44,13 @@ "no": "Non", "delete_secret": "Supprimer ce secret", "dont_delete_secret": "Non, ne pas le supprimer", - "do_you_want_delete": "Êtes-vous sûr(e) de vouloir supprimer ce secret ?" + "do_you_want_delete": "Êtes-vous sûr(e) de vouloir supprimer ce secret ?" }, "settings": { "read_only_mode": "Mode lecture seule", - "readonly_only_for_non_admin": "L'instance Hemmelig doit-elle être en lecture seule pour les utilisateurs non administrateurs ou créateurs ?", + "readonly_only_for_non_admin": "L'instance Hemmelig doit-elle être en lecture seule pour les utilisateurs non administrateurs ou créateurs ?", "disable_users": "Désactiver les utilisateurs", - "disable_signin": "Désactiver la connexion des utilisateurs ?", + "disable_signin": "Désactiver la connexion des utilisateurs ?", "disable_user_account_creation": "Désactiver la création de nouveaux comptes", "disable_user_account_creation_description": "Empêcher la création de compte par tout le monde. Un administrateur pourra toujours créer de nouveaux comptes utilisateurs", "hide_allowed_ip_input": "Désactiver les restrictions d'IPs", @@ -69,7 +69,7 @@ "creator": "Créateur", "user": "Utilisateur", "delete": "Suppression", - "do_you_want_delete": "Êtes-vous sûr(e) de vouloir supprimer cet utilisateur ?", + "do_you_want_delete": "Êtes-vous sûr(e) de vouloir supprimer cet utilisateur ?", "delete_user": "Supprimer cet utilisateur", "dont_delete_user": "Non, ne pas le supprimer", "have_to_be_admin": "Vous devez être un administrateur pour voir les utilisateurs" @@ -87,14 +87,14 @@ }, "session": { "auth": "Authentification", - "expire": "Votre session va expirer. Voulez-vous la renouveler ?", + "expire": "Votre session va expirer. Voulez-vous la renouveler ?", "update": "Renouveler la session" } }, "home": { "app_subtitle": "Collez un mot de passe, un message confidentiel ou des données privées.", "welcome": "Assurez-vous que vos données sensibles restent chiffrées, sécurisées et confidentielles.", - "bummer": "C'est dommage !", + "bummer": "C'est dommage !", "maintxtarea": "Écrivez vos informations sensibles", "file_upload": "Téléverser des fichiers", "content_title": "Titre", @@ -156,7 +156,7 @@ "one_time_use": "Ce secret ne peut être vu qu'une seule fois et s'autodétruira après avoir été lu.", "norwegian_meaning": "signifie « secret » en norvégien", "copy": "Copier dans le presse-papiers", - "copied": "Copié !", + "copied": "Copié !", "create": "Créer", "sign_in": "Connexion", "complete_url": "URL secrète complète", @@ -174,7 +174,7 @@ "secret": { "view_your_secret": "Afficher votre secret", "will_show_once": "Par défaut, le secret ne sera affiché qu'une seule fois.", - "views_left": "Affichages restants :", + "views_left": "Affichages restants :", "password_required": "Un mot de passe est nécessaire pour ouvrir ce secret", "view_secret": "Voir le secret", "create_secret": "Créer un nouveau secret", @@ -240,7 +240,7 @@ }, "not_found": { "title": "Page introuvable", - "description": "Oups ! Il semblerait que ce secret se soit évaporé. Ne vous inquiétez pas toutefois, vous pouvez en créer un nouveau ou consulter la documentation.", + "description": "Oups ! Il semblerait que ce secret se soit évaporé. Ne vous inquiétez pas toutefois, vous pouvez en créer un nouveau ou consulter la documentation.", "go_home": "Créer un nouveau secret", "view_docs": "Voir la doc de l'API" }, @@ -258,5 +258,55 @@ "average_views": "Nombre moyen de vues", "views_per_secret": "Vues par secret", "description": "Un aperçu complet de l'utilisation de votre plateforme et de ses fonctionnalités de sécurité" + }, + "editor": { + "tooltips": { + "bold": "Gras", + "italic": "Italique", + "strikethrough": "Barré", + "inline_code": "Code en ligne", + "link": "Lien", + "remove_link": "Supprimer le lien", + "insert_password": "Insérer un mot de passe", + "paragraph": "Paragraphe", + "heading1": "Titre 1", + "heading2": "Titre 2", + "heading3": "Titre 3", + "bullet_list": "Liste à puces", + "numbered_list": "Liste numérotée", + "blockquote": "Citation", + "code_block": "Bloc de code", + "undo": "Annuler", + "redo": "Rétablir", + "copy_html": "Copier en HTML", + "copy_text": "Copier en texte brut", + "copy_base64": "Copier en Base64" + }, + "link_modal": { + "title": "Insérer un lien", + "url_label": "URL", + "url_placeholder": "https://exemple.com", + "cancel": "Annuler", + "insert": "Insérer", + "update": "Mettre à jour" + }, + "password_modal": { + "title": "Insérer un mot de passe", + "length_label": "Longueur du mot de passe", + "options_label": "Options du mot de passe", + "include_numbers": "Inclure des chiffres", + "include_symbols": "Inclure des symboles", + "include_uppercase": "Inclure des majuscules", + "include_lowercase": "Inclure des minuscules", + "generated_password": "Mot de passe généré", + "refresh": "Actualiser", + "cancel": "Annuler", + "insert": "Insérer" + }, + "copy_success": { + "html": "HTML copié !", + "text": "Texte brut copié !", + "base64": "Base64 copié !" + } } } diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index c185219..6b87fc3 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -260,5 +260,55 @@ "password_protected": "Protetti da password", "ip_restricted": "Limitati per IP", "average_max_views": "Media visualizzazioni massime per segreto" + }, + "editor": { + "tooltips": { + "bold": "Grassetto", + "italic": "Corsivo", + "strikethrough": "Barrato", + "inline_code": "Codice in linea", + "link": "Collegamento", + "remove_link": "Rimuovi collegamento", + "insert_password": "Inserisci password", + "paragraph": "Paragrafo", + "heading1": "Titolo 1", + "heading2": "Titolo 2", + "heading3": "Titolo 3", + "bullet_list": "Elenco puntato", + "numbered_list": "Elenco numerato", + "blockquote": "Citazione", + "code_block": "Blocco di codice", + "undo": "Annulla", + "redo": "Ripristina", + "copy_html": "Copia come HTML", + "copy_text": "Copia come testo semplice", + "copy_base64": "Copia come Base64" + }, + "link_modal": { + "title": "Inserisci collegamento", + "url_label": "URL", + "url_placeholder": "https://esempio.it", + "cancel": "Annulla", + "insert": "Inserisci", + "update": "Aggiorna" + }, + "password_modal": { + "title": "Inserisci password", + "length_label": "Lunghezza password", + "options_label": "Opzioni password", + "include_numbers": "Includi numeri", + "include_symbols": "Includi simboli", + "include_uppercase": "Includi maiuscole", + "include_lowercase": "Includi minuscole", + "generated_password": "Password generata", + "refresh": "Aggiorna", + "cancel": "Annulla", + "insert": "Inserisci" + }, + "copy_success": { + "html": "HTML copiato!", + "text": "Testo semplice copiato!", + "base64": "Base64 copiato!" + } } } diff --git a/public/locales/nl/translation.json b/public/locales/nl/translation.json index dda13c6..c5efdcb 100644 --- a/public/locales/nl/translation.json +++ b/public/locales/nl/translation.json @@ -275,5 +275,55 @@ "password_protected": "Met wachtwoord", "ip_restricted": "Beperkt op IP", "average_max_views": "Gemiddelde voor max. aantal weergaven" + }, + "editor": { + "tooltips": { + "bold": "Vet", + "italic": "Cursief", + "strikethrough": "Doorhalen", + "inline_code": "Inline code", + "link": "Link", + "remove_link": "Link verwijderen", + "insert_password": "Wachtwoord invoegen", + "paragraph": "Paragraaf", + "heading1": "Kop 1", + "heading2": "Kop 2", + "heading3": "Kop 3", + "bullet_list": "Opsommingstekens", + "numbered_list": "Genummerde lijst", + "blockquote": "Citaat", + "code_block": "Codeblok", + "undo": "Ongedaan maken", + "redo": "Opnieuw", + "copy_html": "Kopiëren als HTML", + "copy_text": "Kopiëren als platte tekst", + "copy_base64": "Kopiëren als Base64" + }, + "link_modal": { + "title": "Link invoegen", + "url_label": "URL", + "url_placeholder": "https://voorbeeld.nl", + "cancel": "Annuleren", + "insert": "Invoegen", + "update": "Bijwerken" + }, + "password_modal": { + "title": "Wachtwoord invoegen", + "length_label": "Wachtwoordlengte", + "options_label": "Wachtwoordopties", + "include_numbers": "Cijfers opnemen", + "include_symbols": "Symbolen opnemen", + "include_uppercase": "Hoofdletters opnemen", + "include_lowercase": "Kleine letters opnemen", + "generated_password": "Gegenereerd wachtwoord", + "refresh": "Vernieuwen", + "cancel": "Annuleren", + "insert": "Invoegen" + }, + "copy_success": { + "html": "HTML gekopieerd!", + "text": "Platte tekst gekopieerd!", + "base64": "Base64 gekopieerd!" + } } } diff --git a/public/locales/pt/translation.json b/public/locales/pt/translation.json index 3aa8061..63ce09c 100644 --- a/public/locales/pt/translation.json +++ b/public/locales/pt/translation.json @@ -264,5 +264,55 @@ "password_protected": "Protegidos por palavra-passe", "ip_restricted": "Restritos por IP", "average_max_views": "Média de visualizações máximas por segredo" + }, + "editor": { + "tooltips": { + "bold": "Negrito", + "italic": "Itálico", + "strikethrough": "Riscado", + "inline_code": "Código em linha", + "link": "Ligação", + "remove_link": "Remover ligação", + "insert_password": "Inserir palavra-passe", + "paragraph": "Parágrafo", + "heading1": "Título 1", + "heading2": "Título 2", + "heading3": "Título 3", + "bullet_list": "Lista com marcadores", + "numbered_list": "Lista numerada", + "blockquote": "Citação", + "code_block": "Bloco de código", + "undo": "Desfazer", + "redo": "Refazer", + "copy_html": "Copiar como HTML", + "copy_text": "Copiar como texto simples", + "copy_base64": "Copiar como Base64" + }, + "link_modal": { + "title": "Inserir ligação", + "url_label": "URL", + "url_placeholder": "https://exemplo.pt", + "cancel": "Cancelar", + "insert": "Inserir", + "update": "Atualizar" + }, + "password_modal": { + "title": "Inserir palavra-passe", + "length_label": "Comprimento da palavra-passe", + "options_label": "Opções de palavra-passe", + "include_numbers": "Incluir números", + "include_symbols": "Incluir símbolos", + "include_uppercase": "Incluir maiúsculas", + "include_lowercase": "Incluir minúsculas", + "generated_password": "Palavra-passe gerada", + "refresh": "Atualizar", + "cancel": "Cancelar", + "insert": "Inserir" + }, + "copy_success": { + "html": "HTML copiado!", + "text": "Texto simples copiado!", + "base64": "Base64 copiado!" + } } } diff --git a/public/locales/sl/translation.json b/public/locales/sl/translation.json index 70c6dcb..cbd757e 100644 --- a/public/locales/sl/translation.json +++ b/public/locales/sl/translation.json @@ -274,5 +274,55 @@ "password_protected": "Zaščiteno z geslom", "ip_restricted": "Omejeno z IP", "average_max_views": "Povprečno največje število ogledov na skrivnost" + }, + "editor": { + "tooltips": { + "bold": "Krepko", + "italic": "Ležeče", + "strikethrough": "Prečrtano", + "inline_code": "Vrstična koda", + "link": "Povezava", + "remove_link": "Odstrani povezavo", + "insert_password": "Vstavi geslo", + "paragraph": "Odstavek", + "heading1": "Naslov 1", + "heading2": "Naslov 2", + "heading3": "Naslov 3", + "bullet_list": "Seznam z oznakami", + "numbered_list": "Oštevilčen seznam", + "blockquote": "Citat", + "code_block": "Blok kode", + "undo": "Razveljavi", + "redo": "Ponovi", + "copy_html": "Kopiraj kot HTML", + "copy_text": "Kopiraj kot navadno besedilo", + "copy_base64": "Kopiraj kot Base64" + }, + "link_modal": { + "title": "Vstavi povezavo", + "url_label": "URL", + "url_placeholder": "https://primer.si", + "cancel": "Prekliči", + "insert": "Vstavi", + "update": "Posodobi" + }, + "password_modal": { + "title": "Vstavi geslo", + "length_label": "Dolžina gesla", + "options_label": "Možnosti gesla", + "include_numbers": "Vključi številke", + "include_symbols": "Vključi simbole", + "include_uppercase": "Vključi velike črke", + "include_lowercase": "Vključi male črke", + "generated_password": "Generirano geslo", + "refresh": "Osveži", + "cancel": "Prekliči", + "insert": "Vstavi" + }, + "copy_success": { + "html": "HTML kopiran!", + "text": "Navadno besedilo kopirano!", + "base64": "Base64 kopiran!" + } } } diff --git a/public/locales/zh-CN/translation.json b/public/locales/zh-CN/translation.json index 2c845f9..9dfa20a 100644 --- a/public/locales/zh-CN/translation.json +++ b/public/locales/zh-CN/translation.json @@ -273,5 +273,55 @@ "password_protected": "密码保护", "ip_restricted": "IP限制", "average_max_views": "每个秘密的平均最大查看次数" + }, + "editor": { + "tooltips": { + "bold": "粗体", + "italic": "斜体", + "strikethrough": "删除线", + "inline_code": "内联代码", + "link": "链接", + "remove_link": "移除链接", + "insert_password": "插入密码", + "paragraph": "段落", + "heading1": "标题1", + "heading2": "标题2", + "heading3": "标题3", + "bullet_list": "无序列表", + "numbered_list": "有序列表", + "blockquote": "引用", + "code_block": "代码块", + "undo": "撤销", + "redo": "重做", + "copy_html": "复制为HTML", + "copy_text": "复制为纯文本", + "copy_base64": "复制为Base64" + }, + "link_modal": { + "title": "插入链接", + "url_label": "URL", + "url_placeholder": "https://example.com", + "cancel": "取消", + "insert": "插入", + "update": "更新" + }, + "password_modal": { + "title": "插入密码", + "length_label": "密码长度", + "options_label": "密码选项", + "include_numbers": "包含数字", + "include_symbols": "包含符号", + "include_uppercase": "包含大写字母", + "include_lowercase": "包含小写字母", + "generated_password": "生成的密码", + "refresh": "刷新", + "cancel": "取消", + "insert": "插入" + }, + "copy_success": { + "html": "HTML已复制!", + "text": "纯文本已复制!", + "base64": "Base64已复制!" + } } } diff --git a/public/locales/zh-TW/translation.json b/public/locales/zh-TW/translation.json index 28d6968..1149ffd 100644 --- a/public/locales/zh-TW/translation.json +++ b/public/locales/zh-TW/translation.json @@ -192,5 +192,55 @@ "password_protected": "密碼保護", "ip_restricted": "IP 限制", "average_max_views": "每個機密的平均最大瀏覽次數" + }, + "editor": { + "tooltips": { + "bold": "粗體", + "italic": "斜體", + "strikethrough": "刪除線", + "inline_code": "行內程式碼", + "link": "連結", + "remove_link": "移除連結", + "insert_password": "插入密碼", + "paragraph": "段落", + "heading1": "標題1", + "heading2": "標題2", + "heading3": "標題3", + "bullet_list": "項目符號列表", + "numbered_list": "編號列表", + "blockquote": "引用", + "code_block": "程式碼區塊", + "undo": "復原", + "redo": "重做", + "copy_html": "複製為HTML", + "copy_text": "複製為純文字", + "copy_base64": "複製為Base64" + }, + "link_modal": { + "title": "插入連結", + "url_label": "URL", + "url_placeholder": "https://example.com", + "cancel": "取消", + "insert": "插入", + "update": "更新" + }, + "password_modal": { + "title": "插入密碼", + "length_label": "密碼長度", + "options_label": "密碼選項", + "include_numbers": "包含數字", + "include_symbols": "包含符號", + "include_uppercase": "包含大寫字母", + "include_lowercase": "包含小寫字母", + "generated_password": "產生的密碼", + "refresh": "重新整理", + "cancel": "取消", + "insert": "插入" + }, + "copy_success": { + "html": "HTML已複製!", + "text": "純文字已複製!", + "base64": "Base64已複製!" + } } } diff --git a/tailwind.config.js b/tailwind.config.js index 7906b76..1f8f543 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -2,7 +2,7 @@ const colors = require('tailwindcss/colors'); /** @type {import('tailwindcss').Config} */ module.exports = { - content: ['./client/**/*.{js,jsx}', , './client/**/*.html'], + content: ['./client/**/*.{js,jsx}', './client/**/*.html'], darkMode: 'class', theme: { extend: { @@ -67,5 +67,5 @@ module.exports = { }, }, }, - plugins: [require('@tailwindcss/forms')], + plugins: [require('@tailwindcss/forms'), require('@tailwindcss/typography')], };