[{"data":1,"prerenderedAt":3306},["ShallowReactive",2],{"navigation":3,"\u002Fchangelog":629,"\u002Fchangelog-surround":3303},[4,27,60,265,595,625],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18,22],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Editors","\u002Fgetting-started\u002Feditors","1.getting-started\u002F2.editors",{"title":19,"path":20,"stem":21},"Editor API","\u002Fgetting-started\u002Feditor-api","1.getting-started\u002F3.editor-api",{"title":23,"path":24,"stem":25},"Migration v1 → v2","\u002Fgetting-started\u002Fmigration-v1-to-v2","1.getting-started\u002F4.migration-v1-to-v2",false,{"title":15,"icon":28,"path":29,"stem":30,"children":31,"page":26},"i-lucide-layout-panel-left","\u002Feditors","2.editors",[32,36,40,44,48,52,56],{"title":33,"path":34,"stem":35},"JSON Editor","\u002Feditors\u002Fjson","2.editors\u002F1.json",{"title":37,"path":38,"stem":39},"Markdown Editor","\u002Feditors\u002Fmarkdown","2.editors\u002F2.markdown",{"title":41,"path":42,"stem":43},"Code Editor","\u002Feditors\u002Fcode","2.editors\u002F3.code",{"title":45,"path":46,"stem":47},"Forms Editor","\u002Feditors\u002Fforms","2.editors\u002F4.forms",{"title":49,"path":50,"stem":51},"Charts Editor","\u002Feditors\u002Fcharts","2.editors\u002F5.charts",{"title":53,"path":54,"stem":55},"Calendar Editor","\u002Feditors\u002Fcalendar","2.editors\u002F6.calendar",{"title":57,"path":58,"stem":59},"Tables Editor","\u002Feditors\u002Ftables","2.editors\u002F7.tables",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":26},"Plugins","i-lucide-puzzle","\u002Fplugins","3.plugins",[66,70,108,154,180,210,235],{"title":67,"path":68,"stem":69},"Plugins overview","\u002Fplugins\u002Foverview","3.plugins\u002F1.overview",{"title":71,"icon":72,"path":73,"stem":74,"children":75,"page":26},"Formatting","i-lucide-type","\u002Fplugins\u002Fformatting","3.plugins\u002F2.formatting",[76,80,84,88,92,96,100,104],{"title":77,"path":78,"stem":79},"Default marks","\u002Fplugins\u002Fformatting\u002Ftoolbar","3.plugins\u002F2.formatting\u002F1.toolbar",{"title":81,"path":82,"stem":83},"Font","\u002Fplugins\u002Fformatting\u002Ffont","3.plugins\u002F2.formatting\u002F2.font",{"title":85,"path":86,"stem":87},"Typography","\u002Fplugins\u002Fformatting\u002Ftypography","3.plugins\u002F2.formatting\u002F3.typography",{"title":89,"path":90,"stem":91},"Color","\u002Fplugins\u002Fformatting\u002Fcolor","3.plugins\u002F2.formatting\u002F4.color",{"title":93,"path":94,"stem":95},"Clear Styles","\u002Fplugins\u002Fformatting\u002Fclear-styles","3.plugins\u002F2.formatting\u002F5.clear-styles",{"title":97,"path":98,"stem":99},"Alignment","\u002Fplugins\u002Fformatting\u002Falignment","3.plugins\u002F2.formatting\u002F6.alignment",{"title":101,"path":102,"stem":103},"Block Style","\u002Fplugins\u002Fformatting\u002Fblock-style","3.plugins\u002F2.formatting\u002F7.block-style",{"title":105,"path":106,"stem":107},"Link","\u002Fplugins\u002Fformatting\u002Flink","3.plugins\u002F2.formatting\u002F8.link",{"title":109,"icon":110,"path":111,"stem":112,"children":113,"page":26},"Blocks","i-lucide-blocks","\u002Fplugins\u002Fblocks","3.plugins\u002F3.blocks",[114,118,122,126,130,134,138,142,146,150],{"title":115,"path":116,"stem":117},"Block","\u002Fplugins\u002Fblocks\u002Fblock","3.plugins\u002F3.blocks\u002F01.block",{"title":119,"path":120,"stem":121},"Lists","\u002Fplugins\u002Fblocks\u002Flists","3.plugins\u002F3.blocks\u002F02.lists",{"title":123,"path":124,"stem":125},"Table","\u002Fplugins\u002Fblocks\u002Ftable","3.plugins\u002F3.blocks\u002F03.table",{"title":127,"path":128,"stem":129},"Templates","\u002Fplugins\u002Fblocks\u002Ftemplates","3.plugins\u002F3.blocks\u002F04.templates",{"title":131,"path":132,"stem":133},"Code Block","\u002Fplugins\u002Fblocks\u002Fcode-block","3.plugins\u002F3.blocks\u002F05.code-block",{"title":135,"path":136,"stem":137},"Math","\u002Fplugins\u002Fblocks\u002Fmath","3.plugins\u002F3.blocks\u002F06.math",{"title":139,"path":140,"stem":141},"HTML Viewer","\u002Fplugins\u002Fblocks\u002Fhtml-viewer","3.plugins\u002F3.blocks\u002F07.html-viewer",{"title":143,"path":144,"stem":145},"Footnotes","\u002Fplugins\u002Fblocks\u002Ffootnotes","3.plugins\u002F3.blocks\u002F08.footnotes",{"title":147,"path":148,"stem":149},"Anchor Link","\u002Fplugins\u002Fblocks\u002Fanchor-link","3.plugins\u002F3.blocks\u002F09.anchor-link",{"title":151,"path":152,"stem":153},"Footer","\u002Fplugins\u002Fblocks\u002Ffooter","3.plugins\u002F3.blocks\u002F10.footer",{"title":155,"icon":156,"path":157,"stem":158,"children":159,"page":26},"Media","i-lucide-image","\u002Fplugins\u002Fmedia","3.plugins\u002F4.media",[160,164,168,172,176],{"title":161,"path":162,"stem":163},"Image","\u002Fplugins\u002Fmedia\u002Fimage","3.plugins\u002F4.media\u002F1.image",{"title":165,"path":166,"stem":167},"Video","\u002Fplugins\u002Fmedia\u002Fvideo","3.plugins\u002F4.media\u002F2.video",{"title":169,"path":170,"stem":171},"YouTube Video","\u002Fplugins\u002Fmedia\u002Fyoutube-video","3.plugins\u002F4.media\u002F3.youtube-video",{"title":173,"path":174,"stem":175},"File Upload","\u002Fplugins\u002Fmedia\u002Ffile-upload","3.plugins\u002F4.media\u002F4.file-upload",{"title":177,"path":178,"stem":179},"PDF Embed","\u002Fplugins\u002Fmedia\u002Fpdf-embed","3.plugins\u002F4.media\u002F5.pdf-embed",{"title":181,"icon":182,"path":183,"stem":184,"children":185,"page":26},"Data & embeds","i-lucide-database","\u002Fplugins\u002Fdata","3.plugins\u002F5.data",[186,190,194,198,202,206],{"title":187,"path":188,"stem":189},"JSON","\u002Fplugins\u002Fdata\u002Fjson","3.plugins\u002F5.data\u002F1.json",{"title":191,"path":192,"stem":193},"Markdown","\u002Fplugins\u002Fdata\u002Fmarkdown","3.plugins\u002F5.data\u002F2.markdown",{"title":195,"path":196,"stem":197},"Charts","\u002Fplugins\u002Fdata\u002Fcharts","3.plugins\u002F5.data\u002F3.charts",{"title":199,"path":200,"stem":201},"Form Builder","\u002Fplugins\u002Fdata\u002Fform-builder","3.plugins\u002F5.data\u002F4.form-builder",{"title":203,"path":204,"stem":205},"Calendar","\u002Fplugins\u002Fdata\u002Fcalendar","3.plugins\u002F5.data\u002F5.calendar",{"title":207,"path":208,"stem":209},"Timer","\u002Fplugins\u002Fdata\u002Ftimer","3.plugins\u002F5.data\u002F6.timer",{"title":211,"icon":212,"path":213,"stem":214,"children":215,"page":26},"Collaboration","i-lucide-users","\u002Fplugins\u002Fcollaboration","3.plugins\u002F6.collaboration",[216,219,223,227,231],{"title":211,"path":217,"stem":218},"\u002Fplugins\u002Fcollaboration\u002Fcollaboration","3.plugins\u002F6.collaboration\u002F1.collaboration",{"title":220,"path":221,"stem":222},"Comments","\u002Fplugins\u002Fcollaboration\u002Fcomments","3.plugins\u002F6.collaboration\u002F2.comments",{"title":224,"path":225,"stem":226},"Mentions","\u002Fplugins\u002Fcollaboration\u002Fmentions","3.plugins\u002F6.collaboration\u002F3.mentions",{"title":228,"path":229,"stem":230},"Track Changes","\u002Fplugins\u002Fcollaboration\u002Ftrack-changes","3.plugins\u002F6.collaboration\u002F4.track-changes",{"title":232,"path":233,"stem":234},"History","\u002Fplugins\u002Fcollaboration\u002Fhistory","3.plugins\u002F6.collaboration\u002F5.history",{"title":236,"icon":237,"path":238,"stem":239,"children":240,"page":26},"Tools","i-lucide-wrench","\u002Fplugins\u002Ftools","3.plugins\u002F7.tools",[241,245,249,253,257,261],{"title":242,"path":243,"stem":244},"Export","\u002Fplugins\u002Ftools\u002Fexport","3.plugins\u002F7.tools\u002F1.export",{"title":246,"path":247,"stem":248},"Shortcuts","\u002Fplugins\u002Ftools\u002Fshortcuts","3.plugins\u002F7.tools\u002F2.shortcuts",{"title":250,"path":251,"stem":252},"Responsive","\u002Fplugins\u002Ftools\u002Fresponsive","3.plugins\u002F7.tools\u002F3.responsive",{"title":254,"path":255,"stem":256},"Language","\u002Fplugins\u002Ftools\u002Flanguage","3.plugins\u002F7.tools\u002F4.language",{"title":258,"path":259,"stem":260},"Spell Checker","\u002Fplugins\u002Ftools\u002Fspell-checker","3.plugins\u002F7.tools\u002F5.spell-checker",{"title":262,"path":263,"stem":264},"AI Assistant","\u002Fplugins\u002Ftools\u002Fai-assistant","3.plugins\u002F7.tools\u002F6.ai-assistant",{"title":266,"icon":267,"path":268,"stem":269,"children":270,"page":26},"Integrate","i-lucide-plug","\u002Fintegrate","4.integrate",[271,275,305,359,385,423,445,471,493,523,569],{"title":272,"path":273,"stem":274},"Integrate overview","\u002Fintegrate\u002Foverview","4.integrate\u002F01.overview",{"title":276,"icon":277,"path":278,"stem":279,"children":280,"page":26},"Basics","i-lucide-book-open","\u002Fintegrate\u002Fbasics","4.integrate\u002F02.basics",[281,285,289,293,297,301],{"title":282,"path":283,"stem":284},"Persistence","\u002Fintegrate\u002Fbasics\u002Fpersistence","4.integrate\u002F02.basics\u002F1.persistence",{"title":286,"path":287,"stem":288},"Host config","\u002Fintegrate\u002Fbasics\u002Fhost-config","4.integrate\u002F02.basics\u002F2.host-config",{"title":290,"path":291,"stem":292},"Server + Vite","\u002Fintegrate\u002Fbasics\u002Fserver-vite","4.integrate\u002F02.basics\u002F3.server-vite",{"title":294,"path":295,"stem":296},"Meta-frameworks (SSR \u002F CSR)","\u002Fintegrate\u002Fbasics\u002Fmeta-ssr","4.integrate\u002F02.basics\u002F4.meta-ssr",{"title":298,"path":299,"stem":300},"Native \u002F iframe bridge","\u002Fintegrate\u002Fbasics\u002Fnative-bridge","4.integrate\u002F02.basics\u002F5.native-bridge",{"title":302,"path":303,"stem":304},"Chrome & host","\u002Fintegrate\u002Fbasics\u002Fchrome-and-host","4.integrate\u002F02.basics\u002F6.chrome-and-host",{"title":306,"icon":307,"path":308,"stem":309,"children":310,"page":26},"Frontend","i-lucide-monitor","\u002Fintegrate\u002Ffrontend","4.integrate\u002F03.frontend",[311,315,319,323,327,331,335,339,343,347,351,355],{"title":312,"path":313,"stem":314},"React","\u002Fintegrate\u002Ffrontend\u002Freact","4.integrate\u002F03.frontend\u002F01.react",{"title":316,"path":317,"stem":318},"Vue 2","\u002Fintegrate\u002Ffrontend\u002Fvue2","4.integrate\u002F03.frontend\u002F02.vue2",{"title":320,"path":321,"stem":322},"Vue 3","\u002Fintegrate\u002Ffrontend\u002Fvue3","4.integrate\u002F03.frontend\u002F03.vue3",{"title":324,"path":325,"stem":326},"Angular","\u002Fintegrate\u002Ffrontend\u002Fangular","4.integrate\u002F03.frontend\u002F04.angular",{"title":328,"path":329,"stem":330},"Svelte","\u002Fintegrate\u002Ffrontend\u002Fsvelte","4.integrate\u002F03.frontend\u002F05.svelte",{"title":332,"path":333,"stem":334},"Solid.js","\u002Fintegrate\u002Ffrontend\u002Fsolid","4.integrate\u002F03.frontend\u002F06.solid",{"title":336,"path":337,"stem":338},"Preact","\u002Fintegrate\u002Ffrontend\u002Fpreact","4.integrate\u002F03.frontend\u002F07.preact",{"title":340,"path":341,"stem":342},"Lit","\u002Fintegrate\u002Ffrontend\u002Flit","4.integrate\u002F03.frontend\u002F08.lit",{"title":344,"path":345,"stem":346},"Qwik","\u002Fintegrate\u002Ffrontend\u002Fqwik","4.integrate\u002F03.frontend\u002F09.qwik",{"title":348,"path":349,"stem":350},"jQuery","\u002Fintegrate\u002Ffrontend\u002Fjquery","4.integrate\u002F03.frontend\u002F10.jquery",{"title":352,"path":353,"stem":354},"Alpine.js","\u002Fintegrate\u002Ffrontend\u002Falpine","4.integrate\u002F03.frontend\u002F11.alpine",{"title":356,"path":357,"stem":358},"Backbone.js","\u002Fintegrate\u002Ffrontend\u002Fbackbone","4.integrate\u002F03.frontend\u002F12.backbone",{"title":360,"icon":361,"path":362,"stem":363,"children":364,"page":26},"Meta-frameworks","i-lucide-layers","\u002Fintegrate\u002Fmeta-frameworks","4.integrate\u002F04.meta-frameworks",[365,369,373,377,381],{"title":366,"path":367,"stem":368},"Next.js","\u002Fintegrate\u002Fmeta-frameworks\u002Fnext","4.integrate\u002F04.meta-frameworks\u002F1.next",{"title":370,"path":371,"stem":372},"Nuxt 3 \u002F 4","\u002Fintegrate\u002Fmeta-frameworks\u002Fnuxt","4.integrate\u002F04.meta-frameworks\u002F2.nuxt",{"title":374,"path":375,"stem":376},"SvelteKit","\u002Fintegrate\u002Fmeta-frameworks\u002Fsveltekit","4.integrate\u002F04.meta-frameworks\u002F3.sveltekit",{"title":378,"path":379,"stem":380},"Remix","\u002Fintegrate\u002Fmeta-frameworks\u002Fremix","4.integrate\u002F04.meta-frameworks\u002F4.remix",{"title":382,"path":383,"stem":384},"Astro","\u002Fintegrate\u002Fmeta-frameworks\u002Fastro","4.integrate\u002F04.meta-frameworks\u002F5.astro",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":26},"Node \u002F edge","i-simple-icons-nodedotjs","\u002Fintegrate\u002Fnode","4.integrate\u002F05.node",[391,395,399,403,407,411,415,419],{"title":392,"path":393,"stem":394},"Express.js","\u002Fintegrate\u002Fnode\u002Fexpress","4.integrate\u002F05.node\u002F1.express",{"title":396,"path":397,"stem":398},"NestJS","\u002Fintegrate\u002Fnode\u002Fnestjs","4.integrate\u002F05.node\u002F2.nestjs",{"title":400,"path":401,"stem":402},"Fastify","\u002Fintegrate\u002Fnode\u002Ffastify","4.integrate\u002F05.node\u002F3.fastify",{"title":404,"path":405,"stem":406},"Hono","\u002Fintegrate\u002Fnode\u002Fhono","4.integrate\u002F05.node\u002F4.hono",{"title":408,"path":409,"stem":410},"Koa","\u002Fintegrate\u002Fnode\u002Fkoa","4.integrate\u002F05.node\u002F5.koa",{"title":412,"path":413,"stem":414},"Bun","\u002Fintegrate\u002Fnode\u002Fbun","4.integrate\u002F05.node\u002F6.bun",{"title":416,"path":417,"stem":418},"Deno","\u002Fintegrate\u002Fnode\u002Fdeno","4.integrate\u002F05.node\u002F7.deno",{"title":420,"path":421,"stem":422},"AdonisJS","\u002Fintegrate\u002Fnode\u002Fadonis","4.integrate\u002F05.node\u002F8.adonis",{"title":424,"icon":425,"path":426,"stem":427,"children":428,"page":26},"Python","i-simple-icons-python","\u002Fintegrate\u002Fpython","4.integrate\u002F06.python",[429,433,437,441],{"title":430,"path":431,"stem":432},"FastAPI","\u002Fintegrate\u002Fpython\u002Ffastapi","4.integrate\u002F06.python\u002F1.fastapi",{"title":434,"path":435,"stem":436},"Django","\u002Fintegrate\u002Fpython\u002Fdjango","4.integrate\u002F06.python\u002F2.django",{"title":438,"path":439,"stem":440},"Python Flask","\u002Fintegrate\u002Fpython\u002Fpython-flask","4.integrate\u002F06.python\u002F3.python-flask",{"title":442,"path":443,"stem":444},"Litestar","\u002Fintegrate\u002Fpython\u002Flitestar","4.integrate\u002F06.python\u002F4.litestar",{"title":446,"icon":447,"path":448,"stem":449,"children":450,"page":26},"PHP","i-simple-icons-php","\u002Fintegrate\u002Fphp","4.integrate\u002F07.php",[451,455,459,463,467],{"title":452,"path":453,"stem":454},"Laravel","\u002Fintegrate\u002Fphp\u002Flaravel","4.integrate\u002F07.php\u002F1.laravel",{"title":456,"path":457,"stem":458},"Symfony","\u002Fintegrate\u002Fphp\u002Fsymfony","4.integrate\u002F07.php\u002F2.symfony",{"title":460,"path":461,"stem":462},"Slim","\u002Fintegrate\u002Fphp\u002Fslim","4.integrate\u002F07.php\u002F3.slim",{"title":464,"path":465,"stem":466},"CakePHP","\u002Fintegrate\u002Fphp\u002Fcakephp","4.integrate\u002F07.php\u002F4.cakephp",{"title":468,"path":469,"stem":470},"CodeIgniter","\u002Fintegrate\u002Fphp\u002Fcodeigniter","4.integrate\u002F07.php\u002F5.codeigniter",{"title":472,"icon":473,"path":474,"stem":475,"children":476,"page":26},"Go","i-simple-icons-go","\u002Fintegrate\u002Fgo","4.integrate\u002F08.go",[477,481,485,489],{"title":478,"path":479,"stem":480},"Go Gin","\u002Fintegrate\u002Fgo\u002Fgo-gin","4.integrate\u002F08.go\u002F1.go-gin",{"title":482,"path":483,"stem":484},"Go Echo","\u002Fintegrate\u002Fgo\u002Fgo-echo","4.integrate\u002F08.go\u002F2.go-echo",{"title":486,"path":487,"stem":488},"Go Fiber","\u002Fintegrate\u002Fgo\u002Fgo-fiber","4.integrate\u002F08.go\u002F3.go-fiber",{"title":490,"path":491,"stem":492},"Go Chi","\u002Fintegrate\u002Fgo\u002Fgo-chi","4.integrate\u002F08.go\u002F4.go-chi",{"title":494,"icon":495,"path":496,"stem":497,"children":498,"page":26},"Rust","i-simple-icons-rust","\u002Fintegrate\u002Frust","4.integrate\u002F09.rust",[499,503,507,511,515,519],{"title":500,"path":501,"stem":502},"Rust Axum","\u002Fintegrate\u002Frust\u002Frust-axum","4.integrate\u002F09.rust\u002F1.rust-axum",{"title":504,"path":505,"stem":506},"Rust Actix-web","\u002Fintegrate\u002Frust\u002Frust-actix","4.integrate\u002F09.rust\u002F2.rust-actix",{"title":508,"path":509,"stem":510},"Rust Rocket","\u002Fintegrate\u002Frust\u002Frust-rocket","4.integrate\u002F09.rust\u002F3.rust-rocket",{"title":512,"path":513,"stem":514},"Rust Warp","\u002Fintegrate\u002Frust\u002Frust-warp","4.integrate\u002F09.rust\u002F4.rust-warp",{"title":516,"path":517,"stem":518},"Rust Poem","\u002Fintegrate\u002Frust\u002Frust-poem","4.integrate\u002F09.rust\u002F5.rust-poem",{"title":520,"path":521,"stem":522},"Rust Loco","\u002Fintegrate\u002Frust\u002Frust-loco","4.integrate\u002F09.rust\u002F6.rust-loco",{"title":524,"icon":525,"path":526,"stem":527,"children":528,"page":26},"JVM \u002F .NET \u002F other","i-lucide-coffee","\u002Fintegrate\u002Fjvm-dotnet","4.integrate\u002F10.jvm-dotnet",[529,533,537,541,545,549,553,557,561,565],{"title":530,"path":531,"stem":532},"Spring Boot","\u002Fintegrate\u002Fjvm-dotnet\u002Fspring","4.integrate\u002F10.jvm-dotnet\u002F01.spring",{"title":534,"path":535,"stem":536},"Quarkus","\u002Fintegrate\u002Fjvm-dotnet\u002Fquarkus","4.integrate\u002F10.jvm-dotnet\u002F02.quarkus",{"title":538,"path":539,"stem":540},"Micronaut","\u002Fintegrate\u002Fjvm-dotnet\u002Fmicronaut","4.integrate\u002F10.jvm-dotnet\u002F03.micronaut",{"title":542,"path":543,"stem":544},"Kotlin Spring Boot","\u002Fintegrate\u002Fjvm-dotnet\u002Fkotlin-spring","4.integrate\u002F10.jvm-dotnet\u002F04.kotlin-spring",{"title":546,"path":547,"stem":548},"Ktor","\u002Fintegrate\u002Fjvm-dotnet\u002Fktor","4.integrate\u002F10.jvm-dotnet\u002F05.ktor",{"title":550,"path":551,"stem":552},"ASP.NET Core","\u002Fintegrate\u002Fjvm-dotnet\u002Faspnet-core","4.integrate\u002F10.jvm-dotnet\u002F06.aspnet-core",{"title":554,"path":555,"stem":556},"Blazor","\u002Fintegrate\u002Fjvm-dotnet\u002Fblazor","4.integrate\u002F10.jvm-dotnet\u002F07.blazor",{"title":558,"path":559,"stem":560},"Phoenix","\u002Fintegrate\u002Fjvm-dotnet\u002Fphoenix","4.integrate\u002F10.jvm-dotnet\u002F08.phoenix",{"title":562,"path":563,"stem":564},"Ruby on Rails","\u002Fintegrate\u002Fjvm-dotnet\u002Frails","4.integrate\u002F10.jvm-dotnet\u002F09.rails",{"title":566,"path":567,"stem":568},"HTMX host","\u002Fintegrate\u002Fjvm-dotnet\u002Fhtmx","4.integrate\u002F10.jvm-dotnet\u002F10.htmx",{"title":570,"icon":571,"path":572,"stem":573,"children":574,"page":26},"Desktop & mobile hosts","i-lucide-smartphone","\u002Fintegrate\u002Fhosts","4.integrate\u002F11.hosts",[575,579,583,587,591],{"title":576,"path":577,"stem":578},"Flutter","\u002Fintegrate\u002Fhosts\u002Fflutter","4.integrate\u002F11.hosts\u002F1.flutter",{"title":580,"path":581,"stem":582},"Electron","\u002Fintegrate\u002Fhosts\u002Felectron","4.integrate\u002F11.hosts\u002F2.electron",{"title":584,"path":585,"stem":586},"Tauri","\u002Fintegrate\u002Fhosts\u002Ftauri","4.integrate\u002F11.hosts\u002F3.tauri",{"title":588,"path":589,"stem":590},"Wails","\u002Fintegrate\u002Fhosts\u002Fwails","4.integrate\u002F11.hosts\u002F4.wails",{"title":592,"path":593,"stem":594},"Capacitor","\u002Fintegrate\u002Fhosts\u002Fcapacitor","4.integrate\u002F11.hosts\u002F5.capacitor",{"title":596,"icon":597,"path":598,"stem":599,"children":600,"page":26},"Architecture","i-lucide-cpu","\u002Farchitecture","5.architecture",[601,605,609,613,617,621],{"title":602,"path":603,"stem":604},"Document model","\u002Farchitecture\u002Fdocument-model","5.architecture\u002F1.document-model",{"title":606,"path":607,"stem":608},"SDK reference","\u002Farchitecture\u002Fsdk","5.architecture\u002F2.sdk",{"title":610,"path":611,"stem":612},"View runtime","\u002Farchitecture\u002Fview","5.architecture\u002F3.view",{"title":614,"path":615,"stem":616},"Authoring plugins","\u002Farchitecture\u002Fauthoring-plugins","5.architecture\u002F4.authoring-plugins",{"title":618,"path":619,"stem":620},"Mermaid","\u002Farchitecture\u002Fmermaid","5.architecture\u002F5.mermaid",{"title":622,"path":623,"stem":624},"Publishing packages","\u002Farchitecture\u002Fpublishing-packages","5.architecture\u002F6.publishing-packages",{"title":626,"path":627,"stem":628},"Changelog","\u002Fchangelog","9.changelog",{"id":630,"title":626,"body":631,"description":3296,"extension":3297,"links":3298,"meta":3299,"navigation":3300,"path":627,"seo":3301,"stem":628,"__hash__":3302},"docs\u002F9.changelog.md",{"type":632,"value":633,"toc":3147},"minimark",[634,638,655,663,670,681,686,726,730,754,758,763,769,777,780,825,828,848,854,860,864,903,906,925,928,956,959,998,1005,1008,1031,1034,1043,1050,1053,1076,1079,1088,1095,1098,1133,1136,1147,1153,1156,1177,1183,1186,1198,1201,1213,1216,1228,1234,1237,1307,1310,1332,1335,1340,1347,1350,1367,1370,1450,1453,1474,1480,1483,1498,1504,1507,1661,1664,1700,1703,1769,1772,1819,1823,1843,1850,1853,2016,2019,2044,2047,2087,2093,2096,2156,2159,2171,2174,2195,2202,2205,2285,2288,2313,2316,2328,2335,2338,2362,2368,2371,2405,2411,2414,2516,2519,2552,2556,2571,2578,2581,2590,2597,2600,2608,2614,2617,2628,2631,2638,2644,2647,2652,2658,2661,2686,2689,2709,2715,2723,2726,2844,2847,2907,2910,2963,2966,3020,3026,3033,3040,3043,3057,3060,3068,3074,3077,3082,3085,3090,3096,3099,3102,3106,3109,3113],[635,636,637],"p",{},"All notable changes to this project will be documented in this file.",[635,639,640,641,648,649,654],{},"The format is based on ",[642,643,647],"a",{"href":644,"rel":645},"https:\u002F\u002Fkeepachangelog.com\u002Fen\u002F1.0.0\u002F",[646],"nofollow","Keep a Changelog",",\nand this project adheres to ",[642,650,653],{"href":651,"rel":652},"https:\u002F\u002Fsemver.org\u002Fspec\u002Fv2.0.0.html",[646],"Semantic Versioning",".",[656,657,659],"h2",{"id":658},"unreleased",[660,661,662],"span",{},"Unreleased",[656,664,666,669],{"id":665},"_292-2026-11-08",[660,667,668],{},"2.9.2"," - 2026-11-08",[635,671,672,676,677,680],{},[673,674,675],"code",{},"on-codemerge"," 2.9.2 and ",[673,678,679],{},"@codemerge\u002Fsdk"," 2.9.1; the other packages are unchanged.",[682,683,685],"h3",{"id":684},"fixed","Fixed",[687,688,689,705,720],"ul",{},[690,691,692,693,696,697,700,701,704],"li",{},"Dark theme gaps: Markdown preview text (",[673,694,695],{},"prose-invert","), info \u002F warn \u002F error callouts, chart images and mermaid diagrams (baked light palette), track-changes and mention marks, ",[673,698,699],{},"\u003Cmark>",", danger buttons in Charts \u002F Calendar, plus FormBuilder, Language, Responsive, Templates, File upload, Image and Collaboration panels that used fixed gray \u002F blue classes instead of ",[673,702,703],{},"ocm-*"," tokens",[690,706,707,708,711,712,715,716,719],{},"Tailwind ",[673,709,710],{},"dark:"," variants follow the host ",[673,713,714],{},"html.dark"," (",[673,717,718],{},"@custom-variant","), not the OS setting",[690,721,722,723,725],{},"Chart previews, chart widgets and mermaid diagrams repaint when the host flips ",[673,724,714],{},"; published HTML keeps the light chart",[682,727,729],{"id":728},"added","Added",[687,731,732,744],{},[690,733,734,736,737,740,741],{},[673,735,679],{},": ",[673,738,739],{},"isDarkHost()"," and ",[673,742,743],{},"onColorSchemeChange(cb)",[690,745,746,749,750,753],{},[673,747,748],{},"demo\u002F",": dark theme and ",[673,751,752],{},"pnpm screenshots"," (light + dark README images from the real stand)",[682,755,757],{"id":756},"changed","Changed",[687,759,760],{},[690,761,762],{},"README rewritten: all eight editors, light\u002Fdark screenshots, packages, develop flow",[656,764,766,669],{"id":765},"_291-2026-11-08",[660,767,768],{},"2.9.1",[635,770,771,740,773,776],{},[673,772,675],{},[673,774,775],{},"@codemerge\u002Fintegrate"," 2.9.1; the other packages stay 2.9.0 \u002F 3.0.0.",[682,778,685],{"id":779},"fixed-1",[687,781,782,800,813,822],{},[690,783,784,787,788,791,792,795,796,799],{},[673,785,786],{},"on-codemerge\u002Fplugins"," types: ",[673,789,790],{},"dist\u002Fapps\u002Fwysiwyg\u002Fsrc\u002Fplugins.d.ts"," re-exported itself (",[673,793,794],{},"Circular definition of import alias"," with ",[673,797,798],{},"skipLibCheck: false",")",[690,801,802,736,805,808,809,812],{},[673,803,804],{},"@codemerge\u002Fintegrate\u002Fjquery",[673,806,807],{},"registerJQueryPlugin($)"," accepts a real ",[673,810,811],{},"JQueryStatic"," without a cast",[690,814,815,818,819],{},[673,816,817],{},"@i18n-micro\u002Fruntime"," ^2.1.0: its declarations resolve under ",[673,820,821],{},"moduleResolution: nodenext",[690,823,824],{},"Docs: sidebar no longer stacks above the page on the built site; long words wrap on phones",[682,826,757],{"id":827},"changed-1",[687,829,830,839],{},[690,831,832,835,836,838],{},[673,833,834],{},"check:pack"," also type-checks a consumer project that imports every typed entrypoint of the unpacked tarballs (",[673,837,798],{},", nodenext + bundler)",[690,840,841,843,844,847],{},[673,842,748],{},": real Vite tsconfig and a ",[673,845,846],{},"typecheck"," script",[656,849,851,669],{"id":850},"_290-2026-11-08",[660,852,853],{},"2.9.0",[635,855,856,859],{},[673,857,858],{},"@codemerge\u002Fcollaboration-server"," 3.0.0 (breaking, see below); everything else 2.9.0.",[682,861,863],{"id":862},"breaking","Breaking",[687,865,866,877,888],{},[690,867,868,869,872,873,876],{},"collaboration-server: REST reads the token only from ",[673,870,871],{},"Authorization: Bearer","; ",[673,874,875],{},"?token="," is ignored",[690,878,879,880,883,884,887],{},"collaboration-server: the ",[673,881,882],{},"comment"," role can no longer submit document ops (",[673,885,886],{},"reject readonly",", REST 403)",[690,889,890,893,894,896,897,896,900],{},[673,891,892],{},"@ocm\u002Fwysiwyg\u002Futils\u002F*"," deep imports removed — use ",[673,895,679],{}," \u002F ",[673,898,899],{},"@codemerge\u002Fview",[673,901,902],{},"@codemerge\u002Fkernel",[682,904,729],{"id":905},"added-1",[687,907,908,915],{},[690,909,910,911,914],{},"Collaboration: client-side OT rebase of offline edits on reconnect (",[673,912,913],{},"join { sinceVersion, clientId }",", duplicate-submit guard)",[690,916,917,918,921,922],{},"Hotkeys: Footnotes ",[673,919,920],{},"Mod-Alt-x",", Templates ",[673,923,924],{},"Mod-Alt-s",[682,926,757],{"id":927},"changed-2",[687,929,930,937,940,943,950],{},[690,931,932,933,936],{},"Markdown \"clear styles\" (",[673,934,935],{},"stripInlineMarkdown",") rewritten as a CommonMark block + inline parser (verified on all 652 spec examples and ~10^6 fuzzed documents against commonmark.js)",[690,938,939],{},"Table sort\u002Ffilter renders merged cells unmerged while active",[690,941,942],{},"AI Assistant drivers use chat completions",[690,944,945,946,949],{},"Docs site moved from VitePress to Nuxt + Nuxt Content + Nuxt UI: new sections (Getting started, Editors, Plugins by group, Integrate by stack, Architecture, Changelog), search, live demos kept; old ",[673,947,948],{},"\u002Fguide\u002F*"," URLs changed",[690,951,952,953,955],{},"Release gate: new ",[673,954,834],{}," packs every package and runs attw on the tarball",[682,957,685],{"id":958},"fixed-2",[687,960,961,995],{},[690,962,963,964,967,968,971,972,975,976,978,979,982,983,986,987,990,991,994],{},"Package types resolve under ",[673,965,966],{},"moduleResolution: node16\u002Fnodenext",": relative imports in ",[673,969,970],{},".d.ts"," carry ",[673,973,974],{},".js",", every ",[673,977,970],{}," has a ",[673,980,981],{},".d.cts"," twin, ",[673,984,985],{},"@codemerge\u002Fsdk\u002Ficons"," declares icons as ",[673,988,989],{},"string"," instead of re-exporting unshipped ",[673,992,993],{},".svg"," files",[690,996,997],{},"Full audit pass: listener\u002Fdisposer leaks (toolbar, popups, code workspace), WS payload limit, Escape no longer swallowed when nothing is dragged, PDF embed handler result, assorted plugin edge cases",[656,999,1001,1004],{"id":1000},"_280-2026-10-07",[660,1002,1003],{},"2.8.0"," - 2026-10-07",[682,1006,729],{"id":1007},"added-2",[687,1009,1010,1028],{},[690,1011,1012,1013,1015,1016,1019,1020,1023,1024,1027],{},"First publish of ",[673,1014,775],{},": host adapters (React\u002FVue\u002FVue2\u002FSvelte\u002FjQuery\u002FAlpine), ",[673,1017,1018],{},"\u003Cocm-editor>",", ",[673,1021,1022],{},"\u002Fmount"," aliases, persistence + native ",[673,1025,1026],{},"postMessage"," bridge, Next\u002FNuxt\u002FSvelteKit helpers",[690,1029,1030],{},"Integrate docs family guides: host config, persistence, server+Vite, meta SSR, native bridge",[682,1032,757],{"id":1033},"changed-3",[687,1035,1036],{},[690,1037,1038,1039,1042],{},"Integrate package surface flattened (no scaffold CLI); docs examples match real exports and ",[673,1040,1041],{},"ready","\u002FCSS side-effect rules",[656,1044,1046,1049],{"id":1045},"_274-2026-10-06",[660,1047,1048],{},"2.7.4"," - 2026-10-06",[682,1051,757],{"id":1052},"changed-4",[687,1054,1055,1069],{},[690,1056,1057,1058,1061,1062,1065,1066,799],{},"ViewSpec ",[673,1059,1060],{},"mount.update"," patches keyed nodes instead of wiping the tree; CE atom hosts stay alive across sibling edits; table cells reuse DOM (",[673,1063,1064],{},"rowId","\u002F",[673,1067,1068],{},"colId",[690,1070,1071,1072,1075],{},"Shared SDK helpers: frame scheduler, window-drag AbortSignal, embed session store, ",[673,1073,1074],{},"isEditingInside",", one embed workspace host",[682,1077,685],{"id":1078},"fixed-3",[687,1080,1081],{},[690,1082,1083,1084,1087],{},"Editor host ",[673,1085,1086],{},"keydown"," is unbound on destroy; table column-resize listeners abort with the grid; Json tree no longer polls the context menu",[656,1089,1091,1094],{"id":1090},"_273-2026-10-05",[660,1092,1093],{},"2.7.3"," - 2026-10-05",[682,1096,729],{"id":1097},"added-3",[687,1099,1100,1123],{},[690,1101,1102,1103,1106,1107,872,1110,896,1113,715,1116,896,1119,1122],{},"Tables cell edit: multiline textarea (",[673,1104,1105],{},"Shift+Enter"," newline); HTML\u002FGFM emit ",[673,1108,1109],{},"\u003Cbr>",[673,1111,1112],{},"getMarkdown",[673,1114,1115],{},"setMarkdown",[673,1117,1118],{},"getMd",[673,1120,1121],{},"setMd",") on the tables editor",[690,1124,1125,1126,1129,1130,1132],{},"Sheet rows grow with wrapped cell lines; HTML preview cells are ",[673,1127,1128],{},"min-height"," so ",[673,1131,1109],{}," is not clipped",[682,1134,685],{"id":1135},"fixed-4",[687,1137,1138,1141,1144],{},[690,1139,1140],{},"Docs tables host: bottom-right resize grip (native SE ticks, translucent)",[690,1142,1143],{},"Cell click starts edit and focuses the field (dark theme uses accent\u002Finput tokens, not sky-50)",[690,1145,1146],{},"Enter commits and opens the next row for typing; quoted TSV paste keeps newlines inside a cell",[656,1148,1150,1094],{"id":1149},"_272-2026-10-05",[660,1151,1152],{},"2.7.2",[682,1154,685],{"id":1155},"fixed-5",[687,1157,1158,1161,1174],{},[690,1159,1160],{},"Stretch fit no longer overflows horizontally (account for row-index + add-column gutters)",[690,1162,1163,1164,896,1167,896,1170,1173],{},"Sheet HTML themes (",[673,1165,1166],{},"table-modern",[673,1168,1169],{},"bordered",[673,1171,1172],{},"striped",") match the grid look in published CSS + docs preview",[690,1175,1176],{},"Large tables: sheet extent no longer capped below SoT row count (bottom rows were unreachable)",[656,1178,1180,1094],{"id":1179},"_271-2026-10-05",[660,1181,1182],{},"2.7.1",[682,1184,729],{"id":1185},"added-4",[687,1187,1188],{},[690,1189,1190,1191,715,1195,799],{},"Demo stand mode for ",[1192,1193,1194],"strong",{},"Tables",[673,1196,1197],{},"on-codemerge\u002Ftables",[682,1199,757],{"id":1200},"changed-5",[687,1202,1203],{},[690,1204,1205,1206,715,1209,1212],{},"Repo tooling docs: install, scripts, and publish are ",[1192,1207,1208],{},"pnpm-only",[673,1210,1211],{},"pnpm run release"," does not bump versions)",[682,1214,685],{"id":1215},"fixed-6",[687,1217,1218,1225],{},[690,1219,1220,1221,1224],{},"Tables HTML preview follows ",[673,1222,1223],{},"view.fit",": Stretch fills host width, Fixed keeps stored column widths; toolbar + status chip to switch",[690,1226,1227],{},"Tables workspace sheet stays in a bounded host (internal scroll); docs demo can be resized vertically",[656,1229,1231,1094],{"id":1230},"_270-2026-10-05",[660,1232,1233],{},"2.7.0",[682,1235,729],{"id":1236},"added-5",[687,1238,1239,1256,1275],{},[690,1240,1241,1243,1244,1247,1248,1251,1252,1255],{},[1192,1242,57],{}," sparse Excel-like sheet (",[673,1245,1246],{},"TableGridDoc"," v2): used SoT only, ",[673,1249,1250],{},"getHTML()",", rename column headers, add columns on demand (",[673,1253,1254],{},"+"," \u002F toolbar \u002F paste)",[690,1257,1258,1259,1262,1263,1266,1267,1270,1271,1274],{},"WYSIWYG ",[1192,1260,1261],{},"Insert Table"," mounts the same ",[673,1264,1265],{},"tableGrid"," sheet as a sized, scrollable, resizable prose atom (",[673,1268,1269],{},"Resizer","); HTML\u002FMarkdown interchange as ",[673,1272,1273],{},"\u003Ctable>"," \u002F GFM",[690,1276,1277,1278,1280,1281,1019,1284,1287,1288,715,1290,1293,1294,1297,1298,896,1301,1304,1305],{},"Shared platform helpers on ",[673,1279,679],{}," (icons, ColorWell, Resizer, ",[673,1282,1283],{},"safeHtml",[673,1285,1286],{},"atomPath",") and ",[673,1289,899],{},[673,1291,1292],{},"asAttr",", clipboard, ",[673,1295,1296],{},"domHtml","); ",[673,1299,1300],{},"ParseError",[673,1302,1303],{},"parseJsonPayload"," on ",[673,1306,902],{},[682,1308,757],{"id":1309},"changed-6",[687,1311,1312,1319],{},[690,1313,1314,1315,1318],{},"TablePlugin store is a thin cache: mutations in ",[673,1316,1317],{},"grid\u002Fops.ts",", viewport window in the view, no ghost columns on the right",[690,1320,1321,1322,896,1324,896,1326,1328,1329,799],{},"Plugins import platform from ",[673,1323,679],{},[673,1325,902],{},[673,1327,899],{}," (not ",[673,1330,1331],{},"@ocm\u002Fwysiwyg\u002Futils",[682,1333,685],{"id":1334},"fixed-7",[687,1336,1337],{},[690,1338,1339],{},"Sheet viewport still paints while a cell is being edited, so scroll\u002Fresize cannot hide columns behind the row-index gutter",[656,1341,1343,1346],{"id":1342},"_260-2026-10-03",[660,1344,1345],{},"2.6.0"," - 2026-10-03",[682,1348,685],{"id":1349},"fixed-8",[687,1351,1352],{},[690,1353,1354,1355,1358,1359,1362,1363,1366],{},"Publish packaging: drop broken ",[673,1356,1357],{},"package.json"," ",[673,1360,1361],{},"imports"," (pointed at missing ",[673,1364,1365],{},".ts"," sources)",[682,1368,757],{"id":1369},"changed-7",[687,1371,1372,1387,1418],{},[690,1373,1374,1375,1378,1379,1382,1383,1386],{},"Plugins are private workspace packages (",[673,1376,1377],{},"plugins\u002F*"," → ",[673,1380,1381],{},"@ocm\u002F*-plugin",", source exports like ",[673,1384,1385],{},"@codemerge\u002Feditor","; not published)",[690,1388,1389,1390,1393,1394,1378,1397,1400,1401,896,1404,1407,1408,1411,1412,896,1415],{},"Library CSS: virtual ",[673,1391,1392],{},"virtual:ocm-package-index.css"," auto-collects each plugin ",[673,1395,1396],{},"exports[\".\u002Fstyle.scss\"]",[673,1398,1399],{},"dist\u002Findex.css"," (+ ",[673,1402,1403],{},"public.css",[673,1405,1406],{},"tailwind.css","); JS entries do not side-effect-import styles. ",[673,1409,1410],{},"@codemerge\u002Fmermaid"," types stay external via dts ",[673,1413,1414],{},"exclude",[673,1416,1417],{},"aliasesExclude",[690,1419,1420,1421,1423,1424,1427,1428,1358,1431,896,1433,1378,1436,896,1439,1442,1443,872,1446,1449],{},"Internal TS imports use ",[673,1422,1381],{},"; barrel ",[673,1425,1426],{},"@ocm\u002Fplugins","; plugin ",[673,1429,1430],{},"exports",[673,1432,654],{},[673,1434,1435],{},".\u002F*",[673,1437,1438],{},".\u002F*.ts",[673,1440,1441],{},".\u002Fstyle.scss","; Vite aliases from ",[673,1444,1445],{},"plugins\u002F*\u002Fpackage.json",[673,1447,1448],{},"sideEffects"," trimmed to real assets",[682,1451,863],{"id":1452},"breaking-1",[687,1454,1455],{},[690,1456,1457,1458,740,1461,1464,1465,1400,1468,1287,1470,1473],{},"Removed ",[673,1459,1460],{},"on-codemerge\u002Fplugins\u002F*\u002Fstyle.css",[673,1462,1463],{},"on-codemerge\u002Fsdk.css"," — use ",[673,1466,1467],{},"on-codemerge\u002Findex.css",[673,1469,1403],{},[673,1471,1472],{},"@codemerge\u002Fsdk\u002Fsdk.css"," when needed",[656,1475,1477,1346],{"id":1476},"_251-2026-10-03",[660,1478,1479],{},"2.5.1",[682,1481,685],{"id":1482},"fixed-9",[687,1484,1485],{},[690,1486,1487,1490,1491,896,1494,1497],{},[673,1488,1489],{},"Editor.destroy()"," clears host chrome tokens it applied (",[673,1492,1493],{},"applyHostChrome",[673,1495,1496],{},"clearHostChrome","), so remounting on the same host (e.g. page → bar) no longer leaks page chrome layout",[656,1499,1501,1346],{"id":1500},"_250-2026-10-03",[660,1502,1503],{},"2.5.0",[682,1505,729],{"id":1506},"added-6",[687,1508,1509,1522,1536,1557,1564,1574,1580,1601,1612,1619,1625,1636,1642,1654],{},[690,1510,1511,1513,1514,1517,1518,1521],{},[1192,1512,53],{}," surface: ",[673,1515,1516],{},"apps\u002Fcalendar"," → public entry ",[673,1519,1520],{},"on-codemerge\u002Fcalendar"," (+ docs Guide \u002F live preview)",[690,1523,1524,896,1526,1528,1529,1019,1532,1535],{},[1192,1525,45],{},[1192,1527,49],{}," surfaces: ",[673,1530,1531],{},"on-codemerge\u002Fforms",[673,1533,1534],{},"on-codemerge\u002Fcharts"," (+ docs Guide \u002F live previews)",[690,1537,1538,1542,1543,896,1546,1549,1550,1553,1554],{},[1192,1539,1540],{},[673,1541,899],{}," — zero-dep ViewSpec DOM runtime (",[673,1544,1545],{},"h",[673,1547,1548],{},"mount"," \u002F portal \u002F ",[673,1551,1552],{},"DisposableScope","); also ",[673,1555,1556],{},"on-codemerge\u002Fview",[690,1558,1559,1560,1563],{},"Opt-in Editor ",[673,1561,1562],{},"diagnostics.onMeasure"," for dispatch \u002F view.update \u002F toolbar.refresh timings",[690,1565,1566,1570,1571],{},[1192,1567,1568],{},[673,1569,1410],{}," — sync Mermaid-subset SVG renderer (8 types, typed IR, no CDN fonts); hydrate bundled in ",[673,1572,1573],{},"public.js",[690,1575,1576,1577,1579],{},"Opt-in plugin surface ",[673,1578,786],{}," (individual constructors)",[690,1581,1582,1583,1586,1587,1019,1590,1019,1593,1596,1597,1600],{},"SDK ",[1192,1584,1585],{},"studio layout"," helpers: ",[673,1588,1589],{},"studioPaneTabs",[673,1591,1592],{},"syncStudioPanel",[673,1594,1595],{},"STUDIO_POPUP_CLASS",", shared ",[673,1598,1599],{},"ocm-studio*"," chrome (mobile pane tabs)",[690,1602,1603,1604,1607,1608,1611],{},"Calendar \u002F FormBuilder \u002F Charts dual-surface (",[673,1605,1606],{},"atom"," + ",[673,1609,1610],{},"workspace",") with shared studio UI, drivers, IO adapters, default toolbars",[690,1613,1614,1615,1618],{},"Thin ICS import\u002Fexport for Calendar (JSON ",[673,1616,1617],{},"CalendarDoc"," remains SoT)",[690,1620,1621,1624],{},[673,1622,1623],{},"ConstrainedEditor"," facade for surface apps (fixed root node type)",[690,1626,1627,1628,896,1630,1632,1633],{},"Shared ",[673,1629,1300],{},[673,1631,1303],{}," in ",[673,1634,1635],{},"@ocm\u002Fwysiwyg\u002Futils\u002FparseSoT",[690,1637,1638,1639,1641],{},"History undo\u002Fredo toolbar seeded from ",[673,1640,1385],{}," (kernel history)",[690,1643,1644,896,1647,1650,1651],{},[673,1645,1646],{},"check:calendar-export",[673,1648,1649],{},"check:calendar-types"," gates in ",[673,1652,1653],{},"prepublishOnly",[690,1655,1656,1657,1660],{},"Per-plugin locale packs wired via ",[673,1658,1659],{},"wirePluginLocales"," for many plugins",[682,1662,757],{"id":1663},"changed-8",[687,1665,1666,1669,1672,1675,1681,1688],{},[690,1667,1668],{},"Calendar \u002F Charts \u002F FormBuilder rewritten around payload SoT + driver registries (legacy managers\u002Frenderers removed)",[690,1670,1671],{},"History \u002F Forms \u002F Charts \u002F Calendar popups use shared studio popup class + responsive pane tabs",[690,1673,1674],{},"Empty default toolbars are no longer applied (avoids blank chrome)",[690,1676,1677,1680],{},[673,1678,1679],{},"createCorePlugins"," builds an explicit lean list (no construct-all-then-filter)",[690,1682,1683,1684,1687],{},"Calendar ICS\u002FJSON import enforces ",[673,1685,1686],{},"MAX_CALENDAR_BYTES"," (2MB)",[690,1689,1690,1691,1693,1694,1697,1698,799],{},"Root ",[673,1692,675],{}," entry no longer re-exports every plugin constructor (use ",[673,1695,1696],{},"createDefaultPlugins"," or ",[673,1699,786],{},[682,1701,863],{"id":1702},"breaking-2",[687,1704,1705,1714,1728,1740,1746,1761],{},[690,1706,1707,1708,896,1711],{},"History chrome is always on via editor seed — there is no ",[673,1709,1710],{},"features.historyChrome",[673,1712,1713],{},"HistoryChromePlugin",[690,1715,1716,1717,1720,1721,1019,1724,1727],{},"Surface ",[673,1718,1719],{},"app.ts"," public APIs shrunk (Calendar\u002FCharts\u002FForms\u002FJson\u002FCode\u002FMarkdown): prefer Editor + plugin entry points; middleman barrels (",[673,1722,1723],{},"io\u002Findex",[673,1725,1726],{},"drivers\u002Findex",") removed",[690,1729,1730,1732,1733,1735,1736,1739],{},[673,1731,1300],{}," for surface text IO lives under ",[673,1734,1635],{}," (not re-exported from every plugin ",[673,1737,1738],{},"io"," barrel)",[690,1741,1742,1743],{},"Plugin constructors moved off the root entry → ",[673,1744,1745],{},"import { XPlugin } from 'on-codemerge\u002Fplugins'",[690,1747,1748,896,1751,1754,1755,1757,1758,799],{},[673,1749,1750],{},"mermaid",[673,1752,1753],{},"@crafter\u002Fmermaid"," runtime removed — diagrams render with ",[673,1756,1410],{}," (subset of types; unsupported → ",[673,1759,1760],{},"data-ocm-mermaid-error",[690,1762,1763,1766,1767,799],{},[673,1764,1765],{},"on-codemerge\u002Fpublic-mermaid.js"," removed (hydrate lives in ",[673,1768,1573],{},[682,1770,685],{"id":1771},"fixed-10",[687,1773,1774,1784,1791,1801],{},[690,1775,1776,1777,1780,1781,1783],{},"Docs Calendar preview: export ",[673,1778,1779],{},"coerceCalendarDoc"," from ",[673,1782,1516],{}," app entry",[690,1785,1786,1787,1790],{},"Studio desktop layout: avoid ",[673,1788,1789],{},"is-studio-hidden"," leak at ≥64rem",[690,1792,1793,1796,1797,1800],{},[673,1794,1795],{},"ensureNodeIds"," no longer writes ",[673,1798,1799],{},"attrs: undefined"," for empty attr bags",[690,1802,1690,1803,1806,1807,896,1810,896,1813,1816,1817],{},[673,1804,1805],{},"require"," types for ",[673,1808,1809],{},".\u002Fforms",[673,1811,1812],{},".\u002Fcharts",[673,1814,1815],{},".\u002Fcalendar"," emit ",[673,1818,981],{},[682,1820,1822],{"id":1821},"notes","Notes",[687,1824,1825,1831],{},[690,1826,1827,1828,1830],{},"Publish: ",[673,1829,1211],{}," (includes forms\u002Fcharts\u002Fcalendar lib build + export gates)",[690,1832,1833,1834,896,1837,896,1840],{},"Local SPAs: ",[673,1835,1836],{},"pnpm dev:forms",[673,1838,1839],{},"dev:charts",[673,1841,1842],{},"dev:calendar",[656,1844,1846,1849],{"id":1845},"_240-2026-09-30",[660,1847,1848],{},"2.4.0"," - 2026-09-30",[682,1851,729],{"id":1852},"added-7",[687,1854,1855,1897,1906,1912,1922,1938,1945,2005],{},[690,1856,1857,1858,1863,1864,1866,1867],{},"Published low-level packages under ",[1192,1859,1860],{},[673,1861,1862],{},"@codemerge\u002F*"," (product install unchanged: ",[673,1865,675],{},"):\n",[687,1868,1869,1874,1882,1892],{},[690,1870,1871,1873],{},[673,1872,902],{}," — headless doc \u002F ops \u002F selection",[690,1875,1876,1878,1879,799],{},[673,1877,679],{}," — plugin API + UI primitives (+ ",[673,1880,1881],{},"sdk.css",[690,1883,1884,1887,1888,1891],{},[673,1885,1886],{},"@codemerge\u002Fhunspell"," — spell engine (",[673,1889,1890],{},"NOTICE"," in tarball)",[690,1893,1894,1896],{},[673,1895,858],{}," — collaboration server (protocol v2)",[690,1898,1899,1900,1378,1903,1905],{},"Workspace rename: ",[673,1901,1902],{},"@on-codemerge\u002F*",[673,1904,1862],{}," (internal only)",[690,1907,1908,1911],{},[673,1909,1910],{},"pnpm run build:packages"," + release filter order for scoped packages",[690,1913,1914,1915,1918,1919],{},"pnpm ",[1192,1916,1917],{},"catalog"," for shared dependency versions; internal links use ",[673,1920,1921],{},"workspace:^",[690,1923,1924,1927,1928,1931,1932,896,1935,1937],{},[673,1925,1926],{},"publint --strict"," for every publishable package (",[673,1929,1930],{},"check"," → scoped; ",[673,1933,1934],{},"publint",[673,1936,1653],{}," → + root)",[690,1939,1940,1941,1944],{},"Published package builds: per-package ",[673,1942,1943],{},"vite build"," via pnpm workspace filters (no tsup \u002F orchestrator scripts)",[690,1946,1947,1950],{},[1192,1948,1949],{},"Collab stack rewrite (protocol v2)",[687,1951,1952,1971,1987],{},[690,1953,1954,1955,1019,1957,896,1960,1963,1964,1967,1968],{},"Kernel: ",[673,1956,1795],{},[673,1958,1959],{},"transformOp",[673,1961,1962],{},"rebaseOps","; editor ",[673,1965,1966],{},"transaction"," event + ",[673,1969,1970],{},"dispatch(tr, { source: 'remote' })",[690,1972,1973,1976,1977,896,1980,896,1983,1986],{},[673,1974,1975],{},"@codemerge\u002Fcollaboration-server@2.0.0",": TypeScript authoritative op-log, CLI (",[673,1978,1979],{},"serve",[673,1981,1982],{},"compact",[673,1984,1985],{},"inspect","), embed API, static+JWT auth, SQLite\u002Fmemory stores, Postgres adapter, Redis fanout, REST, webhooks, presence, comments, versions",[690,1988,1989,1992,1993,1996,1997,2000,2001,2004],{},[673,1990,1991],{},"CollaborationPlugin",": FSM client, reconnect, offline IndexedDB queue, presence avatars, toolbar sync chip (",[673,1994,1995],{},"align: end","), share URL = ",[673,1998,1999],{},"?docId="," only, ",[673,2002,2003],{},"getCollaborationHandle",", no dispatch monkey-patch",[690,2006,2007,2008,2011,2012,2015],{},"SDK toolbar: ",[673,2009,2010],{},"align: 'end'"," + custom ",[673,2013,2014],{},"view"," for trailing chrome (MD preview busy + collab status)",[682,2017,863],{"id":2018},"breaking-3",[687,2020,2021,2034],{},[690,2022,2023,2024,1065,2027,2030,2031,1727],{},"Demo collab protocol v1 (",[673,2025,2026],{},"join",[673,2028,2029],{},"ops"," + token on every message, ",[673,2032,2033],{},"server.js",[690,2035,2036,2037,2040,2041],{},"Default WS path is ",[673,2038,2039],{},"\u002Fcollab","; use ",[673,2042,2043],{},"CollaborationPlugin({ serverUrl: 'ws:\u002F\u002Fhost:8787\u002Fcollab', getToken })",[682,2045,1822],{"id":2046},"notes-1",[687,2048,2049,2067,2079,2082],{},[690,2050,2051,2053,2054,2057,2058,2061,2062,795,2064,2066],{},[673,2052,675],{}," still ",[1192,2055,2056],{},"bundles"," kernel\u002Fsdk\u002Fhunspell (Phase A). Do ",[1192,2059,2060],{},"not"," mix standalone ",[673,2063,679],{},[673,2065,675],{}," in one app bundle.",[690,2068,2069,740,2071,2074,2075,2078],{},[673,2070,1385],{},[673,2072,2073],{},"apps\u002F*"," remain ",[1192,2076,2077],{},"private","; plugins stay inside the monolith.",[690,2080,2081],{},"Phase B\u002FC (declare deps \u002F Vite externalize) deferred.",[690,2083,1827,2084,2086],{},[673,2085,1211],{}," (check + npm publish of scoped packages + root)",[656,2088,2090,1849],{"id":2089},"_230-2026-09-30",[660,2091,2092],{},"2.3.0",[682,2094,729],{"id":2095},"added-8",[687,2097,2098,2104,2110,2129,2143],{},[690,2099,2100,2103],{},[1192,2101,2102],{},"Media gallery"," shared UI for Image \u002F FileUpload: search, refresh, grid\u002Flist, delete",[690,2105,2106,2109],{},[1192,2107,2108],{},"Image insert modal"," with crop before insert; gallery + upload wired through media API",[690,2111,2112,715,2115,896,2118,896,2121,2124,2125,2128],{},[1192,2113,2114],{},"Media API helpers",[673,2116,2117],{},"list",[673,2119,2120],{},"upload",[673,2122,2123],{},"delete",") and optional ",[673,2126,2127],{},"endpoints.delete"," on upload config",[690,2130,2131,2134,2135,1358,2138,1607,2141,799],{},[1192,2132,2133],{},"Markdown remote preview",": busy spinner in toolbar (SDK ",[673,2136,2137],{},"ToolbarButton",[673,2139,2140],{},"align",[673,2142,2014],{},[690,2144,2145,2148,2149,2152,2153],{},[1192,2146,2147],{},"Docs DEV API"," (VitePress ",[673,2150,2151],{},"configureServer"," only): media\u002Ffiles\u002Fmd-preview against ",[673,2154,2155],{},"docs\u002F.vitepress\u002Fdev-api\u002Fuploads\u002F",[682,2157,757],{"id":2158},"changed-9",[687,2160,2161,2168],{},[690,2162,2163,2164,2167],{},"ImagePlugin no longer ships a separate ",[673,2165,2166],{},"ImageUploader","; uses FileUpload media stack",[690,2169,2170],{},"SDK toolbar buttons support end-aligned custom views (e.g. MD preview spinner)",[682,2172,685],{"id":2173},"fixed-11",[687,2175,2176,2186],{},[690,2177,2178,2179,1065,2182,2185],{},"ChartMenu: clear preview\u002F",[673,2180,2181],{},"setTimeout",[673,2183,2184],{},"rAF"," on popup dispose (no leftover deferred callbacks)",[690,2187,2188,2191,2192,799],{},[673,2189,2190],{},"charts-plugin.md",": broken 4-backtick fences that could trip VitePress local-search Shiki WASM (",[673,2193,2194],{},"memory access out of bounds",[656,2196,2198,2201],{"id":2197},"_220-2026-09-29",[660,2199,2200],{},"2.2.0"," - 2026-09-29",[682,2203,729],{"id":2204},"added-9",[687,2206,2207,2218,2236,2263,2271,2274,2282],{},[690,2208,2209,1513,2211,1517,2214,2217],{},[1192,2210,41],{},[673,2212,2213],{},"apps\u002Fcode",[673,2215,2216],{},"on-codemerge\u002Fcode"," (+ docs Guide \u002F plugin demos)",[690,2219,2220,1632,2223,736,2225,2228,2229,896,2232,2235],{},[1192,2221,2222],{},"Source contour",[673,2224,1385],{},[673,2226,2227],{},"mountSourceEditor",", shared lexer\u002Fhighlight (",[673,2230,2231],{},"highlightHtml",[673,2233,2234],{},"lex",") — used by CodeBlock, Json raw, Markdown source",[690,2237,2238,715,2241,2243,2244,1065,2247,2250,2251,1378,2254,896,2256,2259,2260],{},[1192,2239,2240],{},"In-house Hunspell",[673,2242,1886],{},"): typed ",[673,2245,2246],{},".aff",[673,2248,2249],{},".dic"," engine (",[673,2252,2253],{},"createDictionary",[673,2255,1930],{},[673,2257,2258],{},"suggest","); replaces ",[673,2261,2262],{},"typo-js",[690,2264,2265,2266,1607,2268,2270],{},"CodeBlock dual-surface (",[673,2267,1606],{},[673,2269,1610],{},"), IO adapters, chrome toolbar",[690,2272,2273],{},"Markdown dual-pane: draggable middle gutter + coalesced preview \u002F mermaid salvage",[690,2275,2276,2277,1358,2279],{},"SpellChecker: typographic apostrophe normalize, locale reload while enabled, Cyrillic-aware suggest alphabet from ",[673,2278,2246],{},[673,2280,2281],{},"TRY",[690,2283,2284],{},"Source-editor e2e stand + screenshots \u002F stress specs",[682,2286,757],{"id":2287},"changed-10",[687,2289,2290,2296,2302],{},[690,2291,2292,2293,2295],{},"SpellCheckerPlugin loads dictionaries via ",[673,2294,1886],{}," (dictionaries still not bundled — pass URL options)",[690,2297,2298,2299,2301],{},"Removed runtime deps: ",[673,2300,2262],{},", CodeMirror packages (source editing is in-house)",[690,2303,2304,2306,2307,2309,2310,799],{},[673,2305,1653],{}," \u002F check gates include ",[673,2308,2216],{}," export + hunspell NOTICE attribution (",[673,2311,2312],{},"dist\u002FTHIRD_PARTY_NOTICES.txt",[682,2314,685],{"id":2315},"fixed-12",[687,2317,2318,2325],{},[690,2319,2320,2321,2324],{},"Code workspace status counts without banned ",[673,2322,2323],{},"textContent"," assignment",[690,2326,2327],{},"Markdown preview lag with many lines (hash + deferred mermaid hydrate)",[656,2329,2331,2334],{"id":2330},"_212-2026-09-28",[660,2332,2333],{},"2.1.2"," - 2026-09-28",[682,2336,685],{"id":2337},"fixed-13",[687,2339,2340,2354],{},[690,2341,2342,2345,2346,2349,2350,2353],{},[1192,2343,2344],{},"Atom host discovery",": CE shells emit ",[673,2347,2348],{},"data-ocm-type","; shared ",[673,2351,2352],{},"queryAtomHosts()","; Calendar\u002FTimer persist no longer miss remount after side-channel edits (e.g. calendar stayed on «No events» until unrelated text remount)",[690,2355,2356,2357,896,2360],{},"Form \u002F CodeBlock host queries aligned with ",[673,2358,2359],{},"data-type",[673,2361,2348],{},[656,2363,2365,2334],{"id":2364},"_211-2026-09-28",[660,2366,2367],{},"2.1.1",[682,2369,685],{"id":2370},"fixed-14",[687,2372,2373,2391],{},[690,2374,2375,736,2378,896,2381,896,2384,2387,2388,799],{},[1192,2376,2377],{},"Markdown Editor publish IO",[673,2379,2380],{},"getPublishedHTML",[673,2382,2383],{},"getPublishedJS",[673,2385,2386],{},"getPublishedDocument"," project preview HTML (mermaid hosts get ",[673,2389,2390],{},"data-ocm-runtime=\"md-mermaid\"",[690,2392,2393,2394,2397,2398,2401,2402,2404],{},"Demo stand depends on npm ",[673,2395,2396],{},"on-codemerge@2.1.1"," again (not ",[673,2399,2400],{},"file:..","); published iframe loads local ",[673,2403,1573],{}," when runtimes are needed",[656,2406,2408,2334],{"id":2407},"_210-2026-09-28",[660,2409,2410],{},"2.1.0",[682,2412,729],{"id":2413},"added-10",[687,2415,2416,2440,2459,2480,2500,2509],{},[690,2417,2418,736,2421,1019,2424,715,2427,2430,2431,715,2434,2437,2438],{},[1192,2419,2420],{},"Multi-surface apps",[673,2422,2423],{},"apps\u002Fwysiwyg",[673,2425,2426],{},"apps\u002Fjson",[673,2428,2429],{},"on-codemerge\u002Fjson","), ",[673,2432,2433],{},"apps\u002Fmarkdown",[673,2435,2436],{},"on-codemerge\u002Fmarkdown",") + shared ",[673,2439,1385],{},[690,2441,2442,736,2445,2448,2449,896,2452,872,2455,2458],{},[1192,2443,2444],{},"Declarative WYSIWYG toolbar menus",[673,2446,2447],{},"Editor"," option ",[673,2450,2451],{},"toolbar.menus",[673,2453,2454],{},"defaultWysiwygToolbarMenus()",[673,2456,2457],{},"{ menus: [] }"," → flat bar",[690,2460,2461,2469,2470,896,2473,896,2476,2479],{},[1192,2462,2463,896,2466],{},[673,2464,2465],{},"PluginToolbarOpts",[673,2467,2468],{},"pluginToolbarPlacement",": optional ",[673,2471,2472],{},"menu",[673,2474,2475],{},"group",[673,2477,2478],{},"order"," on insert\u002Freview\u002Ftools plugin factories (incl. Json\u002FMarkdown atom chrome)",[690,2481,2482,2485,2486,2489,2490,896,2493,896,2496,2499],{},[1192,2483,2484],{},"Typed SoT attrs",": structured ",[673,2487,2488],{},"DocNode.attrs"," (objects\u002Farrays) with ",[673,2491,2492],{},"attrToHtmlValue",[673,2494,2495],{},"readJsonAttr",[673,2497,2498],{},"coerceHtmlJsonAttr"," on the HTML boundary",[690,2501,2502,2505,2506],{},[1192,2503,2504],{},"ClearStylesPlugin",": clear marks + block style\u002Falign (selection or whole document); ",[673,2507,2508],{},"Mod-\\",[690,2510,2511,2512,2515],{},"Docs: focused plugin demos via ",[673,2513,2514],{},"toolbar: { menus: [] }"," (no flatten\u002Fcompact flags); Clear Styles + editors guides",[682,2517,757],{"id":2518},"changed-11",[687,2520,2521,2535,2543,2549],{},[690,2522,2523,2524,2527,2528,2530,2531,2534],{},"Overflow menus ",[1192,2525,2526],{},"only"," from host ",[673,2529,2451],{}," (or plugin ",[673,2532,2533],{},"defineMenu","); missing menu id → button on the bar",[690,2536,2537,2538,2540,2541],{},"Charts \u002F Calendar \u002F Timer \u002F Block \u002F BlockStyle \u002F Form \u002F Footnotes SoT parsers unified on ",[673,2539,2495],{},"; DOM\u002Fpublish encode via ",[673,2542,2492],{},[690,2544,2545,2548],{},[673,2546,2547],{},"CalendarManager.importCalendar"," accepts typed payload (string still supported for file import)",[690,2550,2551],{},"Kernel scale bench budget softened for CI variance",[682,2553,2555],{"id":2554},"removed","Removed",[687,2557,2558],{},[690,2559,2560,1019,2563,2566,2567,2570],{},[673,2561,2562],{},"flattenOverflowMenus",[673,2564,2565],{},"defaultOverflowMenus",", docs ",[673,2568,2569],{},"compactToolbar"," demo hacks",[656,2572,2574,2577],{"id":2573},"_205-2026-09-24",[660,2575,2576],{},"2.0.5"," - 2026-09-24",[682,2579,685],{"id":2580},"fixed-15",[687,2582,2583],{},[690,2584,2585,2586,2589],{},"Build: externalize runtime dependencies from ",[673,2587,2588],{},"dist"," (correct peer\u002Fruntime resolution)",[656,2591,2593,2596],{"id":2592},"_204-2026-09-23",[660,2594,2595],{},"2.0.4"," - 2026-09-23",[682,2598,685],{"id":2599},"fixed-16",[687,2601,2602,2605],{},[690,2603,2604],{},"Docs\u002FIO: HTML\u002FMarkdown as integrate load path; link import + load tests",[690,2606,2607],{},"Kitchen-sink HTML coverage for element round-trip",[656,2609,2611,2596],{"id":2610},"_203-2026-09-23",[660,2612,2613],{},"2.0.3",[682,2615,757],{"id":2616},"changed-12",[687,2618,2619,2622],{},[690,2620,2621],{},"Branding \u002F screenshots for v2; integrate guide rewrites across stacks",[690,2623,2624,2625],{},"Toolbar titles refresh on ",[673,2626,2627],{},"setLocale",[682,2629,685],{"id":2630},"fixed-17",[687,2632,2633],{},[690,2634,2635,2636],{},"Demo published preview with local ",[673,2637,1403],{},[656,2639,2641,2596],{"id":2640},"_202-2026-09-23",[660,2642,2643],{},"2.0.2",[682,2645,685],{"id":2646},"fixed-18",[687,2648,2649],{},[690,2650,2651],{},"Patch release after 2.0.1 (docs\u002Fdemo follow-ups)",[656,2653,2655,2596],{"id":2654},"_201-2026-09-23",[660,2656,2657],{},"2.0.1",[682,2659,685],{"id":2660},"fixed-19",[687,2662,2663,2675],{},[690,2664,2665,2668,2669,1607,2671,2674],{},[1192,2666,2667],{},"Docs site CSS",": VitePress now loads prebuilt ",[673,2670,1399],{},[673,2672,2673],{},"dist\u002Fpublic.css"," so demos get full toolbar \u002F atom chrome (Tailwind content-scan via docs pipeline was incomplete)",[690,2676,2677,2678,2681,2682,2685],{},"Docs ",[673,2679,2680],{},"EditorComponent"," imports editor modules without pulling half-processed ",[673,2683,2684],{},"src\u002Fapp"," CSS side-effects",[682,2687,729],{"id":2688},"added-11",[687,2690,2691,2702],{},[690,2692,2693,2697,2698,2701],{},[1192,2694,2695],{},[673,2696,748],{}," npm stand + Playwright smoke (",[673,2699,2700],{},"demo\u002FREADME.md",") against the published package",[690,2703,2704,2705,2708],{},"Package export ",[673,2706,2707],{},"on-codemerge\u002Fpackage.json"," for version probing",[656,2710,2712,2596],{"id":2711},"_200-2026-09-23",[660,2713,2714],{},"2.0.0",[635,2716,2717,2718,654],{},"Breaking rewrite of the editor around a virtual JSON document, SDK plugin surface, and published-page CSS\u002FJS split. See ",[642,2719,2722],{"href":2720,"rel":2721},"https:\u002F\u002Fgithub.com\u002Fs00d\u002Fon-codemerge\u002Fblob\u002Fmain\u002Fdocs\u002Fguide\u002Fmigration-v1-to-v2.md",[646],"Migration guide: v1 → v2",[682,2724,729],{"id":2725},"added-12",[687,2727,2728,2736,2752,2773,2788,2800,2816,2835,2838,2841],{},[690,2729,2730,2735],{},[1192,2731,2732],{},[673,2733,2734],{},"on-codemerge\u002Fkernel",": document model, operations, selection, transactions (re-exported from the main package)",[690,2737,2738,736,2743,2746,2747,896,2749,2751],{},[1192,2739,2740],{},[673,2741,2742],{},"on-codemerge\u002Fsdk",[673,2744,2745],{},"definePlugin",", ViewSpec UI (",[673,2748,1545],{},[673,2750,1548],{}," \u002F portals), popup \u002F toolbar \u002F context-menu \u002F notify",[690,2753,2754,2758,2759,2762,2763,896,2766,2769,2770],{},[1192,2755,2756],{},[673,2757,2447],{},": replaces ",[673,2760,2761],{},"HTMLEditor","; JSON is source of truth (",[673,2764,2765],{},"getJSON",[673,2767,2768],{},"setJSON","); HTML\u002FMD as boundaries via ",[673,2771,2772],{},"src\u002Fio\u002F",[690,2774,2775,736,2778,2780,2781,1607,2784,2787],{},[1192,2776,2777],{},"Package CSS",[673,2779,1467],{}," (editor chrome) + ",[673,2782,2783],{},"on-codemerge\u002Fpublic.css",[673,2785,2786],{},"on-codemerge\u002Fpublic.js"," (published page)",[690,2789,2790,736,2793,896,2795,2797,2798,799],{},[1192,2791,2792],{},"Workspace packages",[673,2794,902],{},[673,2796,679],{}," (private; bundled into ",[673,2799,675],{},[690,2801,2802,2805,2806,1607,2809,2812,2813,799],{},[1192,2803,2804],{},"Vitest"," unit + e2e (untestutils \u002F Playwright); ",[673,2807,2808],{},"oxlint",[673,2810,2811],{},"oxfmt","; locale parity (",[673,2814,2815],{},"check:locales",[690,2817,2818,2821,2822,1019,2825,1019,2828,1019,2831,2834],{},[1192,2819,2820],{},"Docs",": Guide (",[673,2823,2824],{},"editor",[673,2826,2827],{},"sdk",[673,2829,2830],{},"document-model",[673,2832,2833],{},"authoring-plugins",", migration), Integrate, Plugins catalog",[690,2836,2837],{},"Redesigned panels: Typography Styles, Font Settings (browser font detect), Block Style Editor (inline ColorWell), Edit History viewer",[690,2839,2840],{},"Atom alignment via AlignmentPlugin for timer \u002F calendar \u002F form; shared muted atom chrome + left accent stripe",[690,2842,2843],{},"MathPlugin TeX-subset → AST → MathML (no KaTeX runtime)",[682,2845,757],{"id":2846},"changed-13",[687,2848,2849,2856,2873,2884,2890,2897],{},[690,2850,2851,2852,2855],{},"Plugins register chrome through SDK only — no plugin-owned toolbar DOM \u002F ",[673,2853,2854],{},"document.createElement"," (ban script enforced)",[690,2857,2858,2859,2862,2863,896,2866,896,2869,2872],{},"Toolbar chrome owned by Editor \u002F SDK; ",[673,2860,2861],{},"ToolbarPlugin()"," only registers text marks; overflow menus ",[673,2864,2865],{},"insert",[673,2867,2868],{},"review",[673,2870,2871],{},"tools"," registered by core",[690,2874,2875,2876,2879,2880,2883],{},"Styling: Tailwind v4 + ",[673,2877,2878],{},"@apply"," in plugin ",[673,2881,2882],{},"style.scss","; ColorWell for color UI",[690,2885,2886,2887,2889],{},"SpellChecker: ",[673,2888,2262],{},"; dictionaries not bundled — pass Hunspell URLs via options",[690,2891,2892,2893,2896],{},"i18n: locales under ",[673,2894,2895],{},"src\u002Fi18n\u002Flocales\u002F"," (en + lazy locales)",[690,2898,2899,2900,1607,2903,2906],{},"Tooling: pnpm workspace, Vite 8 library build (",[673,2901,2902],{},"preserveModules",[673,2904,2905],{},"ocm-package"," post-process), publint gate",[682,2908,2555],{"id":2909},"removed-1",[687,2911,2912,2923,2935,2949,2952,2960],{},[690,2913,2914,2918,2919,2922],{},[1192,2915,2916],{},[673,2917,2761],{},", old ",[673,2920,2921],{},"src\u002Fcore\u002F"," (DOMContext, PopupManager, LocaleManager, TextFormatter, …)",[690,2924,2925,2926,2929,2930,896,2933],{},"Per-plugin ",[673,2927,2928],{},"public.scss"," sprawl and per-plugin CSS package exports — use bundled ",[673,2931,2932],{},"index.css",[673,2934,1403],{},[690,2936,2937,896,2940,896,2943,896,2946],{},[673,2938,2939],{},"editor.showToolbar",[673,2941,2942],{},"hideToolbar",[673,2944,2945],{},"addToolbarTool",[673,2947,2948],{},"createToolbarButton",[690,2950,2951],{},"Jest; Prettier \u002F ESLint configs (replaced by oxfmt \u002F oxlint)",[690,2953,2954,2957,2958,799],{},[673,2955,2956],{},"ToolbarDividerPlugin"," as a real chrome plugin (no-op; separators from toolbar ",[673,2959,2475],{},[690,2961,2962],{},"Bundled spellcheck dictionary texts",[682,2964,685],{"id":2965},"fixed-20",[687,2967,2968,2971,2978,2981,2984,2999,3006,3009],{},[690,2969,2970],{},"Typography Styles modal layout (vertical rows + sectioned CSS in dist)",[690,2972,2973,2974,2977],{},"Font Settings empty content after remount; ",[673,2975,2976],{},"t()"," interpolation for available font count",[690,2979,2980],{},"Block Style color picker closing the parent modal (inline ColorWell)",[690,2982,2983],{},"Popup close-on-overlay for Font \u002F Block Style \u002F History",[690,2985,2986,2987,2990,2991,2994,2995,2998],{},"Typed ",[673,2988,2989],{},"removeAtomAt"," with kernel ",[673,2992,2993],{},"Command"," (no ",[673,2996,2997],{},"as never"," at call sites)",[690,3000,3001,3002,3005],{},"Safe DOM event handling (",[673,3003,3004],{},"instanceof"," \u002F guards instead of unsafe casts)",[690,3007,3008],{},"Chart data validation (empty series \u002F NaN \u002F empty labels); timer payload defaults",[690,3010,3011,3012,3015,3016,3019],{},"oxlint ",[673,3013,3014],{},"--deny-warnings"," gate; jsdom canvas ",[673,3017,3018],{},"getContext"," stub for unit tests",[656,3021,3023],{"id":3022},"_132",[660,3024,3025],{},"1.3.2",[635,3027,3028,3029,3032],{},"See git history (",[673,3030,3031],{},"chore(package): update version to 1.3.2",").",[656,3034,3036,3039],{"id":3035},"_110-2024-12-19",[660,3037,3038],{},"1.1.0"," - 2024-12-19",[682,3041,729],{"id":3042},"added-13",[687,3044,3045,3048,3051,3054],{},[690,3046,3047],{},"AI Assistant, Calendar, Language, Responsive, Timer, Block plugins",[690,3049,3050],{},"Lazy table support and enhanced Table Plugin commands",[690,3052,3053],{},"Notification system and plugin documentation",[690,3055,3056],{},"Localization for 18 languages",[682,3058,757],{"id":3059},"changed-14",[687,3061,3062,3065],{},[690,3063,3064],{},"Core architecture and shortcuts cleanup",[690,3066,3067],{},"Charts popup behavior; dark mode styles",[656,3069,3071,3039],{"id":3070},"_1028-2024-12-19",[660,3072,3073],{},"1.0.28",[682,3075,729],{"id":3076},"added-14",[687,3078,3079],{},[690,3080,3081],{},"AI Assistant plugin; Selector container parameter",[682,3083,685],{"id":3084},"fixed-21",[687,3086,3087],{},[690,3088,3089],{},"Hotkeys \u002F code style inconsistencies",[656,3091,3093],{"id":3092},"previous-versions",[660,3094,3095],{},"Previous Versions",[635,3097,3098],{},"For earlier versions, please refer to the git history and commit messages.",[3100,3101],"hr",{},[656,3103,3105],{"id":3104},"contributing","Contributing",[635,3107,3108],{},"When contributing to this project, please update this changelog with your changes following the format above.",[682,3110,3112],{"id":3111},"categories","Categories",[687,3114,3115,3120,3125,3131,3136,3141],{},[690,3116,3117,3119],{},[1192,3118,729],{},": for new features",[690,3121,3122,3124],{},[1192,3123,757],{},": for changes in existing functionality",[690,3126,3127,3130],{},[1192,3128,3129],{},"Deprecated",": for soon-to-be removed features",[690,3132,3133,3135],{},[1192,3134,2555],{},": for now removed features",[690,3137,3138,3140],{},[1192,3139,685],{},": for any bug fixes",[690,3142,3143,3146],{},[1192,3144,3145],{},"Security",": in case of vulnerabilities",{"title":3148,"searchDepth":3149,"depth":3150,"links":3151},"",2,3,[3152,3153,3159,3164,3171,3176,3181,3186,3190,3196,3202,3208,3212,3220,3226,3232,3238,3242,3246,3252,3256,3260,3265,3269,3274,3281,3282,3287,3292,3293],{"id":658,"depth":3149,"text":662},{"id":665,"depth":3149,"text":3154,"children":3155},"2.9.2 - 2026-11-08",[3156,3157,3158],{"id":684,"depth":3150,"text":685},{"id":728,"depth":3150,"text":729},{"id":756,"depth":3150,"text":757},{"id":765,"depth":3149,"text":3160,"children":3161},"2.9.1 - 2026-11-08",[3162,3163],{"id":779,"depth":3150,"text":685},{"id":827,"depth":3150,"text":757},{"id":850,"depth":3149,"text":3165,"children":3166},"2.9.0 - 2026-11-08",[3167,3168,3169,3170],{"id":862,"depth":3150,"text":863},{"id":905,"depth":3150,"text":729},{"id":927,"depth":3150,"text":757},{"id":958,"depth":3150,"text":685},{"id":1000,"depth":3149,"text":3172,"children":3173},"2.8.0 - 2026-10-07",[3174,3175],{"id":1007,"depth":3150,"text":729},{"id":1033,"depth":3150,"text":757},{"id":1045,"depth":3149,"text":3177,"children":3178},"2.7.4 - 2026-10-06",[3179,3180],{"id":1052,"depth":3150,"text":757},{"id":1078,"depth":3150,"text":685},{"id":1090,"depth":3149,"text":3182,"children":3183},"2.7.3 - 2026-10-05",[3184,3185],{"id":1097,"depth":3150,"text":729},{"id":1135,"depth":3150,"text":685},{"id":1149,"depth":3149,"text":3187,"children":3188},"2.7.2 - 2026-10-05",[3189],{"id":1155,"depth":3150,"text":685},{"id":1179,"depth":3149,"text":3191,"children":3192},"2.7.1 - 2026-10-05",[3193,3194,3195],{"id":1185,"depth":3150,"text":729},{"id":1200,"depth":3150,"text":757},{"id":1215,"depth":3150,"text":685},{"id":1230,"depth":3149,"text":3197,"children":3198},"2.7.0 - 2026-10-05",[3199,3200,3201],{"id":1236,"depth":3150,"text":729},{"id":1309,"depth":3150,"text":757},{"id":1334,"depth":3150,"text":685},{"id":1342,"depth":3149,"text":3203,"children":3204},"2.6.0 - 2026-10-03",[3205,3206,3207],{"id":1349,"depth":3150,"text":685},{"id":1369,"depth":3150,"text":757},{"id":1452,"depth":3150,"text":863},{"id":1476,"depth":3149,"text":3209,"children":3210},"2.5.1 - 2026-10-03",[3211],{"id":1482,"depth":3150,"text":685},{"id":1500,"depth":3149,"text":3213,"children":3214},"2.5.0 - 2026-10-03",[3215,3216,3217,3218,3219],{"id":1506,"depth":3150,"text":729},{"id":1663,"depth":3150,"text":757},{"id":1702,"depth":3150,"text":863},{"id":1771,"depth":3150,"text":685},{"id":1821,"depth":3150,"text":1822},{"id":1845,"depth":3149,"text":3221,"children":3222},"2.4.0 - 2026-09-30",[3223,3224,3225],{"id":1852,"depth":3150,"text":729},{"id":2018,"depth":3150,"text":863},{"id":2046,"depth":3150,"text":1822},{"id":2089,"depth":3149,"text":3227,"children":3228},"2.3.0 - 2026-09-30",[3229,3230,3231],{"id":2095,"depth":3150,"text":729},{"id":2158,"depth":3150,"text":757},{"id":2173,"depth":3150,"text":685},{"id":2197,"depth":3149,"text":3233,"children":3234},"2.2.0 - 2026-09-29",[3235,3236,3237],{"id":2204,"depth":3150,"text":729},{"id":2287,"depth":3150,"text":757},{"id":2315,"depth":3150,"text":685},{"id":2330,"depth":3149,"text":3239,"children":3240},"2.1.2 - 2026-09-28",[3241],{"id":2337,"depth":3150,"text":685},{"id":2364,"depth":3149,"text":3243,"children":3244},"2.1.1 - 2026-09-28",[3245],{"id":2370,"depth":3150,"text":685},{"id":2407,"depth":3149,"text":3247,"children":3248},"2.1.0 - 2026-09-28",[3249,3250,3251],{"id":2413,"depth":3150,"text":729},{"id":2518,"depth":3150,"text":757},{"id":2554,"depth":3150,"text":2555},{"id":2573,"depth":3149,"text":3253,"children":3254},"2.0.5 - 2026-09-24",[3255],{"id":2580,"depth":3150,"text":685},{"id":2592,"depth":3149,"text":3257,"children":3258},"2.0.4 - 2026-09-23",[3259],{"id":2599,"depth":3150,"text":685},{"id":2610,"depth":3149,"text":3261,"children":3262},"2.0.3 - 2026-09-23",[3263,3264],{"id":2616,"depth":3150,"text":757},{"id":2630,"depth":3150,"text":685},{"id":2640,"depth":3149,"text":3266,"children":3267},"2.0.2 - 2026-09-23",[3268],{"id":2646,"depth":3150,"text":685},{"id":2654,"depth":3149,"text":3270,"children":3271},"2.0.1 - 2026-09-23",[3272,3273],{"id":2660,"depth":3150,"text":685},{"id":2688,"depth":3150,"text":729},{"id":2711,"depth":3149,"text":3275,"children":3276},"2.0.0 - 2026-09-23",[3277,3278,3279,3280],{"id":2725,"depth":3150,"text":729},{"id":2846,"depth":3150,"text":757},{"id":2909,"depth":3150,"text":2555},{"id":2965,"depth":3150,"text":685},{"id":3022,"depth":3149,"text":3025},{"id":3035,"depth":3149,"text":3283,"children":3284},"1.1.0 - 2024-12-19",[3285,3286],{"id":3042,"depth":3150,"text":729},{"id":3059,"depth":3150,"text":757},{"id":3070,"depth":3149,"text":3288,"children":3289},"1.0.28 - 2024-12-19",[3290,3291],{"id":3076,"depth":3150,"text":729},{"id":3084,"depth":3150,"text":685},{"id":3092,"depth":3149,"text":3095},{"id":3104,"depth":3149,"text":3105,"children":3294},[3295],{"id":3111,"depth":3150,"text":3112},"All notable changes to on-codemerge and the @codemerge\u002F* packages.","md",null,{},true,{"title":626,"description":3296},"Ofp6NyfuwXdWQralrhBFwB0bpZrkwP3a5aldn41E00A",[3304,3298],{"title":622,"path":623,"stem":624,"description":3305,"children":-1},"This repo is pnpm-only. Install, scripts, check, and publish all go through pnpm (pnpm install, pnpm run …, pnpm run release). Do not use the npm CLI in this tree.",1794129102888]