{"_id":"@ampnet/wink-wysiwyg","_rev":"6-e63888265bcfdbfdc5b728cc681638a5","name":"@ampnet/wink-wysiwyg","dist-tags":{"latest":"0.2.5"},"versions":{"0.2.0":{"name":"@ampnet/wink-wysiwyg","version":"0.2.0","keywords":["wysiwyg","editor","react","typescript","tiptap","prosemirror","mentions","hashtags","tailwindcss"],"author":{"url":"media","name":"ampnet","email":"https://ampnet.media"},"license":"MIT","_id":"@ampnet/wink-wysiwyg@0.2.0","maintainers":[{"name":"ampnetmedia","email":"adamaoc@gmail.com"}],"homepage":"https://github.com/ampnet-media/wink-wysiwyg#readme","bugs":{"url":"https://github.com/ampnet-media/wink-wysiwyg/issues"},"dist":{"shasum":"cfd7e228c0e29fb1eab93ef7d4a62b36a50ba956","tarball":"https://registry.npmjs.org/@ampnet/wink-wysiwyg/-/wink-wysiwyg-0.2.0.tgz","fileCount":43,"integrity":"sha512-rNPgRuZwRWIbD3zo7VGrLGaZCzDvc5xmqPT+02c+b1qjpTGvULEy221Gyl8mNK6+NIUNkkoqzj3sTQOgaihqxQ==","signatures":[{"sig":"MEQCIETZwTqrW5DHo5ttaTbJgtk5C1LnQRXh9fJhDGdcbKFKAiBPV84zfnK4QZXgiEZMQOOx6J3qAAkpKCtk2G+aGRYQVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2858405},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.esm.js","gitHead":"53d18661697cd2e60e7fe977a9fa3b18d9af76e9","scripts":{"dev":"rollup -c rollup.config.mjs -w","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"rollup -c rollup.config.mjs","prepare":"npm run build","test:ui":"vitest --ui","lint:fix":"eslint src --ext .ts,.tsx --fix","type-check":"tsc --noEmit","release:major":"npm run version:major && npm run build && git push --follow-tags","release:minor":"npm run version:minor && npm run build && git push --follow-tags","release:patch":"npm run version:patch && npm run build && git push --follow-tags","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","version:prerelease":"npm version prerelease"},"_npmUser":{"name":"ampnetmedia","email":"adamaoc@gmail.com"},"repository":{"url":"git+https://github.com/ampnet-media/wink-wysiwyg.git","type":"git"},"_npmVersion":"11.5.2","description":"A modern, extensible WYSIWYG editor for React applications with @mentions and #hashtags support","directories":{},"_nodeVersion":"23.10.0","dependencies":{"@tiptap/pm":"^3.4.1","lucide-react":"^0.542.0","@tiptap/react":"^3.4.1","@tiptap/starter-kit":"^3.4.1","isomorphic-dompurify":"^2.26.0","@tiptap/extension-link":"^3.4.1","@tiptap/extension-color":"^3.4.1","@tiptap/extension-image":"^3.4.1","@tiptap/extension-mention":"^3.4.1","@tiptap/extension-highlight":"^3.4.1","@tiptap/extension-underline":"^3.4.1","@tiptap/extension-text-align":"^3.4.1","@tiptap/extension-text-style":"^3.4.1","@tiptap/extension-placeholder":"^3.4.1"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","jsdom":"^26.1.0","tslib":"^2.8.1","eslint":"^9.35.0","rollup":"^4.50.1","vitest":"^3.2.4","postcss":"^8.5.6","prettier":"^3.6.2","typescript":"^5.9.2","@types/node":"^24.3.1","lint-staged":"^16.1.6","tailwindcss":"^4.1.13","@types/react":"^19.1.12","autoprefixer":"^10.4.21","@types/react-dom":"^19.1.9","eslint-plugin-react":"^7.37.5","@tailwindcss/postcss":"^4.1.13","@vitejs/plugin-react":"^5.0.2","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-replace":"^6.0.2","@rollup/plugin-commonjs":"^28.0.6","@rollup/plugin-typescript":"^12.1.4","@typescript-eslint/parser":"^8.42.0","eslint-plugin-react-hooks":"^5.2.0","@rollup/plugin-node-resolve":"^16.0.1","@typescript-eslint/eslint-plugin":"^8.42.0","rollup-plugin-peer-deps-external":"^2.2.4"},"_npmOperationalInternal":{"tmp":"tmp/wink-wysiwyg_0.2.0_1757378987197_0.8267043077914584","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@ampnet/wink-wysiwyg","version":"0.2.1","keywords":["wysiwyg","editor","react","typescript","tiptap","prosemirror","mentions","hashtags","tailwindcss"],"author":{"url":"media","name":"ampnet","email":"https://ampnet.media"},"license":"MIT","_id":"@ampnet/wink-wysiwyg@0.2.1","maintainers":[{"name":"ampnetmedia","email":"adamaoc@gmail.com"}],"homepage":"https://github.com/ampnet-media/wink-wysiwyg#readme","bugs":{"url":"https://github.com/ampnet-media/wink-wysiwyg/issues"},"dist":{"shasum":"4a52bc49cd180eb57f074f677b962fca62919fc7","tarball":"https://registry.npmjs.org/@ampnet/wink-wysiwyg/-/wink-wysiwyg-0.2.1.tgz","fileCount":43,"integrity":"sha512-3rJf6ufpI2hY9U3sn1Ce4b4N/XxXxFKROGAE1twdS5uxnp/AQ3yzbI1/5vaA9OFf+SvfLV31foByzS92J89Mow==","signatures":[{"sig":"MEYCIQCHw4Zu4v2NADFN2s5bSVmv9Q/EKQ0O8/XtwGWaZmUilAIhAMY5gLCIHd6zuo2qkn8bvT1mJEAnvFhXDa2D+sNV+fM3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2858409},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.esm.js","gitHead":"0f6be801408793cbd93a3d96496194c5cd27a48c","scripts":{"dev":"rollup -c rollup.config.mjs -w","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"rollup -c rollup.config.mjs","prepare":"npm run build","test:ui":"vitest --ui","lint:fix":"eslint src --ext .ts,.tsx --fix","type-check":"tsc --noEmit","release:major":"npm run version:major && npm run build && git push --follow-tags","release:minor":"npm run version:minor && npm run build && git push --follow-tags","release:patch":"npm run version:patch && npm run build && git push --follow-tags","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","version:prerelease":"npm version prerelease"},"_npmUser":{"name":"ampnetmedia","email":"adamaoc@gmail.com"},"repository":{"url":"git+https://github.com/ampnet-media/wink-wysiwyg.git","type":"git"},"_npmVersion":"11.5.2","description":"A modern, extensible WYSIWYG editor for React applications with @mentions and #hashtags support","directories":{},"_nodeVersion":"23.10.0","dependencies":{"@tiptap/pm":"^3.4.1","lucide-react":"^0.542.0","@tiptap/react":"^3.4.1","@tiptap/starter-kit":"^3.4.1","isomorphic-dompurify":"^2.26.0","@tiptap/extension-link":"^3.4.1","@tiptap/extension-color":"^3.4.1","@tiptap/extension-image":"^3.4.1","@tiptap/extension-mention":"^3.4.1","@tiptap/extension-highlight":"^3.4.1","@tiptap/extension-underline":"^3.4.1","@tiptap/extension-text-align":"^3.4.1","@tiptap/extension-text-style":"^3.4.1","@tiptap/extension-placeholder":"^3.4.1"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","jsdom":"^26.1.0","tslib":"^2.8.1","eslint":"^9.35.0","rollup":"^4.50.1","vitest":"^3.2.4","postcss":"^8.5.6","prettier":"^3.6.2","typescript":"^5.9.2","@types/node":"^24.3.1","lint-staged":"^16.1.6","tailwindcss":"^4.1.13","@types/react":"^19.1.12","autoprefixer":"^10.4.21","@types/react-dom":"^19.1.9","eslint-plugin-react":"^7.37.5","@tailwindcss/postcss":"^4.1.13","@vitejs/plugin-react":"^5.0.2","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-replace":"^6.0.2","@rollup/plugin-commonjs":"^28.0.6","@rollup/plugin-typescript":"^12.1.4","@typescript-eslint/parser":"^8.42.0","eslint-plugin-react-hooks":"^5.2.0","@rollup/plugin-node-resolve":"^16.0.1","@typescript-eslint/eslint-plugin":"^8.42.0","rollup-plugin-peer-deps-external":"^2.2.4"},"_npmOperationalInternal":{"tmp":"tmp/wink-wysiwyg_0.2.1_1757379067041_0.4616791926897388","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@ampnet/wink-wysiwyg","version":"0.2.2","keywords":["wysiwyg","editor","react","typescript","tiptap","prosemirror","mentions","hashtags","tailwindcss"],"author":{"url":"media","name":"ampnet","email":"https://ampnet.media"},"license":"MIT","_id":"@ampnet/wink-wysiwyg@0.2.2","maintainers":[{"name":"ampnetmedia","email":"adamaoc@gmail.com"}],"homepage":"https://github.com/ampnet-media/wink-wysiwyg#readme","bugs":{"url":"https://github.com/ampnet-media/wink-wysiwyg/issues"},"dist":{"shasum":"7fbb379db00f6539bc5164c00b76023c7d0ead52","tarball":"https://registry.npmjs.org/@ampnet/wink-wysiwyg/-/wink-wysiwyg-0.2.2.tgz","fileCount":31,"integrity":"sha512-ugF7A3vo1hpAM+X0pVlvmkH5/L6fSg2WF02c0Mqf84LmvhmpaAw95df2CdsVAsbn4fz1yi84mlS3mbrKbbpkiQ==","signatures":[{"sig":"MEUCIHoVJl7hgt6AoE0VWs55gG2M6x9i2q7kVFnChLFU3TWBAiEAoQq29k3/HKXOVfXvosv11Gqb0trPrys6T97kYKdj+3E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2840667},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.esm.js","gitHead":"73d16a557fec6d5eeb6dee753d37182228c4347e","scripts":{"dev":"rollup -c rollup.config.mjs -w","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"rollup -c rollup.config.mjs","prepare":"npm run build","test:ui":"vitest --ui","lint:fix":"eslint src --ext .ts,.tsx --fix","type-check":"tsc --noEmit","release:major":"npm run version:major && npm run build && git push --follow-tags","release:minor":"npm run version:minor && npm run build && git push --follow-tags","release:patch":"npm run version:patch && npm run build && git push --follow-tags","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","version:prerelease":"npm version prerelease"},"_npmUser":{"name":"ampnetmedia","email":"adamaoc@gmail.com"},"repository":{"url":"git+https://github.com/ampnet-media/wink-wysiwyg.git","type":"git"},"_npmVersion":"10.8.2","description":"A modern, extensible WYSIWYG editor for React applications with @mentions and #hashtags support","directories":{},"_nodeVersion":"18.20.8","dependencies":{"@tiptap/pm":"^3.4.1","lucide-react":"^0.542.0","@tiptap/react":"^3.4.1","@tiptap/starter-kit":"^3.4.1","isomorphic-dompurify":"^2.26.0","@tiptap/extension-link":"^3.4.1","@tiptap/extension-color":"^3.4.1","@tiptap/extension-image":"^3.4.1","@tiptap/extension-mention":"^3.4.1","@tiptap/extension-highlight":"^3.4.1","@tiptap/extension-underline":"^3.4.1","@tiptap/extension-text-align":"^3.4.1","@tiptap/extension-text-style":"^3.4.1","@tiptap/extension-placeholder":"^3.4.1"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","jsdom":"^26.1.0","tslib":"^2.8.1","eslint":"^9.35.0","rollup":"^4.50.1","vitest":"^3.2.4","postcss":"^8.5.6","prettier":"^3.6.2","typescript":"^5.9.2","@types/node":"^24.3.1","lint-staged":"^16.1.6","tailwindcss":"^4.1.13","@types/react":"^19.1.12","autoprefixer":"^10.4.21","@types/react-dom":"^19.1.9","eslint-plugin-react":"^7.37.5","@tailwindcss/postcss":"^4.1.13","@vitejs/plugin-react":"^5.0.2","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-replace":"^6.0.2","@rollup/plugin-commonjs":"^28.0.6","@rollup/plugin-typescript":"^12.1.4","@typescript-eslint/parser":"^8.42.0","eslint-plugin-react-hooks":"^5.2.0","@rollup/plugin-node-resolve":"^16.0.1","@typescript-eslint/eslint-plugin":"^8.42.0","rollup-plugin-peer-deps-external":"^2.2.4"},"_npmOperationalInternal":{"tmp":"tmp/wink-wysiwyg_0.2.2_1757384204698_0.30735596549369415","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@ampnet/wink-wysiwyg","version":"0.2.3","keywords":["wysiwyg","editor","react","typescript","tiptap","prosemirror","mentions","hashtags","tailwindcss"],"author":{"url":"media","name":"ampnet","email":"https://ampnet.media"},"license":"MIT","_id":"@ampnet/wink-wysiwyg@0.2.3","maintainers":[{"name":"ampnetmedia","email":"adamaoc@gmail.com"}],"homepage":"https://github.com/ampnet-media/wink-wysiwyg#readme","bugs":{"url":"https://github.com/ampnet-media/wink-wysiwyg/issues"},"dist":{"shasum":"aafba1baee294c1fde3859facca0c7407a6e6502","tarball":"https://registry.npmjs.org/@ampnet/wink-wysiwyg/-/wink-wysiwyg-0.2.3.tgz","fileCount":31,"integrity":"sha512-7lYJiF1gYhqZhSviZ3F5j+iNJxkSkCB1p9OYcenuclsWRCZWcR8pImWVm5lkVmu6BNkn8bqeCVLaNEMidvNpeA==","signatures":[{"sig":"MEUCIQDxw8zhzUC0LVc4TeR9TU6Eb7cz6vXZihZRwRia+qkoYAIgHcp+SE5IvBLXvDZv+jNuwqK73VH0uPD3VxtekBA6uKo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2840675},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.esm.js","gitHead":"01dc04669f577d2b28e96c4120fc65aa5ab784db","scripts":{"dev":"rollup -c rollup.config.mjs -w","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"rollup -c rollup.config.mjs","prepare":"npm run build","test:ui":"vitest --ui","lint:fix":"eslint src --ext .ts,.tsx --fix","type-check":"tsc --noEmit","release:major":"npm run version:major && npm run build && git push --follow-tags","release:minor":"npm run version:minor && npm run build && git push --follow-tags","release:patch":"npm run version:patch && npm run build && git push --follow-tags","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","version:prerelease":"npm version prerelease"},"_npmUser":{"name":"ampnetmedia","email":"adamaoc@gmail.com"},"repository":{"url":"git+https://github.com/ampnet-media/wink-wysiwyg.git","type":"git"},"_npmVersion":"10.8.2","description":"A modern, extensible WYSIWYG editor for React applications with @mentions and #hashtags support","directories":{},"_nodeVersion":"18.20.8","dependencies":{"@tiptap/pm":"^3.4.1","lucide-react":"^0.542.0","@tiptap/react":"^3.4.1","@tiptap/starter-kit":"^3.4.1","isomorphic-dompurify":"^2.26.0","@tiptap/extension-link":"^3.4.1","@tiptap/extension-color":"^3.4.1","@tiptap/extension-image":"^3.4.1","@tiptap/extension-mention":"^3.4.1","@tiptap/extension-highlight":"^3.4.1","@tiptap/extension-underline":"^3.4.1","@tiptap/extension-text-align":"^3.4.1","@tiptap/extension-text-style":"^3.4.1","@tiptap/extension-placeholder":"^3.4.1"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","jsdom":"^26.1.0","tslib":"^2.8.1","eslint":"^9.35.0","rollup":"^4.50.1","vitest":"^3.2.4","postcss":"^8.5.6","prettier":"^3.6.2","typescript":"^5.9.2","@types/node":"^24.3.1","lint-staged":"^16.1.6","tailwindcss":"^4.1.13","@types/react":"^19.1.12","autoprefixer":"^10.4.21","@types/react-dom":"^19.1.9","eslint-plugin-react":"^7.37.5","@tailwindcss/postcss":"^4.1.13","@vitejs/plugin-react":"^5.0.2","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-replace":"^6.0.2","@rollup/plugin-commonjs":"^28.0.6","@rollup/plugin-typescript":"^12.1.4","@typescript-eslint/parser":"^8.42.0","eslint-plugin-react-hooks":"^5.2.0","@rollup/plugin-node-resolve":"^16.0.1","@typescript-eslint/eslint-plugin":"^8.42.0","rollup-plugin-peer-deps-external":"^2.2.4"},"_npmOperationalInternal":{"tmp":"tmp/wink-wysiwyg_0.2.3_1757385106872_0.02380599978701614","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@ampnet/wink-wysiwyg","version":"0.2.4","keywords":["wysiwyg","editor","react","typescript","tiptap","prosemirror","mentions","hashtags","tailwindcss"],"author":{"url":"media","name":"ampnet","email":"https://ampnet.media"},"license":"MIT","_id":"@ampnet/wink-wysiwyg@0.2.4","maintainers":[{"name":"ampnetmedia","email":"adamaoc@gmail.com"}],"homepage":"https://github.com/ampnet-media/wink-wysiwyg#readme","bugs":{"url":"https://github.com/ampnet-media/wink-wysiwyg/issues"},"dist":{"shasum":"93c62776e83f1d576fd48a8ccba9786ee25585f6","tarball":"https://registry.npmjs.org/@ampnet/wink-wysiwyg/-/wink-wysiwyg-0.2.4.tgz","fileCount":36,"integrity":"sha512-ud2Eqd9MV0mEYXK7ZzQhBC+knzZetEu0Y6c/1FIlC50qqbGPlb3i2UTmzZTukZk+rgwCRo2Y5kZN7iBWDr3AzQ==","signatures":[{"sig":"MEUCIQCneUK1ZS1jk1lHCiducWdPX34pUyz3+H3Fh1IMZRGoXAIgBOQucfi9udyIDJ4R6WAw1II4ijmZoLZowsUaUD6hjyY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4196051},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.esm.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.js"},"./client":{"types":"./dist/index.d.ts","import":"./dist/client.js"},"./dist/index.css":"./dist/index.css","./dist/index.esm.css":"./dist/index.esm.css"},"gitHead":"33afb15fcee452de3323fca6f92d9455089bbf15","scripts":{"dev":"rollup -c rollup.config.mjs -w","lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"rollup -c rollup.config.mjs","prepare":"npm run build","test:ui":"vitest --ui","lint:fix":"eslint src --ext .ts,.tsx --fix","type-check":"tsc --noEmit","release:major":"npm run version:major && npm run build && git push --follow-tags","release:minor":"npm run version:minor && npm run build && git push --follow-tags","release:patch":"npm run version:patch && npm run build && git push --follow-tags","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","version:prerelease":"npm version prerelease"},"_npmUser":{"name":"ampnetmedia","email":"adamaoc@gmail.com"},"repository":{"url":"git+https://github.com/ampnet-media/wink-wysiwyg.git","type":"git"},"_npmVersion":"10.8.2","description":"A modern, extensible WYSIWYG editor for React applications with @mentions and #hashtags support","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tiptap/pm":"^3.4.1","lucide-react":"^0.542.0","@tiptap/react":"^3.4.1","@tiptap/starter-kit":"^3.4.1","isomorphic-dompurify":"^2.26.0","@tiptap/extension-link":"^3.4.1","@tiptap/extension-color":"^3.4.1","@tiptap/extension-image":"^3.4.1","@tiptap/extension-mention":"^3.4.1","@tiptap/extension-highlight":"^3.4.1","@tiptap/extension-underline":"^3.4.1","@tiptap/extension-text-align":"^3.4.1","@tiptap/extension-text-style":"^3.4.1","@tiptap/extension-placeholder":"^3.4.1"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","jsdom":"^26.1.0","tslib":"^2.8.1","eslint":"^9.35.0","rollup":"^4.50.1","vitest":"^3.2.4","postcss":"^8.5.6","prettier":"^3.6.2","typescript":"^5.9.2","@types/node":"^24.3.1","lint-staged":"^16.1.6","tailwindcss":"^4.1.13","@types/react":"^19.1.12","autoprefixer":"^10.4.21","@types/react-dom":"^19.1.9","eslint-plugin-react":"^7.37.5","@tailwindcss/postcss":"^4.1.13","@vitejs/plugin-react":"^5.0.2","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-replace":"^6.0.2","@rollup/plugin-commonjs":"^28.0.6","@rollup/plugin-typescript":"^12.1.4","@typescript-eslint/parser":"^8.42.0","eslint-plugin-react-hooks":"^5.2.0","@rollup/plugin-node-resolve":"^16.0.1","@typescript-eslint/eslint-plugin":"^8.42.0","rollup-plugin-peer-deps-external":"^2.2.4"},"_npmOperationalInternal":{"tmp":"tmp/wink-wysiwyg_0.2.4_1758136165570_0.1628801977049883","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@ampnet/wink-wysiwyg","version":"0.2.5","description":"A modern, extensible WYSIWYG editor for React applications with @mentions and #hashtags support","type":"module","main":"dist/index.js","module":"dist/index.esm.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.js","import":"./dist/index.esm.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./dist/index.css":"./dist/index.css","./dist/index.esm.css":"./dist/index.esm.css"},"sideEffects":false,"scripts":{"build":"rollup -c rollup.config.mjs","dev":"rollup -c rollup.config.mjs -w","test":"vitest","test:ui":"vitest --ui","lint":"eslint src --ext .ts,.tsx","lint:fix":"eslint src --ext .ts,.tsx --fix","type-check":"tsc --noEmit","prepare":"npm run build","version:patch":"npm version patch","version:minor":"npm version minor","version:major":"npm version major","version:prerelease":"npm version prerelease","release:patch":"npm run version:patch && npm run build && git push --follow-tags","release:minor":"npm run version:minor && npm run build && git push --follow-tags","release:major":"npm run version:major && npm run build && git push --follow-tags"},"keywords":["wysiwyg","editor","react","typescript","tiptap","prosemirror","mentions","hashtags","tailwindcss"],"author":{"name":"ampnet","email":"https://ampnet.media","url":"media"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/ampnet-media/wink-wysiwyg.git"},"bugs":{"url":"https://github.com/ampnet-media/wink-wysiwyg/issues"},"homepage":"https://github.com/ampnet-media/wink-wysiwyg#readme","devDependencies":{"@rollup/plugin-commonjs":"^28.0.6","@rollup/plugin-node-resolve":"^16.0.1","@rollup/plugin-replace":"^6.0.2","@rollup/plugin-typescript":"^12.1.4","@tailwindcss/postcss":"^4.1.13","@types/node":"^24.3.1","@types/react":"^19.1.12","@types/react-dom":"^19.1.9","@typescript-eslint/eslint-plugin":"^8.42.0","@typescript-eslint/parser":"^8.42.0","@vitejs/plugin-react":"^5.0.2","autoprefixer":"^10.4.21","eslint":"^9.35.0","eslint-plugin-react":"^7.37.5","eslint-plugin-react-hooks":"^5.2.0","husky":"^9.1.7","jsdom":"^26.1.0","lint-staged":"^16.1.6","postcss":"^8.5.6","prettier":"^3.6.2","rollup":"^4.50.1","rollup-plugin-peer-deps-external":"^2.2.4","rollup-plugin-postcss":"^4.0.2","tailwindcss":"^4.1.13","tslib":"^2.8.1","typescript":"^5.9.2","vitest":"^3.2.4"},"dependencies":{"@tiptap/extension-color":"^3.4.1","@tiptap/extension-highlight":"^3.4.1","@tiptap/extension-image":"^3.4.1","@tiptap/extension-link":"^3.4.1","@tiptap/extension-mention":"^3.4.1","@tiptap/extension-placeholder":"^3.4.1","@tiptap/extension-text-align":"^3.4.1","@tiptap/extension-text-style":"^3.4.1","@tiptap/extension-underline":"^3.4.1","@tiptap/pm":"^3.4.1","@tiptap/react":"^3.4.1","@tiptap/starter-kit":"^3.4.1","isomorphic-dompurify":"^2.26.0","lucide-react":"^0.542.0"},"_id":"@ampnet/wink-wysiwyg@0.2.5","gitHead":"57a83e17f0e1231af1554d029137f3135414fbdd","_nodeVersion":"18.20.8","_npmVersion":"10.8.2","dist":{"integrity":"sha512-ifFWV7yQGeH11tvXLyjJP+dUpfYQ5Yovlr8PPwF8J81AgGx61vo/YNKAHLdj9RuBhDMpsbyJEYVCaeY+7QlLmg==","shasum":"19d6f31ae074fbcf3ed60849232cf4e340d429d7","tarball":"https://registry.npmjs.org/@ampnet/wink-wysiwyg/-/wink-wysiwyg-0.2.5.tgz","fileCount":62,"unpackedSize":4247507,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC4e1pAu5rn8EM8aqCOVJ6vc/ug3zFaVXgpLIgxq130RgIgDdZaAUTuHFwYvhwh9AZjTIqaelPUulSsD0BhyO/VcRo="}]},"_npmUser":{"name":"ampnetmedia","email":"adamaoc@gmail.com"},"directories":{},"maintainers":[{"name":"ampnetmedia","email":"adamaoc@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/wink-wysiwyg_0.2.5_1758140639789_0.6969286652197313"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-09T00:49:47.133Z","modified":"2025-09-17T20:24:00.497Z","0.2.0":"2025-09-09T00:49:47.468Z","0.2.1":"2025-09-09T00:51:07.284Z","0.2.2":"2025-09-09T02:16:44.923Z","0.2.3":"2025-09-09T02:31:47.146Z","0.2.4":"2025-09-17T19:09:25.841Z","0.2.5":"2025-09-17T20:24:00.312Z"},"bugs":{"url":"https://github.com/ampnet-media/wink-wysiwyg/issues"},"author":{"name":"ampnet","email":"https://ampnet.media","url":"media"},"license":"MIT","homepage":"https://github.com/ampnet-media/wink-wysiwyg#readme","keywords":["wysiwyg","editor","react","typescript","tiptap","prosemirror","mentions","hashtags","tailwindcss"],"repository":{"type":"git","url":"git+https://github.com/ampnet-media/wink-wysiwyg.git"},"description":"A modern, extensible WYSIWYG editor for React applications with @mentions and #hashtags support","maintainers":[{"name":"ampnetmedia","email":"adamaoc@gmail.com"}],"readme":"# W-Ink WYSIWYG Editor\n\nA modern, extensible WYSIWYG editor for React applications with @mentions and #hashtags support.\n\n[![npm version](https://badge.fury.io/js/%40ampnet%2Fwink-wysiwyg.svg)](https://badge.fury.io/js/%40ampnet%2Fwink-wysiwyg)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg)](http://www.typescriptlang.org/)\n\n## Features\n\n- 🎨 **Rich Text Editing** - Full-featured WYSIWYG editor with formatting, lists, links, and more\n- 👥 **Social Features** - Built-in @mention and #hashtag support\n- 🔌 **Extensible** - Plugin system for custom functionality\n- 🎯 **Accessible** - WCAG compliant with keyboard navigation and screen reader support\n- 📱 **Responsive** - Works on desktop and mobile devices\n- 🎨 **Customizable** - TailwindCSS integration with custom themes\n- ⚡ **Performance** - Optimized for speed and efficiency\n- 🔒 **Secure** - Built-in XSS protection and content sanitization\n\n## Installation\n\n```bash\nnpm install @ampnet/wink-wysiwyg\n```\n\n## Quick Start\n\n```tsx\nimport React, { useState } from \"react\";\nimport { WInkEditor } from \"@ampnet/wink-wysiwyg\";\nimport \"@ampnet/wink-wysiwyg/dist/styles.css\";\n\nfunction App() {\n  const [content, setContent] = useState(\n    \"<p>Hello, <strong>W-Ink</strong>!</p>\"\n  );\n\n  return (\n    <WInkEditor\n      content={content}\n      onChange={setContent}\n      placeholder=\"Start typing...\"\n      enableMentions={true}\n      enableHashtags={true}\n    />\n  );\n}\n```\n\n## Next.js 15 App Router Integration\n\nThe W-Ink editor is fully compatible with Next.js 15 App Router and React Server Components. Here are the recommended patterns for different use cases:\n\n### Client-Side Editor (Recommended)\n\nFor interactive editors that need to run on the client:\n\n```tsx\n\"use client\";\nimport dynamic from \"next/dynamic\";\nimport { useState } from \"react\";\n\n// Dynamic import with SSR disabled - prevents hydration issues\nconst WInkEditor = dynamic(\n  () => import(\"@ampnet/wink-wysiwyg\").then((m) => m.WInkEditor),\n  {\n    ssr: false,\n    loading: () => (\n      <div className=\"flex items-center justify-center p-8 bg-gray-50 rounded-lg border-2 border-dashed border-gray-300\">\n        <div className=\"text-center\">\n          <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto mb-2\"></div>\n          <p className=\"text-gray-600\">Loading editor...</p>\n        </div>\n      </div>\n    ),\n  }\n);\n\nexport default function RichTextEditor({\n  initialContent,\n}: {\n  initialContent: string;\n}) {\n  const [content, setContent] = useState(initialContent);\n\n  return (\n    <WInkEditor\n      content={content}\n      onChange={setContent}\n      immediatelyRender={false} // Important for SSR safety\n      hydrationStrategy=\"afterMount\" // Defer initialization\n      enableMentions={true}\n      enableHashtags={true}\n      onMentionClick={(handle) => console.log(\"Mention clicked:\", handle)}\n      onHashtagClick={(tag) => console.log(\"Hashtag clicked:\", tag)}\n      getMentionSuggestions={(query) =>\n        [\"adam\", \"sarah\", \"jordan\"].filter((name) =>\n          name.toLowerCase().includes(query.toLowerCase())\n        )\n      }\n    />\n  );\n}\n```\n\n### SSR-Safe Content Display\n\nFor displaying static content in Server Components (no hydration issues):\n\n```tsx\nimport { WInkRenderer } from \"@ampnet/wink-wysiwyg\";\n\nexport default function ContentDisplay({ html }: { html: string }) {\n  return (\n    <WInkRenderer\n      content={html}\n      className=\"prose max-w-none prose-headings:text-gray-900 prose-p:text-gray-700\"\n    />\n  );\n}\n```\n\n### NoSSR Wrapper (Alternative Approach)\n\nFor wrapping other client-only components:\n\n```tsx\n\"use client\";\nimport { WInkNoSSR } from \"@ampnet/wink-wysiwyg\";\nimport { WInkEditor } from \"@ampnet/wink-wysiwyg\";\n\nexport default function ClientOnlyComponent() {\n  return (\n    <WInkNoSSR fallback={<div>Loading editor...</div>}>\n      <WInkEditor\n        content=\"<p>Client-only content</p>\"\n        immediatelyRender={false}\n        hydrationStrategy=\"afterMount\"\n      />\n    </WInkNoSSR>\n  );\n}\n```\n\n### TypeScript Integration\n\nThe package provides full TypeScript support with comprehensive type definitions:\n\n```tsx\nimport { WInkEditorProps, EditorState } from \"@ampnet/wink-wysiwyg\";\n\ninterface MyEditorProps {\n  content: string;\n  onSave: (content: string) => void;\n}\n\nexport default function MyEditor({ content, onSave }: MyEditorProps) {\n  const [editorState, setEditorState] = useState<EditorState | null>(null);\n\n  const handleChange = (newContent: string) => {\n    // TypeScript knows newContent is a string\n    onSave(newContent);\n  };\n\n  return (\n    <WInkEditor\n      content={content}\n      onChange={handleChange}\n      onReady={(editor) => {\n        // TypeScript knows editor is a TipTap Editor instance\n        console.log(\"Editor ready:\", editor);\n      }}\n      immediatelyRender={false}\n      hydrationStrategy=\"afterMount\"\n    />\n  );\n}\n```\n\n## Basic Usage\n\n### Simple Editor\n\n```tsx\nimport { WInkEditor } from \"@ampnet/wink-wysiwyg\";\n\n<WInkEditor\n  content=\"<p>Your content here</p>\"\n  onChange={(content) => console.log(content)}\n  placeholder=\"Start typing...\"\n/>;\n```\n\n### With Social Features\n\n```tsx\n<WInkEditor\n  content={content}\n  onChange={setContent}\n  enableMentions={true}\n  enableHashtags={true}\n  onMentionClick={(handle) => console.log(\"Mention clicked:\", handle)}\n  getMentionSuggestions={(query) => {\n    // Return filtered suggestions based on query\n    return suggestions.filter((s) =>\n      s.toLowerCase().includes(query.toLowerCase())\n    );\n  }}\n/>\n```\n\n### With Custom Primary Color Theme\n\n```tsx\n<WInkEditor\n  content={content}\n  onChange={setContent}\n  primaryColor=\"#ff6b6b\" // Custom red theme\n  enableMentions={true}\n  enableHashtags={true}\n  onMentionClick={(handle) => console.log(\"Mention clicked:\", handle)}\n  onHashtagClick={(tag) => console.log(\"Hashtag clicked:\", tag)}\n/>\n```\n\n### Custom Configuration\n\n```tsx\n<WInkEditor\n  content={content}\n  onChange={setContent}\n  size=\"lg\"\n  theme=\"dark\"\n  showToolbar={true}\n  enableImages={true}\n  enableLinks={true}\n  enableCodeBlocks={true}\n  minHeight=\"200px\"\n  maxHeight=\"500px\"\n  autoFocus={true}\n/>\n```\n\n## API Reference\n\n### WInkEditor Props\n\n| Prop                    | Type                                     | Default             | Description                            |\n| ----------------------- | ---------------------------------------- | ------------------- | -------------------------------------- |\n| `content`               | `string`                                 | `''`                | Initial HTML content                   |\n| `onChange`              | `(content: string) => void`              | -                   | Callback when content changes          |\n| `placeholder`           | `string`                                 | `'Start typing...'` | Placeholder text                       |\n| `editable`              | `boolean`                                | `true`              | Whether editor is editable             |\n| `showToolbar`           | `boolean`                                | `true`              | Whether to show toolbar                |\n| `size`                  | `'sm' \\| 'md' \\| 'lg' \\| 'xl' \\| 'full'` | `'md'`              | Editor size                            |\n| `theme`                 | `'light' \\| 'dark' \\| 'auto'`            | `'light'`           | Editor theme                           |\n| `primaryColor`          | `string`                                 | -                   | Primary color for theming (hex)        |\n| `immediatelyRender`     | `boolean`                                | `true`              | **SSR**: Control TipTap initialization |\n| `hydrationStrategy`     | `'none' \\| 'afterMount' \\| 'rAF'`        | `'none'`            | **SSR**: Hydration strategy            |\n| `enableMentions`        | `boolean`                                | `false`             | Enable @mention support                |\n| `enableHashtags`        | `boolean`                                | `false`             | Enable #hashtag support                |\n| `enableImages`          | `boolean`                                | `true`              | Enable image insertion                 |\n| `enableLinks`           | `boolean`                                | `true`              | Enable link insertion                  |\n| `enableCodeBlocks`      | `boolean`                                | `true`              | Enable code blocks                     |\n| `autoFocus`             | `boolean`                                | `false`             | Auto-focus on mount                    |\n| `minHeight`             | `string \\| number`                       | `'120px'`           | Minimum editor height                  |\n| `maxHeight`             | `string \\| number`                       | -                   | Maximum editor height                  |\n| `onMentionClick`        | `(handle: string) => void`               | -                   | Callback when mention is clicked       |\n| `getMentionSuggestions` | `(query: string) => string[]`            | -                   | Function to get mention suggestions    |\n| `onHashtagClick`        | `(tag: string) => void`                  | -                   | Callback when hashtag is clicked       |\n| `onImageUpload`         | `(file: File) => Promise<string>`        | -                   | Handle image uploads                   |\n| `onReady`               | `(editor: Editor) => void`               | -                   | Callback when editor is ready          |\n| `onDestroy`             | `() => void`                             | -                   | Callback when editor is destroyed      |\n\n### TypeScript Types\n\nThe package exports comprehensive TypeScript definitions:\n\n```tsx\nimport {\n  WInkEditorProps, // Main editor props interface\n  EditorState, // Editor state interface\n  WInkEditorConfig, // Base configuration\n  EditorSize, // 'sm' | 'md' | 'lg' | 'xl' | 'full'\n  EditorTheme, // 'light' | 'dark' | 'auto'\n  EditorMode, // 'wysiwyg' | 'markdown' | 'html'\n  ToolbarButton, // Toolbar button interface\n  ToolbarGroup, // Toolbar group interface\n  WInkPlugin, // Plugin interface\n  MentionConfig, // Mention configuration\n  HashtagConfig, // Hashtag configuration\n  ExportConfig, // Export configuration\n  ImportConfig, // Import configuration\n} from \"@ampnet/wink-wysiwyg\";\n```\n\n### TypeScript Usage Examples\n\n#### Basic TypeScript Setup\n\n```tsx\nimport { WInkEditorProps, EditorState } from \"@ampnet/wink-wysiwyg\";\nimport { useState } from \"react\";\n\ninterface MyEditorProps {\n  initialContent: string;\n  onSave: (content: string) => void;\n  className?: string;\n}\n\nexport default function MyEditor({\n  initialContent,\n  onSave,\n  className,\n}: MyEditorProps) {\n  const [content, setContent] = useState<string>(initialContent);\n  const [editorState, setEditorState] = useState<EditorState | null>(null);\n\n  const handleChange = (newContent: string): void => {\n    setContent(newContent);\n    onSave(newContent);\n  };\n\n  const editorProps: WInkEditorProps = {\n    content,\n    onChange: handleChange,\n    immediatelyRender: false,\n    hydrationStrategy: \"afterMount\",\n    enableMentions: true,\n    enableHashtags: true,\n    onReady: (editor) => {\n      console.log(\"Editor ready:\", editor);\n    },\n  };\n\n  return (\n    <div className={className}>\n      <WInkEditor {...editorProps} />\n    </div>\n  );\n}\n```\n\n#### Advanced TypeScript with Custom Types\n\n```tsx\nimport { WInkEditor, WInkEditorProps, EditorState } from \"@ampnet/wink-wysiwyg\";\nimport { Editor } from \"@tiptap/react\";\n\ninterface User {\n  id: string;\n  name: string;\n  handle: string;\n  avatar?: string;\n}\n\ninterface CustomEditorProps extends Partial<WInkEditorProps> {\n  users: User[];\n  onMentionSelect: (user: User) => void;\n  onHashtagSelect: (tag: string) => void;\n}\n\nexport default function CustomEditor({\n  users,\n  onMentionSelect,\n  onHashtagSelect,\n  ...editorProps\n}: CustomEditorProps) {\n  const getMentionSuggestions = (query: string): string[] => {\n    return users\n      .filter(\n        (user) =>\n          user.name.toLowerCase().includes(query.toLowerCase()) ||\n          user.handle.toLowerCase().includes(query.toLowerCase())\n      )\n      .map((user) => user.handle);\n  };\n\n  const handleMentionClick = (handle: string): void => {\n    const user = users.find((u) => u.handle === handle);\n    if (user) {\n      onMentionSelect(user);\n    }\n  };\n\n  return (\n    <WInkEditor\n      {...editorProps}\n      immediatelyRender={false}\n      hydrationStrategy=\"afterMount\"\n      enableMentions={true}\n      enableHashtags={true}\n      getMentionSuggestions={getMentionSuggestions}\n      onMentionClick={handleMentionClick}\n      onHashtagClick={onHashtagSelect}\n    />\n  );\n}\n```\n\n### Hooks\n\n#### useWInkEditor\n\n```tsx\nimport { useWInkEditor } from \"@ampnet/wink-wysiwyg\";\n\nconst { editor, editorUtils, isReady } = useWInkEditor(editor, config);\n\n// Available methods:\neditorUtils.getContent(\"html\" | \"text\" | \"json\");\neditorUtils.setContent(content);\neditorUtils.exportContent(\"html\" | \"markdown\" | \"text\" | \"json\");\neditorUtils.importContent(content, \"html\" | \"markdown\" | \"text\" | \"json\");\n```\n\n#### useMentions\n\n```tsx\nimport { useMentions } from \"@ampnet/wink-wysiwyg\";\n\nconst { mentionState, showSuggestions, hideSuggestions, insertMention } =\n  useMentions(editor, {\n    trigger: \"@\",\n    fetchSuggestions: async (query) => {\n      // Fetch mention suggestions\n      return suggestions;\n    },\n  });\n```\n\n#### useHashtags\n\n```tsx\nimport { useHashtags } from \"@ampnet/wink-wysiwyg\";\n\nconst {\n  hashtagState,\n  showSuggestions,\n  hideSuggestions,\n  insertHashtag,\n  extractHashtags,\n} = useHashtags(editor, {\n  trigger: \"#\",\n  fetchSuggestions: async (query) => {\n    // Fetch hashtag suggestions\n    return suggestions;\n  },\n});\n```\n\n## Theming\n\nThe editor supports custom theming through a primary color system. You can easily customize the appearance to match your brand or application design.\n\n### Primary Color Theming\n\nThe `primaryColor` prop allows you to set a custom color that automatically generates a cohesive theme:\n\n```tsx\n<WInkEditor\n  content={content}\n  onChange={setContent}\n  primaryColor=\"#ff6b6b\" // Custom red theme\n  enableMentions={true}\n  enableHashtags={true}\n/>\n```\n\n**What gets themed:**\n\n- **Toolbar buttons**: Hover and active states use the primary color\n- **@mentions**: Background, text, and border colors use primary color variations\n- **#hashtags**: Background, text, and border colors use primary color variations\n- **Interactive elements**: All hover effects respect the primary color theme\n\n**Color variations generated:**\n\n- Light variations (10% opacity) for backgrounds\n- Medium variations (30% opacity) for borders\n- Dark variations (80% opacity) for hover states\n- Full opacity for text and active states\n\n### CSS Variables\n\nThe editor uses CSS custom properties that can be overridden:\n\n```css\n:root {\n  --color-primary: #3b82f6;\n  --color-primary-hover: #2563eb;\n  --color-primary-light: #dbeafe;\n  --color-primary-dark: #1d4ed8;\n  --color-mention-bg: var(--color-primary-light);\n  --color-mention-text: var(--color-primary-dark);\n  --color-mention-border: var(--color-primary);\n  --color-hashtag-bg: var(--color-primary-light);\n  --color-hashtag-text: var(--color-primary-dark);\n  --color-hashtag-border: var(--color-primary);\n}\n```\n\n### Advanced Styling\n\nYou can further customize the appearance by:\n\n1. **CSS Custom Properties** - Override CSS variables\n2. **TailwindCSS Classes** - Use Tailwind utility classes\n3. **Custom CSS** - Add your own styles\n\n### Custom Classes\n\n```tsx\n<WInkEditor\n  className=\"my-custom-editor\"\n  toolbarClassName=\"my-custom-toolbar\"\n  contentClassName=\"my-custom-content\"\n/>\n```\n\n## Plugin System\n\nCreate custom plugins to extend functionality:\n\n```tsx\nimport { WInkPlugin } from \"@ampnet/wink-wysiwyg\";\n\nconst customPlugin: WInkPlugin = {\n  id: \"custom-plugin\",\n  name: \"Custom Plugin\",\n  init: (editor) => {\n    // Initialize plugin\n  },\n  getToolbarButtons: (editor) => [\n    {\n      id: \"custom-button\",\n      name: \"Custom Action\",\n      onClick: () => {\n        // Handle button click\n      },\n    },\n  ],\n};\n```\n\n## Browser Support\n\n- Chrome 90+\n- Firefox 88+\n- Safari 14+\n- Edge 90+\n\n## Development\n\n### Prerequisites\n\n- Node.js 18+\n- npm or yarn\n\n### Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/ampnetmedia/wink-wysiwyg.git\ncd wink-wysiwyg\n\n# Install dependencies\nnpm install\n\n# Start development server\nnpm run dev\n\n# Build package\nnpm run build\n\n# Run tests\nnpm test\n\n# Lint code\nnpm run lint\n```\n\n### Project Structure\n\n```\nwink-wysiwyg/\n├── src/\n│   ├── components/          # React components\n│   │   ├── WInkEditor.tsx   # Main editor component\n│   │   ├── Toolbar.tsx      # Formatting toolbar\n│   │   └── plugins/         # Built-in plugins\n│   ├── hooks/               # Custom hooks\n│   │   ├── useWInkEditor.ts # Main editor hook\n│   │   ├── useMentions.ts   # Mention functionality\n│   │   └── useHashtags.ts   # Hashtag functionality\n│   ├── types/               # TypeScript definitions\n│   ├── utils/               # Utility functions\n│   └── styles/              # CSS and styling\n├── dist/                    # Built package\n├── examples/                # Usage examples\n├── tests/                   # Test files\n└── docs/                    # Documentation\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Add tests\n5. Submit a pull request\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## SSR Troubleshooting\n\nIf you encounter hydration errors in Next.js or other SSR frameworks, follow these solutions:\n\n### Common SSR Issues and Solutions\n\n#### 1. Hydration Mismatch Errors\n\n**Error**: `Hydration failed because the initial UI does not match`\n\n**Solution**: Use dynamic imports with `ssr: false`\n\n```tsx\n\"use client\";\nimport dynamic from \"next/dynamic\";\n\nconst WInkEditor = dynamic(\n  () => import(\"@ampnet/wink-wysiwyg\").then((m) => m.WInkEditor),\n  { ssr: false }\n);\n```\n\n#### 2. Tiptap SSR Detection Error\n\n**Error**: `Tiptap Error: SSR has been detected, please set immediatelyRender explicitly to false`\n\n**Solution**: Set `immediatelyRender={false}` in your editor props\n\n```tsx\n<WInkEditor\n  content={content}\n  onChange={setContent}\n  immediatelyRender={false} // ✅ This fixes the SSR error\n  hydrationStrategy=\"afterMount\"\n/>\n```\n\n#### 3. Window/Global Object Errors\n\n**Error**: `ReferenceError: window is not defined` or `document is not defined`\n\n**Solution**: Use the SSR-safe wrapper or dynamic imports\n\n```tsx\n// Option 1: Dynamic import (recommended)\nconst WInkEditor = dynamic(\n  () => import(\"@ampnet/wink-wysiwyg\").then((m) => m.WInkEditor),\n  { ssr: false }\n);\n\n// Option 2: NoSSR wrapper\nimport { WInkNoSSR } from \"@ampnet/wink-wysiwyg\";\n<WInkNoSSR fallback={<div>Loading...</div>}>\n  <WInkEditor content={content} />\n</WInkNoSSR>;\n```\n\n#### 4. TypeScript Import Errors\n\n**Error**: `Module not found: Package path ./client is not exported`\n\n**Solution**: Use the main package import with dynamic loading\n\n```tsx\n// ❌ Don't use this (client entrypoint may not be available)\nimport { WInkEditor } from \"@ampnet/wink-wysiwyg/client\";\n\n// ✅ Use this instead\nimport dynamic from \"next/dynamic\";\nconst WInkEditor = dynamic(\n  () => import(\"@ampnet/wink-wysiwyg\").then((m) => m.WInkEditor),\n  { ssr: false }\n);\n```\n\n#### 5. CSS Import Issues\n\n**Error**: `Missing \"./dist/index.css\" specifier in package`\n\n**Solution**: Import CSS from the correct path\n\n```tsx\n// In your layout.tsx or _app.tsx\nimport \"@ampnet/wink-wysiwyg/dist/index.css\";\n```\n\n### Best Practices for Next.js Integration\n\n1. **Always use dynamic imports** for interactive editors\n2. **Set `immediatelyRender={false}`** to prevent SSR issues\n3. **Use `hydrationStrategy=\"afterMount\"`** for better performance\n4. **Import CSS globally** in your layout or app file\n5. **Use `WInkRenderer`** for displaying static content in Server Components\n\n### Complete Next.js Setup Example\n\n```tsx\n// app/layout.tsx\nimport \"@ampnet/wink-wysiwyg/dist/index.css\";\n\n// app/components/Editor.tsx\n(\"use client\");\nimport dynamic from \"next/dynamic\";\nimport { useState } from \"react\";\n\nconst WInkEditor = dynamic(\n  () => import(\"@ampnet/wink-wysiwyg\").then((m) => m.WInkEditor),\n  {\n    ssr: false,\n    loading: () => <div>Loading editor...</div>,\n  }\n);\n\nexport default function Editor() {\n  const [content, setContent] = useState(\"\");\n\n  return (\n    <WInkEditor\n      content={content}\n      onChange={setContent}\n      immediatelyRender={false}\n      hydrationStrategy=\"afterMount\"\n      enableMentions={true}\n      enableHashtags={true}\n    />\n  );\n}\n\n// app/components/ContentDisplay.tsx (Server Component)\nimport { WInkRenderer } from \"@ampnet/wink-wysiwyg\";\n\nexport default function ContentDisplay({ html }: { html: string }) {\n  return <WInkRenderer content={html} className=\"prose\" />;\n}\n```\n\n## Additional Resources\n\n- 📖 [Next.js Integration Guide](./NEXTJS_INTEGRATION.md) - Comprehensive guide for Next.js 15 App Router\n- 🎯 [TypeScript Examples](./NEXTJS_INTEGRATION.md#typescript-integration) - Advanced TypeScript usage patterns\n- 🔧 [SSR Troubleshooting](./README.md#ssr-troubleshooting) - Common issues and solutions\n\n## Support\n\n- 📖 [Documentation](https://github.com/ampnet-media/wink-wysiwyg)\n- 🐛 [Issue Tracker](https://github.com/ampnet-media/wink-wysiwyg/issues)\n- 💬 [Discussions](https://github.com/ampnet-media/wink-wysiwyg/discussions)\n\n## Version Management\n\nThis project uses semantic versioning (semver) for version management. Use the following npm scripts to manage versions:\n\n### Version Commands\n\n```bash\n# Patch version (0.1.0 -> 0.1.1) - Bug fixes\nnpm run version:patch\n\n# Minor version (0.1.0 -> 0.2.0) - New features, backward compatible\nnpm run version:minor\n\n# Major version (0.1.0 -> 1.0.0) - Breaking changes\nnpm run version:major\n\n# Prerelease version (0.1.0 -> 0.1.1-0) - Alpha/beta releases\nnpm run version:prerelease\n```\n\n### Release Commands\n\n```bash\n# Release with automatic build and git push\nnpm run release:patch   # For bug fixes\nnpm run release:minor   # For new features\nnpm run release:major   # For breaking changes\n```\n\n### Manual Version Management\n\n```bash\n# Set a specific version\nnpm version 0.2.0\n\n# Set a prerelease version\nnpm version 0.2.0-beta.1\n```\n\n## Changelog\n\n### 0.2.0\n\n- ✨ **New Feature**: Primary color theming system\n  - Added `primaryColor` prop for custom color theming\n  - Automatic generation of color variations for mentions and hashtags\n  - Dynamic toolbar button theming with hover effects\n  - CSS custom properties for advanced customization\n  - Backward compatible with existing implementations\n\n### 0.1.0\n\n- Initial release with comprehensive WYSIWYG functionality\n- Core editor with TipTap integration\n- Complete toolbar with animated buttons\n- Text formatting (bold, italic, underline, strikethrough)\n- Text alignment (left, center, right, justify)\n- Headings (H1-H6) with dropdown selector\n- Lists (bullet and numbered) with proper styling\n- Blockquotes and code blocks\n- Link insertion and management\n- Image support with drag & drop\n- Undo/redo functionality\n- Comprehensive keyboard shortcuts modal\n- Enhanced copy/paste with Word/Google Docs support\n- Smart focus management and navigation\n- Light theme with proper CSS isolation\n- Plugin system architecture\n- @mention and #hashtag support hooks (ready for implementation)\n- TailwindCSS integration\n- Accessibility features\n- TypeScript support\n- Build system with Rollup\n\n---\n\nBuilt with ❤️ by [ampnet (media)](https://ampnet.media) and [Flexhub](https://flexhub.ampnet.media)\n","readmeFilename":"README.md"}