{"_id":"@elia-ori/ezra","_rev":"8-c11e15cfda0f608c5c8faf6fa368a0ad","name":"@elia-ori/ezra","dist-tags":{"latest":"0.4.0"},"versions":{"0.2.0":{"name":"@elia-ori/ezra","version":"0.2.0","keywords":["react","tiptap","editor","rich-text","wysiwyg"],"author":{"name":"Elia"},"license":"MIT","_id":"@elia-ori/ezra@0.2.0","maintainers":[{"name":"elia-ori","email":"birthtago@gmail.com"}],"homepage":"https://github.com/elia-ori/elia-editor#readme","bugs":{"url":"https://github.com/elia-ori/elia-editor/issues"},"dist":{"shasum":"247a6496f6a204d921b1024e09d057be1b0663e6","tarball":"https://registry.npmjs.org/@elia-ori/ezra/-/ezra-0.2.0.tgz","fileCount":10,"integrity":"sha512-/8gK0HvrF51HbNaILf93IEiolEexIp42jGIMIIe0rOcCsW5I2Ud1eqUYySh6aP3YTohvuEWfFnlp6flXbGJwkQ==","signatures":[{"sig":"MEUCIAQUTr8YA3p/3JZA1OHWpHaTaWp+yyy/v558JIYwwUaeAiEAlPR8GpgAF05nYTBbJpC8bcW+PknkrI/8xnKNaC6OB24=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1766099},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles/editor.css","./styles/editor.css":"./dist/styles/editor.css"},"gitHead":"aeb08c2fbfcb4e57dc5e28362509b8233004b57d","scripts":{"dev":"vite","test":"playwright test","build":"tsup","preview":"vite preview","test:ui":"playwright test --ui","prepublishOnly":"npm run build"},"_npmUser":{"name":"elia-ori","email":"birthtago@gmail.com"},"repository":{"url":"git+https://github.com/elia-ori/ezra.git","type":"git"},"_npmVersion":"11.5.1","description":"Ezra——基於 TipTap 的富文字編輯器套件（敏捷的文士，拉 7:6）","directories":{},"_nodeVersion":"24.7.0","dependencies":{"clsx":"^2.1.1","is-hotkey":"^0.2.0","@tiptap/pm":"^3.18.0","@tiptap/core":"^3.18.0","@tiptap/react":"^3.18.0","tailwind-merge":"^3.4.0","lodash.throttle":"^4.1.1","@floating-ui/react":"^0.27.17","@tiptap/extensions":"^3.18.0","@tiptap/suggestion":"^3.18.0","react-hotkeys-hook":"^5.2.3","@tiptap/starter-kit":"^3.18.0","@radix-ui/react-toggle":"^1.1.0","@tiptap/extension-link":"^3.15.3","@tiptap/extension-list":"^3.18.0","@radix-ui/react-popover":"^1.1.15","@tiptap/extension-color":"^3.18.0","@tiptap/extension-emoji":"^3.18.0","@tiptap/extension-image":"^3.17.1","@tiptap/extension-table":"^3.18.0","react-textarea-autosize":"^8.5.9","@tiptap/extension-mention":"^3.18.0","@tiptap/extension-highlight":"^3.18.0","@tiptap/extension-subscript":"^3.17.1","@tiptap/extension-table-row":"^3.15.3","@tiptap/extension-task-item":"^3.15.3","@tiptap/extension-task-list":"^3.15.3","@tiptap/extension-underline":"^3.15.3","@tiptap/extension-unique-id":"^3.18.0","@tiptap/extension-table-cell":"^3.15.3","@tiptap/extension-text-align":"^3.17.1","@tiptap/extension-text-style":"^3.18.0","@tiptap/extension-typography":"^3.17.1","@radix-ui/react-dropdown-menu":"^2.1.16","@tiptap/extension-placeholder":"^3.15.3","@tiptap/extension-superscript":"^3.17.1","tiptap-extension-resize-image":"^1.3.2","@tiptap/extension-table-header":"^3.15.3","@tiptap/extension-horizontal-rule":"^3.17.1","@tiptap/extension-drag-handle-react":"^3.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.1","react":"^19.2.3","dompurify":"^3.3.1","react-dom":"^19.2.3","typescript":"^5.9.2","@types/node":"^24.3.0","tailwindcss":"^4.1.17","@types/react":"^19.2.4","lucide-react":"^0.556.0","sass-embedded":"^1.97.3","@ariakit/react":"^0.4.21","@playwright/test":"^1.58.0","@tailwindcss/cli":"^4.1.18","@types/dompurify":"^3.0.5","@types/is-hotkey":"^0.1.10","@types/react-dom":"^19.2.3","@tailwindcss/vite":"^4.1.18","@aws-sdk/client-s3":"^3.975.0","esbuild-sass-plugin":"^3.6.0","@vitejs/plugin-react":"^5.1.2","@types/lodash.throttle":"^4.1.9"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/ezra_0.2.0_1783755716867_0.5905979010643736","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@elia-ori/ezra","version":"0.2.1","keywords":["react","tiptap","editor","rich-text","wysiwyg"],"author":{"name":"Elia"},"license":"MIT","_id":"@elia-ori/ezra@0.2.1","maintainers":[{"name":"elia-ori","email":"birthtago@gmail.com"}],"homepage":"https://github.com/elia-ori/elia-editor#readme","bugs":{"url":"https://github.com/elia-ori/elia-editor/issues"},"dist":{"shasum":"bd31ae6a79dcee423e35e70001d308a2f1bca075","tarball":"https://registry.npmjs.org/@elia-ori/ezra/-/ezra-0.2.1.tgz","fileCount":10,"integrity":"sha512-yxXOgY8d3Ok45L0oLByX21P+ji/uFDkcZwBkHHs3nyHHm4RERgNZCfe4/do6YNONOKiKbTUmNfyi6x+G53tYQw==","signatures":[{"sig":"MEYCIQCn4TzzDKD0uIPe8RlEIS1tSj5RKej4SKWciiXZ5OefRAIhAPq35OL4V555M38e8FnNVryT8M4cwzs7fM9CF8on32Ib","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1768019},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles/editor.css","./styles/editor.css":"./dist/styles/editor.css"},"gitHead":"aeb08c2fbfcb4e57dc5e28362509b8233004b57d","scripts":{"dev":"vite","test":"playwright test","build":"tsup","preview":"vite preview","test:ui":"playwright test --ui","prepublishOnly":"npm run build"},"_npmUser":{"name":"elia-ori","email":"birthtago@gmail.com"},"repository":{"url":"git+https://github.com/elia-ori/ezra.git","type":"git"},"_npmVersion":"11.5.1","description":"Ezra——基於 TipTap 的富文字編輯器套件（敏捷的文士，拉 7:6）","directories":{},"_nodeVersion":"24.7.0","dependencies":{"clsx":"^2.1.1","is-hotkey":"^0.2.0","@tiptap/pm":"^3.18.0","@tiptap/core":"^3.18.0","@tiptap/react":"^3.18.0","tailwind-merge":"^3.4.0","lodash.throttle":"^4.1.1","@floating-ui/react":"^0.27.17","@tiptap/extensions":"^3.18.0","@tiptap/suggestion":"^3.18.0","react-hotkeys-hook":"^5.2.3","@tiptap/starter-kit":"^3.18.0","@radix-ui/react-toggle":"^1.1.0","@tiptap/extension-link":"^3.15.3","@tiptap/extension-list":"^3.18.0","@radix-ui/react-popover":"^1.1.15","@tiptap/extension-color":"^3.18.0","@tiptap/extension-emoji":"^3.18.0","@tiptap/extension-image":"^3.17.1","@tiptap/extension-table":"^3.18.0","react-textarea-autosize":"^8.5.9","@tiptap/extension-mention":"^3.18.0","@tiptap/extension-youtube":"^3.27.3","@tiptap/extension-highlight":"^3.18.0","@tiptap/extension-subscript":"^3.17.1","@tiptap/extension-table-row":"^3.15.3","@tiptap/extension-task-item":"^3.15.3","@tiptap/extension-task-list":"^3.15.3","@tiptap/extension-underline":"^3.15.3","@tiptap/extension-unique-id":"^3.18.0","@tiptap/extension-table-cell":"^3.15.3","@tiptap/extension-text-align":"^3.17.1","@tiptap/extension-text-style":"^3.18.0","@tiptap/extension-typography":"^3.17.1","@radix-ui/react-dropdown-menu":"^2.1.16","@tiptap/extension-placeholder":"^3.15.3","@tiptap/extension-superscript":"^3.17.1","tiptap-extension-resize-image":"^1.3.2","@tiptap/extension-table-header":"^3.15.3","@tiptap/extension-horizontal-rule":"^3.17.1","@tiptap/extension-drag-handle-react":"^3.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.1","react":"^19.2.3","dompurify":"^3.3.1","react-dom":"^19.2.3","typescript":"^5.9.2","@types/node":"^24.3.0","tailwindcss":"^4.1.17","@types/react":"^19.2.4","lucide-react":"^0.556.0","sass-embedded":"^1.97.3","@ariakit/react":"^0.4.21","@playwright/test":"^1.58.0","@tailwindcss/cli":"^4.1.18","@types/dompurify":"^3.0.5","@types/is-hotkey":"^0.1.10","@types/react-dom":"^19.2.3","@tailwindcss/vite":"^4.1.18","@aws-sdk/client-s3":"^3.975.0","esbuild-sass-plugin":"^3.6.0","@vitejs/plugin-react":"^5.1.2","@types/lodash.throttle":"^4.1.9"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/ezra_0.2.1_1783762023644_0.14689814116606748","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@elia-ori/ezra","version":"0.2.2","keywords":["react","tiptap","editor","rich-text","wysiwyg"],"author":{"name":"Elia"},"license":"MIT","_id":"@elia-ori/ezra@0.2.2","maintainers":[{"name":"elia-ori","email":"birthtago@gmail.com"}],"homepage":"https://github.com/elia-ori/elia-editor#readme","bugs":{"url":"https://github.com/elia-ori/elia-editor/issues"},"dist":{"shasum":"62cd7caca337533223c2bee483eec7fe05472ecd","tarball":"https://registry.npmjs.org/@elia-ori/ezra/-/ezra-0.2.2.tgz","fileCount":10,"integrity":"sha512-RvM+n6EaVIur7UMUYdXIMJVlrFS5Tqo258fJ+TLISRgSMT2BlCxk2vYT+BwFK7mGVaJQJn1/ZHQQpV4VnMVduA==","signatures":[{"sig":"MEYCIQC2ri1iqg+6ECFn3p/a894qzPYlpySEnGpQWbvrwNrb0wIhAKNeu+osTZpzbxIL1zRMjH1GqDO7wH8COK3xlQjNIxHC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1771337},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles/editor.css","./styles/editor.css":"./dist/styles/editor.css"},"gitHead":"aeb08c2fbfcb4e57dc5e28362509b8233004b57d","scripts":{"dev":"vite","test":"playwright test","build":"tsup","preview":"vite preview","test:ui":"playwright test --ui","prepublishOnly":"npm run build"},"_npmUser":{"name":"elia-ori","email":"birthtago@gmail.com"},"repository":{"url":"git+https://github.com/elia-ori/ezra.git","type":"git"},"_npmVersion":"11.5.1","description":"Ezra——基於 TipTap 的富文字編輯器套件（敏捷的文士，拉 7:6）","directories":{},"_nodeVersion":"24.7.0","dependencies":{"clsx":"^2.1.1","is-hotkey":"^0.2.0","@tiptap/pm":"^3.18.0","@tiptap/core":"^3.18.0","@tiptap/react":"^3.18.0","tailwind-merge":"^3.4.0","lodash.throttle":"^4.1.1","@floating-ui/react":"^0.27.17","@tiptap/extensions":"^3.18.0","@tiptap/suggestion":"^3.18.0","react-hotkeys-hook":"^5.2.3","@tiptap/starter-kit":"^3.18.0","@radix-ui/react-toggle":"^1.1.0","@tiptap/extension-link":"^3.15.3","@tiptap/extension-list":"^3.18.0","@radix-ui/react-popover":"^1.1.15","@tiptap/extension-color":"^3.18.0","@tiptap/extension-emoji":"^3.18.0","@tiptap/extension-image":"^3.17.1","@tiptap/extension-table":"^3.18.0","react-textarea-autosize":"^8.5.9","@tiptap/extension-mention":"^3.18.0","@tiptap/extension-youtube":"^3.27.3","@tiptap/extension-highlight":"^3.18.0","@tiptap/extension-subscript":"^3.17.1","@tiptap/extension-table-row":"^3.15.3","@tiptap/extension-task-item":"^3.15.3","@tiptap/extension-task-list":"^3.15.3","@tiptap/extension-underline":"^3.15.3","@tiptap/extension-unique-id":"^3.18.0","@tiptap/extension-table-cell":"^3.15.3","@tiptap/extension-text-align":"^3.17.1","@tiptap/extension-text-style":"^3.18.0","@tiptap/extension-typography":"^3.17.1","@radix-ui/react-dropdown-menu":"^2.1.16","@tiptap/extension-placeholder":"^3.15.3","@tiptap/extension-superscript":"^3.17.1","tiptap-extension-resize-image":"^1.3.2","@tiptap/extension-table-header":"^3.15.3","@tiptap/extension-horizontal-rule":"^3.17.1","@tiptap/extension-drag-handle-react":"^3.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.1","react":"^19.2.3","dompurify":"^3.3.1","react-dom":"^19.2.3","typescript":"^5.9.2","@types/node":"^24.3.0","tailwindcss":"^4.1.17","@types/react":"^19.2.4","lucide-react":"^0.556.0","sass-embedded":"^1.97.3","@ariakit/react":"^0.4.21","@playwright/test":"^1.58.0","@tailwindcss/cli":"^4.1.18","@types/dompurify":"^3.0.5","@types/is-hotkey":"^0.1.10","@types/react-dom":"^19.2.3","@tailwindcss/vite":"^4.1.18","@aws-sdk/client-s3":"^3.975.0","esbuild-sass-plugin":"^3.6.0","@vitejs/plugin-react":"^5.1.2","@types/lodash.throttle":"^4.1.9"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/ezra_0.2.2_1785488486477_0.2800080241427547","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@elia-ori/ezra","version":"0.2.3","keywords":["react","tiptap","editor","rich-text","wysiwyg"],"author":{"name":"Elia"},"license":"MIT","_id":"@elia-ori/ezra@0.2.3","maintainers":[{"name":"elia-ori","email":"birthtago@gmail.com"}],"homepage":"https://github.com/elia-ori/elia-editor#readme","bugs":{"url":"https://github.com/elia-ori/elia-editor/issues"},"dist":{"shasum":"cc1a1be50791452c698e3672d209f3c0fabcf30d","tarball":"https://registry.npmjs.org/@elia-ori/ezra/-/ezra-0.2.3.tgz","fileCount":10,"integrity":"sha512-l0nFopnxEJVFzhlCO+/63cndKYUTEMSHGtfGX229F1mNiBBQDCFBzRwBFWDfcimTSeXi6Xy1Wc76om6zqhNl1A==","signatures":[{"sig":"MEQCIBzEM8QGHf8omjzNE39hmtW1T50h4+IMBKPfg67kXMhbAiARShtoSJ1pwJUVrUy1T7xgWgosT0PXc/P8X0YfaBZzAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1775638},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles/editor.css","./styles/editor.css":"./dist/styles/editor.css"},"gitHead":"aeb08c2fbfcb4e57dc5e28362509b8233004b57d","scripts":{"dev":"vite","test":"playwright test","build":"tsup","preview":"vite preview","test:ui":"playwright test --ui","prepublishOnly":"npm run build"},"_npmUser":{"name":"elia-ori","email":"birthtago@gmail.com"},"repository":{"url":"git+https://github.com/elia-ori/ezra.git","type":"git"},"_npmVersion":"11.5.1","description":"Ezra——基於 TipTap 的富文字編輯器套件（敏捷的文士，拉 7:6）","directories":{},"_nodeVersion":"24.7.0","dependencies":{"clsx":"^2.1.1","is-hotkey":"^0.2.0","@tiptap/pm":"^3.18.0","@tiptap/core":"^3.18.0","@tiptap/react":"^3.18.0","tailwind-merge":"^3.4.0","lodash.throttle":"^4.1.1","@floating-ui/react":"^0.27.17","@tiptap/extensions":"^3.18.0","@tiptap/suggestion":"^3.18.0","react-hotkeys-hook":"^5.2.3","@tiptap/starter-kit":"^3.18.0","@radix-ui/react-toggle":"^1.1.0","@tiptap/extension-link":"^3.15.3","@tiptap/extension-list":"^3.18.0","@radix-ui/react-popover":"^1.1.15","@tiptap/extension-color":"^3.18.0","@tiptap/extension-emoji":"^3.18.0","@tiptap/extension-image":"^3.17.1","@tiptap/extension-table":"^3.18.0","react-textarea-autosize":"^8.5.9","@tiptap/extension-mention":"^3.18.0","@tiptap/extension-youtube":"^3.27.3","@tiptap/extension-highlight":"^3.18.0","@tiptap/extension-subscript":"^3.17.1","@tiptap/extension-table-row":"^3.15.3","@tiptap/extension-task-item":"^3.15.3","@tiptap/extension-task-list":"^3.15.3","@tiptap/extension-underline":"^3.15.3","@tiptap/extension-unique-id":"^3.18.0","@tiptap/extension-table-cell":"^3.15.3","@tiptap/extension-text-align":"^3.17.1","@tiptap/extension-text-style":"^3.18.0","@tiptap/extension-typography":"^3.17.1","@radix-ui/react-dropdown-menu":"^2.1.16","@tiptap/extension-placeholder":"^3.15.3","@tiptap/extension-superscript":"^3.17.1","tiptap-extension-resize-image":"^1.3.2","@tiptap/extension-table-header":"^3.15.3","@tiptap/extension-horizontal-rule":"^3.17.1","@tiptap/extension-drag-handle-react":"^3.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.1","react":"^19.2.3","dompurify":"^3.3.1","react-dom":"^19.2.3","typescript":"^5.9.2","@types/node":"^24.3.0","tailwindcss":"^4.1.17","@types/react":"^19.2.4","lucide-react":"^0.556.0","sass-embedded":"^1.97.3","@ariakit/react":"^0.4.21","@playwright/test":"^1.58.0","@tailwindcss/cli":"^4.1.18","@types/dompurify":"^3.0.5","@types/is-hotkey":"^0.1.10","@types/react-dom":"^19.2.3","@tailwindcss/vite":"^4.1.18","@aws-sdk/client-s3":"^3.975.0","esbuild-sass-plugin":"^3.6.0","@vitejs/plugin-react":"^5.1.2","@types/lodash.throttle":"^4.1.9"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/ezra_0.2.3_1785503400275_0.06750108401612409","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@elia-ori/ezra","version":"0.2.4","keywords":["react","tiptap","editor","rich-text","wysiwyg"],"author":{"name":"Elia"},"license":"MIT","_id":"@elia-ori/ezra@0.2.4","maintainers":[{"name":"elia-ori","email":"birthtago@gmail.com"}],"homepage":"https://github.com/elia-ori/elia-editor#readme","bugs":{"url":"https://github.com/elia-ori/elia-editor/issues"},"dist":{"shasum":"efd1d49b3a4aa25402d35b69b06fd5c5f2ca36fa","tarball":"https://registry.npmjs.org/@elia-ori/ezra/-/ezra-0.2.4.tgz","fileCount":10,"integrity":"sha512-vYr5ra66byz5eV8xum7CGID3zFAS7ogIIBX0do+9uo6bQuKfdc5E8t7hDMurAT85HIqoCgTqDbWjlIfIrtv1gQ==","signatures":[{"sig":"MEUCIQCgBT0dJKBggDTxJnBHINbIknZEaz0jVgiMBoPb7OnzVQIgCD82gCPuji1E6s2kvGwPmpEckk95UcpPI5ZNl1a0ohw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1766215},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles/editor.css","./styles/editor.css":"./dist/styles/editor.css"},"gitHead":"7a1966a7cffad4943be7347adfeb4114c7476d2d","scripts":{"dev":"vite","test":"playwright test","build":"tsup","preview":"vite preview","test:ui":"playwright test --ui","prepublishOnly":"npm run build"},"_npmUser":{"name":"elia-ori","email":"birthtago@gmail.com"},"repository":{"url":"git+https://github.com/elia-ori/ezra.git","type":"git"},"_npmVersion":"11.5.1","description":"Ezra——基於 TipTap 的富文字編輯器套件（敏捷的文士，拉 7:6）","directories":{},"_nodeVersion":"24.7.0","dependencies":{"clsx":"^2.1.1","is-hotkey":"^0.2.0","@tiptap/pm":"^3.18.0","@tiptap/core":"^3.18.0","@tiptap/react":"^3.18.0","tailwind-merge":"^3.4.0","lodash.throttle":"^4.1.1","@floating-ui/react":"^0.27.17","@tiptap/extensions":"^3.18.0","@tiptap/suggestion":"^3.18.0","react-hotkeys-hook":"^5.2.3","@tiptap/starter-kit":"^3.18.0","@radix-ui/react-toggle":"^1.1.0","@tiptap/extension-link":"^3.15.3","@tiptap/extension-list":"^3.18.0","@radix-ui/react-popover":"^1.1.15","@tiptap/extension-color":"^3.18.0","@tiptap/extension-emoji":"^3.18.0","@tiptap/extension-image":"^3.17.1","@tiptap/extension-table":"^3.18.0","react-textarea-autosize":"^8.5.9","@tiptap/extension-mention":"^3.18.0","@tiptap/extension-youtube":"^3.27.3","@tiptap/extension-highlight":"^3.18.0","@tiptap/extension-subscript":"^3.17.1","@tiptap/extension-table-row":"^3.15.3","@tiptap/extension-task-item":"^3.15.3","@tiptap/extension-task-list":"^3.15.3","@tiptap/extension-underline":"^3.15.3","@tiptap/extension-unique-id":"^3.18.0","@tiptap/extension-table-cell":"^3.15.3","@tiptap/extension-text-align":"^3.17.1","@tiptap/extension-text-style":"^3.18.0","@tiptap/extension-typography":"^3.17.1","@radix-ui/react-dropdown-menu":"^2.1.16","@tiptap/extension-placeholder":"^3.15.3","@tiptap/extension-superscript":"^3.17.1","tiptap-extension-resize-image":"^1.3.2","@tiptap/extension-table-header":"^3.15.3","@tiptap/extension-horizontal-rule":"^3.17.1","@tiptap/extension-drag-handle-react":"^3.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.1","react":"^19.2.3","dompurify":"^3.3.1","react-dom":"^19.2.3","typescript":"^5.9.2","@types/node":"^24.3.0","tailwindcss":"^4.1.17","@types/react":"^19.2.4","lucide-react":"^0.556.0","sass-embedded":"^1.97.3","@ariakit/react":"^0.4.21","@playwright/test":"^1.58.0","@tailwindcss/cli":"^4.1.18","@types/dompurify":"^3.0.5","@types/is-hotkey":"^0.1.10","@types/react-dom":"^19.2.3","@tailwindcss/vite":"^4.1.18","@aws-sdk/client-s3":"^3.975.0","esbuild-sass-plugin":"^3.6.0","@vitejs/plugin-react":"^5.1.2","@types/lodash.throttle":"^4.1.9"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/ezra_0.2.4_1785588525433_0.8564989246656616","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@elia-ori/ezra","version":"0.3.0","keywords":["react","tiptap","editor","rich-text","wysiwyg"],"author":{"name":"Elia"},"license":"MIT","_id":"@elia-ori/ezra@0.3.0","maintainers":[{"name":"elia-ori","email":"birthtago@gmail.com"}],"homepage":"https://github.com/elia-ori/elia-editor#readme","bugs":{"url":"https://github.com/elia-ori/elia-editor/issues"},"dist":{"shasum":"caa672b848e134869d642879cace987dabe7395c","tarball":"https://registry.npmjs.org/@elia-ori/ezra/-/ezra-0.3.0.tgz","fileCount":10,"integrity":"sha512-PWNGDMPT6f8mrA9qoK3U+34E/TSixwkihqM7SqSXwhzw/P8itYaHoXXE7cBt/27bP6nfYHuQsWS0iiqsAFxlMg==","signatures":[{"sig":"MEUCIQCl7XzjXdM9PevWqiJfpcrQlRLcp4Xxt+vWU21gYd2mmQIgAzwM9ipJ3YpxG+47X1gQSe9gLgQnfSOr/lCPTidL7kg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1805858},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles/editor.css","./styles/editor.css":"./dist/styles/editor.css"},"gitHead":"b9e4f3feca8b7b62aaf25e11c2d85bc5d2cac2da","scripts":{"dev":"vite","test":"playwright test","build":"tsup","preview":"vite preview","test:ui":"playwright test --ui","prepublishOnly":"npm run build"},"_npmUser":{"name":"elia-ori","email":"birthtago@gmail.com"},"repository":{"url":"git+https://github.com/elia-ori/ezra.git","type":"git"},"_npmVersion":"11.5.1","description":"Ezra——基於 TipTap 的富文字編輯器套件（敏捷的文士，拉 7:6）","directories":{},"_nodeVersion":"24.7.0","dependencies":{"clsx":"^2.1.1","is-hotkey":"^0.2.0","@tiptap/pm":"^3.18.0","@tiptap/core":"^3.18.0","@tiptap/react":"^3.18.0","tailwind-merge":"^3.4.0","lodash.throttle":"^4.1.1","@floating-ui/react":"^0.27.17","@tiptap/extensions":"^3.18.0","@tiptap/suggestion":"^3.18.0","react-hotkeys-hook":"^5.2.3","@tiptap/starter-kit":"^3.18.0","@radix-ui/react-toggle":"^1.1.0","@tiptap/extension-link":"^3.15.3","@tiptap/extension-list":"^3.18.0","@radix-ui/react-popover":"^1.1.15","@tiptap/extension-color":"^3.18.0","@tiptap/extension-emoji":"^3.18.0","@tiptap/extension-image":"^3.17.1","@tiptap/extension-table":"^3.18.0","react-textarea-autosize":"^8.5.9","@tiptap/extension-mention":"^3.18.0","@tiptap/extension-youtube":"^3.27.3","@tiptap/extension-highlight":"^3.18.0","@tiptap/extension-subscript":"^3.17.1","@tiptap/extension-table-row":"^3.15.3","@tiptap/extension-task-item":"^3.15.3","@tiptap/extension-task-list":"^3.15.3","@tiptap/extension-underline":"^3.15.3","@tiptap/extension-unique-id":"^3.18.0","@tiptap/extension-table-cell":"^3.15.3","@tiptap/extension-text-align":"^3.17.1","@tiptap/extension-text-style":"^3.18.0","@tiptap/extension-typography":"^3.17.1","@radix-ui/react-dropdown-menu":"^2.1.16","@tiptap/extension-placeholder":"^3.15.3","@tiptap/extension-superscript":"^3.17.1","tiptap-extension-resize-image":"^1.3.2","@tiptap/extension-table-header":"^3.15.3","@tiptap/extension-horizontal-rule":"^3.17.1","@tiptap/extension-drag-handle-react":"^3.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.1","react":"^19.2.3","dompurify":"^3.3.1","react-dom":"^19.2.3","typescript":"^5.9.2","@types/node":"^24.3.0","tailwindcss":"^4.1.17","@types/react":"^19.2.4","lucide-react":"^0.556.0","sass-embedded":"^1.97.3","@ariakit/react":"^0.4.21","@playwright/test":"^1.58.0","@tailwindcss/cli":"^4.1.18","@types/dompurify":"^3.0.5","@types/is-hotkey":"^0.1.10","@types/react-dom":"^19.2.3","@tailwindcss/vite":"^4.1.18","@aws-sdk/client-s3":"^3.975.0","esbuild-sass-plugin":"^3.6.0","@vitejs/plugin-react":"^5.1.2","@types/lodash.throttle":"^4.1.9"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/ezra_0.3.0_1787123743175_0.6147280802078905","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@elia-ori/ezra","version":"0.3.1","keywords":["react","tiptap","editor","rich-text","wysiwyg"],"author":{"name":"Elia"},"license":"MIT","_id":"@elia-ori/ezra@0.3.1","maintainers":[{"name":"elia-ori","email":"birthtago@gmail.com"}],"homepage":"https://github.com/elia-ori/elia-editor#readme","bugs":{"url":"https://github.com/elia-ori/elia-editor/issues"},"dist":{"shasum":"707d8e47d1ea9f62f1335cf8264d6cc2a403bd37","tarball":"https://registry.npmjs.org/@elia-ori/ezra/-/ezra-0.3.1.tgz","fileCount":10,"integrity":"sha512-m0kWCcVrJKd0OGPjCYW4rO4XAnEwpax+Un8uHGIKuPI188hwqvB5Mq+8xeUr+XXpd5SAP+1tsXNyzRgKCcmQjA==","signatures":[{"sig":"MEUCIQD03+7BMiJqyLvFCDjFXzJPrXSWbLwXp+8wfeqX11T7uQIgCaz/11UA2ci/Ujl1A6g+11tzQFhLShg44b58rJEk/IU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1806275},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles/editor.css","./styles/editor.css":"./dist/styles/editor.css"},"gitHead":"790adb22ce0bdf82a6d7ab584e6449480f60bcfd","scripts":{"dev":"vite","test":"playwright test","build":"tsup","preview":"vite preview","test:ui":"playwright test --ui","prepublishOnly":"npm run build"},"_npmUser":{"name":"elia-ori","email":"birthtago@gmail.com"},"repository":{"url":"git+https://github.com/elia-ori/ezra.git","type":"git"},"_npmVersion":"11.5.1","description":"Ezra——基於 TipTap 的富文字編輯器套件（敏捷的文士，拉 7:6）","directories":{},"_nodeVersion":"24.7.0","dependencies":{"clsx":"^2.1.1","is-hotkey":"^0.2.0","@tiptap/pm":"^3.18.0","@tiptap/core":"^3.18.0","@tiptap/react":"^3.18.0","tailwind-merge":"^3.4.0","lodash.throttle":"^4.1.1","@floating-ui/react":"^0.27.17","@tiptap/extensions":"^3.18.0","@tiptap/suggestion":"^3.18.0","react-hotkeys-hook":"^5.2.3","@tiptap/starter-kit":"^3.18.0","@radix-ui/react-toggle":"^1.1.0","@tiptap/extension-link":"^3.15.3","@tiptap/extension-list":"^3.18.0","@radix-ui/react-popover":"^1.1.15","@tiptap/extension-color":"^3.18.0","@tiptap/extension-emoji":"^3.18.0","@tiptap/extension-image":"^3.17.1","@tiptap/extension-table":"^3.18.0","react-textarea-autosize":"^8.5.9","@tiptap/extension-mention":"^3.18.0","@tiptap/extension-youtube":"^3.27.3","@tiptap/extension-highlight":"^3.18.0","@tiptap/extension-subscript":"^3.17.1","@tiptap/extension-table-row":"^3.15.3","@tiptap/extension-task-item":"^3.15.3","@tiptap/extension-task-list":"^3.15.3","@tiptap/extension-underline":"^3.15.3","@tiptap/extension-unique-id":"^3.18.0","@tiptap/extension-table-cell":"^3.15.3","@tiptap/extension-text-align":"^3.17.1","@tiptap/extension-text-style":"^3.18.0","@tiptap/extension-typography":"^3.17.1","@radix-ui/react-dropdown-menu":"^2.1.16","@tiptap/extension-placeholder":"^3.15.3","@tiptap/extension-superscript":"^3.17.1","tiptap-extension-resize-image":"^1.3.2","@tiptap/extension-table-header":"^3.15.3","@tiptap/extension-horizontal-rule":"^3.17.1","@tiptap/extension-drag-handle-react":"^3.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.1","react":"^19.2.3","dompurify":"^3.3.1","react-dom":"^19.2.3","typescript":"^5.9.2","@types/node":"^24.3.0","tailwindcss":"^4.1.17","@types/react":"^19.2.4","lucide-react":"^0.556.0","sass-embedded":"^1.97.3","@ariakit/react":"^0.4.21","@playwright/test":"^1.58.0","@tailwindcss/cli":"^4.1.18","@types/dompurify":"^3.0.5","@types/is-hotkey":"^0.1.10","@types/react-dom":"^19.2.3","@tailwindcss/vite":"^4.1.18","@aws-sdk/client-s3":"^3.975.0","esbuild-sass-plugin":"^3.6.0","@vitejs/plugin-react":"^5.1.2","@types/lodash.throttle":"^4.1.9"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/ezra_0.3.1_1787208197937_0.9359658521498568","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"_id":"@elia-ori/ezra@0.4.0","bugs":{"url":"https://github.com/elia-ori/elia-editor/issues"},"dist":{"shasum":"018fbb0c616ae738a7177563633ccd570d14ec01","tarball":"https://registry.npmjs.org/@elia-ori/ezra/-/ezra-0.4.0.tgz","fileCount":10,"integrity":"sha512-H08sS0CikQ6Oi33V7qkOQV0pQv8jNVPcW4gd6EfVT38Z6wfuBUkRgkzESNqft6iPLoMBxSz2IYsk4yVR3ejnbQ==","signatures":[{"sig":"MEYCIQCnIokXXnRLpf4SAsxih3vS8Rk46i2q9EYmRePGUpjvxAIhANZOub1MceMDHCD+DmZ15xejx/8ooHfzWsK7Wrsnp+SI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCR7GuIwRHNvDf4VmviAB0daBfGKpRTuQi242ZoAVLw7wIgQ0SS/rqm8MZgbYu583iiIx1dYMTqRDsEOu/zo9TUB/Q="}],"unpackedSize":1878490},"main":"./dist/index.cjs","name":"@elia-ori/ezra","type":"module","types":"./dist/index.d.ts","author":{"name":"Elia"},"module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles/editor.css","./styles/editor.css":"./dist/styles/editor.css"},"gitHead":"139aaf3eddd60e39fc24ac730f789beac4923dbc","license":"MIT","scripts":{"dev":"vite","test":"playwright test","build":"tsup","preview":"vite preview","test:ui":"playwright test --ui","prepublishOnly":"npm run build"},"version":"0.4.0","_npmUser":{"name":"elia-ori","email":"birthtago@gmail.com"},"homepage":"https://github.com/elia-ori/elia-editor#readme","keywords":["react","tiptap","editor","rich-text","wysiwyg"],"repository":{"url":"git+https://github.com/elia-ori/ezra.git","type":"git"},"_npmVersion":"11.5.1","description":"Ezra——基於 TipTap 的富文字編輯器套件（敏捷的文士，拉 7:6）","directories":{},"maintainers":[{"name":"elia-ori","email":"birthtago@gmail.com"}],"_nodeVersion":"24.7.0","dependencies":{"clsx":"^2.1.1","is-hotkey":"^0.2.0","@tiptap/pm":"^3.18.0","@tiptap/core":"^3.18.0","@tiptap/react":"^3.18.0","tailwind-merge":"^3.4.0","lodash.throttle":"^4.1.1","@floating-ui/react":"^0.27.17","@tiptap/extensions":"^3.18.0","@tiptap/suggestion":"^3.18.0","react-hotkeys-hook":"^5.2.3","@tiptap/starter-kit":"^3.18.0","@radix-ui/react-toggle":"^1.1.0","@tiptap/extension-link":"^3.15.3","@tiptap/extension-list":"^3.18.0","@radix-ui/react-popover":"^1.1.15","@tiptap/extension-color":"^3.18.0","@tiptap/extension-emoji":"^3.18.0","@tiptap/extension-image":"^3.17.1","@tiptap/extension-table":"^3.18.0","react-textarea-autosize":"^8.5.9","@tiptap/extension-mention":"^3.18.0","@tiptap/extension-youtube":"^3.27.3","@tiptap/extension-highlight":"^3.18.0","@tiptap/extension-subscript":"^3.17.1","@tiptap/extension-table-row":"^3.15.3","@tiptap/extension-task-item":"^3.15.3","@tiptap/extension-task-list":"^3.15.3","@tiptap/extension-underline":"^3.15.3","@tiptap/extension-unique-id":"^3.18.0","@tiptap/extension-table-cell":"^3.15.3","@tiptap/extension-text-align":"^3.17.1","@tiptap/extension-text-style":"^3.18.0","@tiptap/extension-typography":"^3.17.1","@radix-ui/react-dropdown-menu":"^2.1.16","@tiptap/extension-placeholder":"^3.15.3","@tiptap/extension-superscript":"^3.17.1","tiptap-extension-resize-image":"^1.3.2","@tiptap/extension-table-header":"^3.15.3","@tiptap/extension-horizontal-rule":"^3.17.1","@tiptap/extension-drag-handle-react":"^3.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.1","react":"^19.2.3","dompurify":"^3.3.1","react-dom":"^19.2.3","typescript":"^5.9.2","@types/node":"^24.3.0","tailwindcss":"^4.1.17","@types/react":"^19.2.4","lucide-react":"^0.556.0","sass-embedded":"^1.97.3","@ariakit/react":"^0.4.21","@playwright/test":"^1.58.0","@tailwindcss/cli":"^4.1.18","@types/dompurify":"^3.0.5","@types/is-hotkey":"^0.1.10","@types/react-dom":"^19.2.3","@tailwindcss/vite":"^4.1.18","@aws-sdk/client-s3":"^3.975.0","esbuild-sass-plugin":"^3.6.0","@vitejs/plugin-react":"^5.1.2","@types/lodash.throttle":"^4.1.9"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ezra_0.4.0_1789799296529_0.16104345500151074"}}},"time":{"created":"2026-07-11T07:41:56.652Z","modified":"2026-09-19T06:28:16.773Z","0.2.0":"2026-07-11T07:41:57.046Z","0.2.1":"2026-07-11T09:27:03.814Z","0.2.2":"2026-07-31T09:01:26.628Z","0.2.3":"2026-07-31T13:10:00.424Z","0.2.4":"2026-08-01T12:48:45.600Z","0.3.0":"2026-08-19T07:15:43.413Z","0.3.1":"2026-08-20T06:43:18.088Z","0.4.0":"2026-09-19T06:28:16.619Z"},"bugs":{"url":"https://github.com/elia-ori/elia-editor/issues"},"author":{"name":"Elia"},"license":"MIT","homepage":"https://github.com/elia-ori/elia-editor#readme","keywords":["react","tiptap","editor","rich-text","wysiwyg"],"repository":{"url":"git+https://github.com/elia-ori/ezra.git","type":"git"},"description":"Ezra——基於 TipTap 的富文字編輯器套件（敏捷的文士，拉 7:6）","maintainers":[{"name":"elia-ori","email":"birthtago@gmail.com"}],"readme":"# @elia-ori/ezra\n\n基於 TipTap 的富文字編輯器。\n\n## 安裝\n\n```bash\nnpm install @elia-ori/ezra\n```\n\n## 使用方式\n\n```tsx\nimport { EliaEditor } from '@elia-ori/ezra';\nimport '@elia-ori/ezra/styles.css';\n\nfunction MyEditor() {\n  const [content, setContent] = useState('');\n\n  // 必須提供圖片上傳函數\n  const handleImageUpload = async (\n    file: File,\n    onProgress?: (event: { progress: number }) => void\n  ): Promise<string> => {\n    // 實作你的上傳邏輯，回傳圖片 URL\n    const formData = new FormData();\n    formData.append('file', file);\n\n    const response = await fetch('/api/upload', {\n      method: 'POST',\n      body: formData,\n    });\n\n    const { url } = await response.json();\n    return url;\n  };\n\n  return (\n    <EliaEditor\n      content={content}\n      onChange={setContent}\n      onImageUpload={handleImageUpload}\n    />\n  );\n}\n```\n\n### 儲存格式\n\n編輯器支援 HTML 和 JSON 兩種格式：\n\n```tsx\n// 儲存為 JSON 格式（推薦）\n<EliaEditor\n  content={content}\n  onChange={(html, json) => {\n    setContent(json)  // 儲存 JSON，支援多平台渲染\n  }}\n/>\n\n// 儲存為 HTML 格式（向後相容）\n<EliaEditor\n  content={content}\n  onChange={(html) => {\n    setContent(html)  // 只用第一個參數\n  }}\n/>\n```\n\n## Props\n\n| Prop | 類型 | 預設值 | 說明 |\n|------|------|--------|------|\n| `content` | `string` | `''` | HTML 內容 |\n| `onChange` | `(html: string, json: JSONContent) => void` | - | 內容變更時的回調，同時提供 HTML 和 JSON 格式 |\n| `placeholder` | `string` | `'開始寫作...'` | 佔位文字 |\n| `toolbar` | `ToolbarItem[]` | 全部 | 工具列項目 |\n| `onImageUpload` | `UploadFunction` | - | **必要** - 圖片上傳函數 |\n| `embedded` | `boolean` | `false` | 嵌入模式（高度由父容器決定） |\n| `card` | `boolean` | `false` | 卡片樣式（邊框 + 圓角 + 陰影） |\n| `className` | `string` | - | 外層 class |\n| `editorClassName` | `string` | - | 編輯器 class |\n| `autofocus` | `boolean` | `false` | 自動聚焦 |\n| `readOnly` | `boolean` | `false` | 唯讀模式 |\n\n## Toolbar 選項\n\n```ts\ntype ToolbarItem =\n  | 'undo-redo'    // 復原/重做\n  | 'text'         // 內文\n  | 'heading'      // 標題 (H1-H4)\n  | 'list'         // 列表\n  | 'blockquote'   // 引用區塊\n  | 'code-block'   // 程式碼區塊\n  | 'table'        // 表格\n  | 'format'       // 格式 (粗體、斜體、刪除線、code、底線)\n  | 'text-color'   // 文字顏色\n  | 'highlight'    // 螢光標記\n  | 'link'         // 連結\n  | 'superscript'  // 上標\n  | 'subscript'    // 下標\n  | 'align'        // 文字對齊\n  | 'image';       // 圖片上傳\n```\n\n## 圖片上傳\n\n`onImageUpload` 是必要的 prop。編輯器不提供預設的上傳實作，你需要根據你的後端 API 自行實作。\n\n### 函數簽名\n\n```ts\ntype UploadFunction = (\n  file: File,\n  onProgress?: (event: { progress: number }) => void,\n  abortSignal?: AbortSignal\n) => Promise<string>;\n```\n\n### 範例：上傳到 Cloudflare R2 (使用 Presigned URL)\n\n```tsx\nconst handleImageUpload = async (file, onProgress) => {\n  // 1. 取得 presigned URL\n  const { upload_url, file_url } = await getPresignedUrl(file.name, file.type);\n\n  // 2. 上傳到 R2（使用 XMLHttpRequest 以支援進度追蹤）\n  await new Promise((resolve, reject) => {\n    const xhr = new XMLHttpRequest();\n    xhr.open('PUT', upload_url);\n    xhr.setRequestHeader('Content-Type', file.type);\n\n    xhr.upload.onprogress = (e) => {\n      if (e.lengthComputable) {\n        onProgress?.({ progress: Math.round((e.loaded / e.total) * 100) });\n      }\n    };\n\n    xhr.onload = () => (xhr.status >= 200 && xhr.status < 300 ? resolve() : reject(new Error('上傳失敗')));\n    xhr.onerror = () => reject(new Error('上傳失敗'));\n    xhr.send(file);\n  });\n\n  // 3. 回傳公開 URL\n  return file_url;\n};\n```\n\n> **注意**：`fetch` API 不支援上傳進度追蹤，需使用 `XMLHttpRequest`。\n\n## 嵌入模式\n\n預設編輯器會佔滿整個視窗高度。如果要嵌入到現有頁面，使用 `embedded` prop：\n\n```tsx\n<EliaEditor\n  embedded\n  card\n  className=\"min-h-96\"\n  // ...\n/>\n```\n\n## 內容字型\n\n內容區（不含工具列）預設 `\"Noto Sans TC\", sans-serif`，可由宿主以 CSS 變數覆蓋，讓編輯畫面對齊輸出端的字型。字型檔由宿主自行載入，套件不內建：\n\n```css\n.my-editor-page {\n  --editor-content-font-family: 'GenYoMin TW', serif;\n}\n```\n\n## TocSidebar (目錄側邊欄)\n\n若需要顯示文章目錄，使用 `EliaEditorProvider` 包裹並加入 `TocSidebar`：\n\n```tsx\nimport { EliaEditorProvider, EliaEditor, TocSidebar } from '@elia-ori/ezra'\nimport '@elia-ori/ezra/styles.css'\n\nfunction MyPage() {\n  return (\n    <EliaEditorProvider>\n      <div style={{ display: 'flex', gap: '1rem' }}>\n        <TocSidebar />\n        <EliaEditor onChange={handleChange} />\n      </div>\n    </EliaEditorProvider>\n  )\n}\n```\n\n### TocSidebar Props\n\n| Prop | Type | Description |\n|------|------|-------------|\n| className | string | 自訂樣式類別 |\n\n### 自訂樣式\n\nTocSidebar 使用 CSS 變數，可透過覆蓋來自訂樣式：\n\n```css\n.my-toc {\n  --toc-title-color: #1f2937;\n  --toc-link-color: #6b7280;\n  --toc-hover-color: #374151;\n  --toc-hover-bg: #f3f4f6;\n  --toc-active-color: #2563eb;\n}\n```\n\n## 發佈\n\n```bash\nnpm version patch   # 或 minor / major，自動改版號＋建 git tag\nnpm publish         # prepublishOnly 會自動先 build，不會發到舊 dist\n```\n\n前提：`npm login`（帳號 elia-ori，登入一次即可）。發完在各消費端（chubian-center、chubian-liff、liako-center）跑 `npm update @elia-ori/ezra`。\n","readmeFilename":"README.md"}