[{"data":1,"prerenderedAt":1818},["ShallowReactive",2],{"navigation":3,"\u002Fnuxt-module\u002Fcomponent-helpers\u002Frich-text-editor":604,"\u002Fnuxt-module\u002Fcomponent-helpers\u002Frich-text-editor-surround":1813},[4,24,67,93,236,533],{"title":5,"path":6,"stem":7,"children":8,"collapsed":23},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,11,15,19],{"title":10,"path":6,"stem":7},"Introduction",{"title":12,"path":13,"stem":14},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":16,"path":17,"stem":18},"Key Ideas","\u002Fgetting-started\u002Fkey-ideas","1.getting-started\u002F3.key-ideas",{"title":20,"path":21,"stem":22},"Releases","\u002Fgetting-started\u002Freleases","1.getting-started\u002F4.releases",true,{"title":25,"path":26,"stem":27,"children":28,"collapsed":23},"Core Concepts","\u002Fcore-concepts","2.core-concepts\u002F0.index",[29,31,35,39,43,47,51,55,59,63],{"title":30,"path":26,"stem":27},"Overview",{"title":32,"path":33,"stem":34},"How It All Works","\u002Fcore-concepts\u002Farchitecture","2.core-concepts\u002F1.architecture",{"title":36,"path":37,"stem":38},"The Data Model","\u002Fcore-concepts\u002Fthe-data-model","2.core-concepts\u002F2.the-data-model",{"title":40,"path":41,"stem":42},"Layouts & Pages","\u002Fcore-concepts\u002Flayouts-and-pages","2.core-concepts\u002F3.layouts-and-pages",{"title":44,"path":45,"stem":46},"Dynamic Pages","\u002Fcore-concepts\u002Fdynamic-pages","2.core-concepts\u002F4.dynamic-pages",{"title":48,"path":49,"stem":50},"Components","\u002Fcore-concepts\u002Fcomponents","2.core-concepts\u002F5.components",{"title":52,"path":53,"stem":54},"Draft & Publish Workflow","\u002Fcore-concepts\u002Fdraft-and-publish","2.core-concepts\u002F6.draft-and-publish",{"title":56,"path":57,"stem":58},"The Admin Panel","\u002Fcore-concepts\u002Fadmin-panel","2.core-concepts\u002F7.admin-panel",{"title":60,"path":61,"stem":62},"Caching","\u002Fcore-concepts\u002Fcaching","2.core-concepts\u002F8.caching",{"title":64,"path":65,"stem":66},"Glossary","\u002Fcore-concepts\u002Fglossary","2.core-concepts\u002F9.glossary",{"title":68,"path":69,"stem":70,"children":71,"collapsed":23},"Guides","\u002Fguides","3.guides\u002F0.index",[72,73,77,81,85,89],{"title":30,"path":69,"stem":70},{"title":74,"path":75,"stem":76},"Your First Layout","\u002Fguides\u002Fyour-first-layout","3.guides\u002F1.your-first-layout",{"title":78,"path":79,"stem":80},"Your First Page Template","\u002Fguides\u002Fyour-first-page-template","3.guides\u002F2.your-first-page-template",{"title":82,"path":83,"stem":84},"Your First Component","\u002Fguides\u002Fyour-first-component","3.guides\u002F3.your-first-component",{"title":86,"path":87,"stem":88},"Alternative UI Variants","\u002Fguides\u002Falternative-ui-variants","3.guides\u002F4.alternative-ui-variants",{"title":90,"path":91,"stem":92},"Your First Dynamic Page","\u002Fguides\u002Fyour-first-dynamic-page","3.guides\u002F5.your-first-dynamic-page",{"title":94,"path":95,"stem":96,"children":97,"collapsed":23},"API Bundle (Back-End)","\u002Fapi","4.api\u002F0.index",[98,99,103,107,129,175,179,183,212,216,220,224,228,232],{"title":30,"path":95,"stem":96},{"title":100,"path":101,"stem":102},"Bundle Setup","\u002Fapi\u002Fbundle-setup","4.api\u002F02.bundle-setup",{"title":104,"path":105,"stem":106},"Configuration Reference","\u002Fapi\u002Fconfiguration","4.api\u002F03.configuration",{"title":108,"path":109,"stem":110,"children":111,"page":128},"Users","\u002Fapi\u002Fusers","4.api\u002F04.users",[112,116,120,124],{"title":113,"path":114,"stem":115},"Authentication","\u002Fapi\u002Fusers\u002Fauthentication","4.api\u002F04.users\u002F1.authentication",{"title":117,"path":118,"stem":119},"User Emails","\u002Fapi\u002Fusers\u002Fuser-emails","4.api\u002F04.users\u002F2.user-emails",{"title":121,"path":122,"stem":123},"Access Control","\u002Fapi\u002Fusers\u002Faccess-control","4.api\u002F04.users\u002F3.access-control",{"title":125,"path":126,"stem":127},"Sites with Non-Admin Users","\u002Fapi\u002Fusers\u002Fnon-admin-users","4.api\u002F04.users\u002F4.non-admin-users",false,{"title":48,"path":130,"stem":131,"children":132,"page":128},"\u002Fapi\u002Fcomponents","4.api\u002F05.components",[133,137,158,171],{"title":134,"path":135,"stem":136},"Creating Components","\u002Fapi\u002Fcomponents\u002Fcreating-components","4.api\u002F05.components\u002F1.creating-components",{"title":138,"path":139,"stem":140,"children":141,"page":128},"Annotations","\u002Fapi\u002Fcomponents\u002Fannotations","4.api\u002F05.components\u002F2.annotations",[142,146,150,154],{"title":143,"path":144,"stem":145},"Publishable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fpublishable","4.api\u002F05.components\u002F2.annotations\u002F1.publishable",{"title":147,"path":148,"stem":149},"Uploadable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fuploadable","4.api\u002F05.components\u002F2.annotations\u002F2.uploadable",{"title":151,"path":152,"stem":153},"Timestamped","\u002Fapi\u002Fcomponents\u002Fannotations\u002Ftimestamped","4.api\u002F05.components\u002F2.annotations\u002F3.timestamped",{"title":155,"path":156,"stem":157},"Explicit Allow Only","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fexplicit-allow-only","4.api\u002F05.components\u002F2.annotations\u002F4.explicit-allow-only",{"title":159,"path":160,"stem":161,"children":162,"page":128},"Built Ins","\u002Fapi\u002Fcomponents\u002Fbuilt-ins","4.api\u002F05.components\u002F3.built-ins",[163,167],{"title":164,"path":165,"stem":166},"Collection Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fcollection-component","4.api\u002F05.components\u002F3.built-ins\u002F1.collection-component",{"title":168,"path":169,"stem":170},"Form Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fform-component","4.api\u002F05.components\u002F3.built-ins\u002F2.form-component",{"title":172,"path":173,"stem":174},"Groups & Positions","\u002Fapi\u002Fcomponents\u002Fcomponent-groups","4.api\u002F05.components\u002F4.component-groups",{"title":176,"path":177,"stem":178},"Page Data & Nested Pages","\u002Fapi\u002Fdynamic-pages","4.api\u002F06.dynamic-pages",{"title":180,"path":181,"stem":182},"Routes","\u002Fapi\u002Froutes","4.api\u002F07.routes",{"title":184,"path":185,"stem":186,"children":187,"page":128},"Data Fixtures","\u002Fapi\u002Fdata-fixtures","4.api\u002F08.data-fixtures",[188,192,196,200,204,208],{"title":189,"path":190,"stem":191},"Getting Started with Fixtures","\u002Fapi\u002Fdata-fixtures\u002Fgetting-started","4.api\u002F08.data-fixtures\u002F1.getting-started",{"title":193,"path":194,"stem":195},"Writing a Scaffold","\u002Fapi\u002Fdata-fixtures\u002Fwriting-a-scaffold","4.api\u002F08.data-fixtures\u002F2.writing-a-scaffold",{"title":197,"path":198,"stem":199},"Builder Reference","\u002Fapi\u002Fdata-fixtures\u002Fbuilder-reference","4.api\u002F08.data-fixtures\u002F3.builder-reference",{"title":201,"path":202,"stem":203},"Seeding Content","\u002Fapi\u002Fdata-fixtures\u002Fseeding-content","4.api\u002F08.data-fixtures\u002F4.seeding-content",{"title":205,"path":206,"stem":207},"Appending & Multiple Scaffolds","\u002Fapi\u002Fdata-fixtures\u002Fappending","4.api\u002F08.data-fixtures\u002F5.appending",{"title":209,"path":210,"stem":211},"Generating Fixtures","\u002Fapi\u002Fdata-fixtures\u002Fgenerating-fixtures","4.api\u002F08.data-fixtures\u002F6.generating-fixtures",{"title":213,"path":214,"stem":215},"Real-Time (Mercure)","\u002Fapi\u002Freal-time","4.api\u002F09.real-time",{"title":217,"path":218,"stem":219},"Versions & Conflicts","\u002Fapi\u002Fversions-and-conflicts","4.api\u002F09.versions-and-conflicts",{"title":221,"path":222,"stem":223},"HTTP Caching","\u002Fapi\u002Fhttp-caching","4.api\u002F10.http-caching",{"title":225,"path":226,"stem":227},"Orphaned Data","\u002Fapi\u002Forphaned-data","4.api\u002F11.orphaned-data",{"title":229,"path":230,"stem":231},"Console Commands","\u002Fapi\u002Fconsole-commands","4.api\u002F12.console-commands",{"title":233,"path":234,"stem":235},"Debugging & Errors","\u002Fapi\u002Fdebugging","4.api\u002F13.debugging",{"title":237,"path":238,"stem":239,"children":240,"collapsed":23},"Nuxt Module (Front-End)","\u002Fnuxt-module","5.nuxt-module\u002F0.index",[241,242,246,259,279,308,329,460,494,497,525,529],{"title":30,"path":238,"stem":239},{"title":243,"path":244,"stem":245},"Module Setup","\u002Fnuxt-module\u002Fmodule-setup","5.nuxt-module\u002F01.module-setup",{"title":247,"path":248,"stem":249,"children":250,"page":128},"Configuration","\u002Fnuxt-module\u002Fconfiguration","5.nuxt-module\u002F02.configuration",[251,255],{"title":252,"path":253,"stem":254},"Nuxt Config","\u002Fnuxt-module\u002Fconfiguration\u002Fnuxt-config","5.nuxt-module\u002F02.configuration\u002F1.nuxt-config",{"title":256,"path":257,"stem":258},"Site Config & SEO","\u002Fnuxt-module\u002Fconfiguration\u002Fsite-config-and-seo","5.nuxt-module\u002F02.configuration\u002F2.site-config-and-seo",{"title":260,"path":261,"stem":262,"children":263,"page":128},"Building Your Ui","\u002Fnuxt-module\u002Fbuilding-your-ui","5.nuxt-module\u002F03.building-your-ui",[264,268,272,275],{"title":265,"path":266,"stem":267},"Layouts","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-layouts","5.nuxt-module\u002F03.building-your-ui\u002F1.creating-layouts",{"title":269,"path":270,"stem":271},"Page Templates","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-page-templates","5.nuxt-module\u002F03.building-your-ui\u002F2.creating-page-templates",{"title":48,"path":273,"stem":274},"\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-components","5.nuxt-module\u002F03.building-your-ui\u002F3.creating-components",{"title":276,"path":277,"stem":278},"CLI Generator","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcwa-cli","5.nuxt-module\u002F03.building-your-ui\u002F4.cwa-cli",{"title":280,"path":281,"stem":282,"children":283,"page":128},"Component Helpers","\u002Fnuxt-module\u002Fcomponent-helpers","5.nuxt-module\u002F04.component-helpers",[284,288,292,296,300,304],{"title":285,"path":286,"stem":287},"Images & Media","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fimages-and-uploads","5.nuxt-module\u002F04.component-helpers\u002F1.images-and-uploads",{"title":289,"path":290,"stem":291},"Collections & Pagination","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fcollections-and-pagination","5.nuxt-module\u002F04.component-helpers\u002F2.collections-and-pagination",{"title":293,"path":294,"stem":295},"HTML Content","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fhtml-content","5.nuxt-module\u002F04.component-helpers\u002F3.html-content",{"title":297,"path":298,"stem":299},"Rich-Text Editor","\u002Fnuxt-module\u002Fcomponent-helpers\u002Frich-text-editor","5.nuxt-module\u002F04.component-helpers\u002F4.rich-text-editor",{"title":301,"path":302,"stem":303},"Real-Time Updates","\u002Fnuxt-module\u002Fcomponent-helpers\u002Freal-time-updates","5.nuxt-module\u002F04.component-helpers\u002F5.real-time-updates",{"title":305,"path":306,"stem":307},"Forms","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fforms","5.nuxt-module\u002F04.component-helpers\u002F6.forms",{"title":309,"path":310,"stem":311,"children":312,"page":128},"Cwa Components","\u002Fnuxt-module\u002Fcwa-components","5.nuxt-module\u002F05.cwa-components",[313,317,321,325],{"title":314,"path":315,"stem":316},"\u003CCwaComponentGroup \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-component-group","5.nuxt-module\u002F05.cwa-components\u002F1.cwa-component-group",{"title":318,"path":319,"stem":320},"\u003CCwaPage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-page","5.nuxt-module\u002F05.cwa-components\u002F2.cwa-page",{"title":322,"path":323,"stem":324},"\u003CCwaLink \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-link","5.nuxt-module\u002F05.cwa-components\u002F3.cwa-link",{"title":326,"path":327,"stem":328},"\u003CCwaDefaultLayout \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-default-layout","5.nuxt-module\u002F05.cwa-components\u002F5.cwa-default-layout",{"title":330,"path":331,"stem":332,"children":333,"page":128},"Composables","\u002Fnuxt-module\u002Fcomposables","5.nuxt-module\u002F06.composables",[334,337,345,370,390,415,435],{"title":30,"path":335,"stem":336},"\u002Fnuxt-module\u002Fcomposables\u002Foverview","5.nuxt-module\u002F06.composables\u002F0.overview",{"title":338,"path":339,"stem":340,"children":341,"page":128},"Layout","\u002Fnuxt-module\u002Fcomposables\u002Flayout","5.nuxt-module\u002F06.composables\u002F1.layout",[342],{"title":338,"path":343,"stem":344},"\u002Fnuxt-module\u002Fcomposables\u002Flayout\u002Fuse-cwa-layout","5.nuxt-module\u002F06.composables\u002F1.layout\u002F1.use-cwa-layout",{"title":346,"path":347,"stem":348,"children":349,"page":128},"Component","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent","5.nuxt-module\u002F06.composables\u002F2.component",[350,354,358,362,366],{"title":351,"path":352,"stem":353},"Component (recommended)","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-component","5.nuxt-module\u002F06.composables\u002F2.component\u002F1.use-cwa-component",{"title":355,"path":356,"stem":357},"Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-resource","5.nuxt-module\u002F06.composables\u002F2.component\u002F2.use-cwa-resource",{"title":359,"path":360,"stem":361},"File Field","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-file-field","5.nuxt-module\u002F06.composables\u002F2.component\u002F3.use-cwa-file-field",{"title":363,"path":364,"stem":365},"Collection Pagination","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-collection-pagination","5.nuxt-module\u002F06.composables\u002F2.component\u002F4.use-cwa-collection-pagination",{"title":367,"path":368,"stem":369},"Collection Resource (deprecated)","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-collection-resource","5.nuxt-module\u002F06.composables\u002F2.component\u002F9.use-cwa-collection-resource",{"title":371,"path":372,"stem":373,"children":374,"page":128},"Form","\u002Fnuxt-module\u002Fcomposables\u002Fform","5.nuxt-module\u002F06.composables\u002F3.form",[375,378,382,386],{"title":371,"path":376,"stem":377},"\u002Fnuxt-module\u002Fcomposables\u002Fform\u002Fuse-cwa-form","5.nuxt-module\u002F06.composables\u002F3.form\u002F1.use-cwa-form",{"title":379,"path":380,"stem":381},"Form Input","\u002Fnuxt-module\u002Fcomposables\u002Fform\u002Fuse-cwa-form-input","5.nuxt-module\u002F06.composables\u002F3.form\u002F2.use-cwa-form-input",{"title":383,"path":384,"stem":385},"Form Repeated","\u002Fnuxt-module\u002Fcomposables\u002Fform\u002Fuse-cwa-form-repeated","5.nuxt-module\u002F06.composables\u002F3.form\u002F3.use-cwa-form-repeated",{"title":387,"path":388,"stem":389},"Form Collection","\u002Fnuxt-module\u002Fcomposables\u002Fform\u002Fuse-cwa-form-collection","5.nuxt-module\u002F06.composables\u002F3.form\u002F4.use-cwa-form-collection",{"title":391,"path":392,"stem":393,"children":394,"page":128},"Admin Manager","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager","5.nuxt-module\u002F06.composables\u002F4.admin-manager",[395,399,403,407,411],{"title":396,"path":397,"stem":398},"Manager Tab","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-manager-tab","5.nuxt-module\u002F06.composables\u002F4.admin-manager\u002F1.use-cwa-resource-manager-tab",{"title":400,"path":401,"stem":402},"Resource Model","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-model","5.nuxt-module\u002F06.composables\u002F4.admin-manager\u002F2.use-cwa-resource-model",{"title":404,"path":405,"stem":406},"Resource Upload","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-upload","5.nuxt-module\u002F06.composables\u002F4.admin-manager\u002F3.use-cwa-resource-upload",{"title":408,"path":409,"stem":410},"Remote Changes","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fon-remote-change","5.nuxt-module\u002F06.composables\u002F4.admin-manager\u002F4.on-remote-change",{"title":412,"path":413,"stem":414},"Real-Time Events","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-realtime","5.nuxt-module\u002F06.composables\u002F4.admin-manager\u002F5.use-cwa-realtime",{"title":416,"path":417,"stem":418,"children":419,"page":128},"Utilities","\u002Fnuxt-module\u002Fcomposables\u002Futilities","5.nuxt-module\u002F06.composables\u002F5.utilities",[420,424,428,432],{"title":421,"path":422,"stem":423},"Resource Endpoint","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-endpoint","5.nuxt-module\u002F06.composables\u002F5.utilities\u002F1.use-cwa-resource-endpoint",{"title":425,"path":426,"stem":427},"Query Model","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-query-bound-model","5.nuxt-module\u002F06.composables\u002F5.utilities\u002F2.use-query-bound-model",{"title":429,"path":430,"stem":431},"Resource Route","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-route","5.nuxt-module\u002F06.composables\u002F5.utilities\u002F3.use-cwa-resource-route",{"title":293,"path":433,"stem":434},"\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-html-content","5.nuxt-module\u002F06.composables\u002F5.utilities\u002F4.use-html-content",{"title":436,"path":437,"stem":438,"children":439,"page":128},"Auth","\u002Fnuxt-module\u002Fcomposables\u002Fauth","5.nuxt-module\u002F06.composables\u002F6.auth",[440,444,448,452,456],{"title":441,"path":442,"stem":443},"Login","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-login","5.nuxt-module\u002F06.composables\u002F6.auth\u002F1.use-login",{"title":445,"path":446,"stem":447},"Forgot Password","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-forgot-password","5.nuxt-module\u002F06.composables\u002F6.auth\u002F2.use-forgot-password",{"title":449,"path":450,"stem":451},"Reset Password","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-reset-password","5.nuxt-module\u002F06.composables\u002F6.auth\u002F3.use-reset-password",{"title":453,"path":454,"stem":455},"Verify Email","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-verify-email","5.nuxt-module\u002F06.composables\u002F6.auth\u002F4.use-verify-email",{"title":457,"path":458,"stem":459},"Resend Verify Email","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-resend-verify-email","5.nuxt-module\u002F06.composables\u002F6.auth\u002F5.use-resend-verify-email",{"title":461,"path":462,"stem":463,"children":464,"page":128},"Cwa Api","\u002Fnuxt-module\u002Fcwa-api","5.nuxt-module\u002F07.cwa-api",[465,468,472,476,479,482,486,490],{"title":30,"path":466,"stem":467},"\u002Fnuxt-module\u002Fcwa-api\u002Foverview","5.nuxt-module\u002F07.cwa-api\u002F1.overview",{"title":469,"path":470,"stem":471},"Resources","\u002Fnuxt-module\u002Fcwa-api\u002Fresources","5.nuxt-module\u002F07.cwa-api\u002F2.resources",{"title":473,"path":474,"stem":475},"Resources Manager","\u002Fnuxt-module\u002Fcwa-api\u002Fresources-manager","5.nuxt-module\u002F07.cwa-api\u002F3.resources-manager",{"title":436,"path":477,"stem":478},"\u002Fnuxt-module\u002Fcwa-api\u002Fauth","5.nuxt-module\u002F07.cwa-api\u002F4.auth",{"title":305,"path":480,"stem":481},"\u002Fnuxt-module\u002Fcwa-api\u002Fforms","5.nuxt-module\u002F07.cwa-api\u002F5.forms",{"title":483,"path":484,"stem":485},"Admin","\u002Fnuxt-module\u002Fcwa-api\u002Fadmin","5.nuxt-module\u002F07.cwa-api\u002F6.admin",{"title":487,"path":488,"stem":489},"Site Config","\u002Fnuxt-module\u002Fcwa-api\u002Fsite-config","5.nuxt-module\u002F07.cwa-api\u002F7.site-config",{"title":491,"path":492,"stem":493},"Orphaned Resources","\u002Fnuxt-module\u002Fcwa-api\u002Forphaned-resources","5.nuxt-module\u002F07.cwa-api\u002F8.orphaned-resources",{"title":113,"path":495,"stem":496},"\u002Fnuxt-module\u002Fauthentication","5.nuxt-module\u002F08.authentication",{"title":498,"path":499,"stem":500,"children":501,"page":128},"Cwa Layer","\u002Fnuxt-module\u002Fcwa-layer","5.nuxt-module\u002F9.cwa-layer",[502,505,509,513,517,521],{"title":30,"path":503,"stem":504},"\u002Fnuxt-module\u002Fcwa-layer\u002Foverview","5.nuxt-module\u002F9.cwa-layer\u002F1.overview",{"title":506,"path":507,"stem":508},"Auth Pages","\u002Fnuxt-module\u002Fcwa-layer\u002Fauth-pages","5.nuxt-module\u002F9.cwa-layer\u002F2.auth-pages",{"title":510,"path":511,"stem":512},"Admin Panel","\u002Fnuxt-module\u002Fcwa-layer\u002Fadmin-panel","5.nuxt-module\u002F9.cwa-layer\u002F3.admin-panel",{"title":514,"path":515,"stem":516},"Styling","\u002Fnuxt-module\u002Fcwa-layer\u002Fstyling","5.nuxt-module\u002F9.cwa-layer\u002F4.styling",{"title":518,"path":519,"stem":520},"Date Pickers","\u002Fnuxt-module\u002Fcwa-layer\u002Fdate-pickers","5.nuxt-module\u002F9.cwa-layer\u002F5.date-pickers",{"title":522,"path":523,"stem":524},"Maintenance","\u002Fnuxt-module\u002Fcwa-layer\u002Fmaintenance","5.nuxt-module\u002F9.cwa-layer\u002F6.maintenance",{"title":526,"path":527,"stem":528},"PWA & Offline","\u002Fnuxt-module\u002Fpwa","5.nuxt-module\u002F91.pwa",{"title":530,"path":531,"stem":532},"Page Caching","\u002Fnuxt-module\u002Fpage-caching","5.nuxt-module\u002F92.page-caching",{"title":534,"path":535,"stem":536,"children":537,"collapsed":23},"Deployment & Operations","\u002Fdeployment","6.deployment\u002F0.index",[538,540,544,548,552,556,560,564,568,572,576,580,584,588,592,596,600],{"title":539,"path":535,"stem":536},"Deploying a CWA Site",{"title":541,"path":542,"stem":543},"Docker","\u002Fdeployment\u002Fdocker","6.deployment\u002F1.docker",{"title":545,"path":546,"stem":547},"Deploy to One Server","\u002Fdeployment\u002Fone-server","6.deployment\u002F1.one-server",{"title":549,"path":550,"stem":551},"Kubernetes & Helm","\u002Fdeployment\u002Fkubernetes","6.deployment\u002F2.kubernetes",{"title":553,"path":554,"stem":555},"Moving From One Server to Kubernetes","\u002Fdeployment\u002Fmoving-to-kubernetes","6.deployment\u002F2.moving-to-kubernetes",{"title":557,"path":558,"stem":559},"Scaled Mode","\u002Fdeployment\u002Fscaled-mode","6.deployment\u002F2.scaled-mode",{"title":561,"path":562,"stem":563},"CI\u002FCD","\u002Fdeployment\u002Fci-cd","6.deployment\u002F3.ci-cd",{"title":565,"path":566,"stem":567},"Migrations and Backups","\u002Fdeployment\u002Fmigrations-and-backups","6.deployment\u002F3.migrations-and-backups",{"title":569,"path":570,"stem":571},"CI\u002FCD Variables","\u002Fdeployment\u002Fvariables","6.deployment\u002F4.variables",{"title":573,"path":574,"stem":575},"Cloudflare","\u002Fdeployment\u002Fcloudflare","6.deployment\u002F5.cloudflare",{"title":577,"path":578,"stem":579},"Origin Protection","\u002Fdeployment\u002Forigin-protection","6.deployment\u002F5.origin-protection",{"title":581,"path":582,"stem":583},"Load Testing","\u002Fdeployment\u002Fload-testing","6.deployment\u002F6.load-testing",{"title":585,"path":586,"stem":587},"Performance Audit","\u002Fdeployment\u002Fperformance-audit","6.deployment\u002F6.performance-audit",{"title":589,"path":590,"stem":591},"Reading Lighthouse Scores","\u002Fdeployment\u002Freading-lighthouse-scores","6.deployment\u002F6.reading-lighthouse-scores",{"title":593,"path":594,"stem":595},"Browser Tests","\u002Fdeployment\u002Fbrowser-tests","6.deployment\u002F7.browser-tests",{"title":597,"path":598,"stem":599},"Faster Functional Tests","\u002Fdeployment\u002Ffaster-functional-tests","6.deployment\u002F7.faster-functional-tests",{"title":601,"path":602,"stem":603},"Troubleshooting","\u002Fdeployment\u002Ftroubleshooting","6.deployment\u002F7.troubleshooting",{"id":605,"title":297,"badge":606,"body":607,"description":1808,"extension":1809,"links":606,"meta":1810,"navigation":23,"path":298,"seo":1811,"stem":299,"__hash__":1812},"docs\u002F5.nuxt-module\u002F04.component-helpers\u002F4.rich-text-editor.md",null,{"type":608,"value":609,"toc":1801},"minimark",[610,640,645,652,960,967,1027,1046,1292,1295,1299,1309,1312,1434,1467,1470,1485,1494,1498,1515,1568,1577,1582,1586,1594,1621,1628,1669,1746,1753,1770,1792,1797],[611,612,613,614,618,619,626,627,630,631,636,637,639],"p",{},"The module doesn't ship a rich-text editor. The template has one, ",[615,616,617],"code",{},"app\u002Fapp\u002Fcomponents\u002FTipTapHtmlEditor.vue",", built on ",[620,621,625],"a",{"href":622,"rel":623},"https:\u002F\u002Ftiptap.dev",[624],"nofollow","TipTap",". Its ",[615,628,629],{},"HtmlContent"," component shows the editor to admins in edit mode, and the HTML through ",[620,632,633],{"href":294},[615,634,635],{},"v-cwa-html"," to everyone else. This page covers the editor; ",[620,638,293],{"href":294}," covers rendering the HTML.",[641,642,644],"h2",{"id":643},"loading-an-editor-lazily","Loading an Editor Lazily",[611,646,647,648,651],{},"A rich-text component often shows an editor to admins, such as TipTap. Import the editor with ",[615,649,650],{},"defineAsyncComponent",", not statically. A static import puts the editor into the preloads of every page with body text, for anonymous visitors too. In the template, that was about 424 KB of TipTap and ProseMirror (135 KB gzipped).",[653,654,659],"pre",{"className":655,"code":656,"language":657,"meta":658,"style":658},"language-vue shiki shiki-themes github-light github-dark material-theme-palenight has-focused","\u003Ctemplate>\n  \u003Carticle>\n    \u003CTipTapHtmlEditor v-if=\"$cwa.admin.isEditing\" :model=\"resourceModel\" :iri=\"iri\" \u002F>\n    \u003Cdiv v-else ref=\"container\" v-cwa-html=\"content\" class=\"prose\" \u002F>\n  \u003C\u002Farticle>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup lang=\"ts\">\nimport { defineAsyncComponent } from 'vue'\n\n\u002F\u002F Fetched only when an admin starts editing.\nconst TipTapHtmlEditor = defineAsyncComponent(() => import('~\u002Fcomponents\u002FTipTapHtmlEditor.vue')) \u002F\u002F [!code focus]\n\u002F\u002F ...\n\u003C\u002Fscript>\n","vue","",[615,660,661,677,688,757,811,821,831,837,862,888,893,900,945,951],{"__ignoreMap":658},[662,663,666,670,674],"span",{"class":664,"line":665},"line",1,[662,667,669],{"class":668},"sOvfz","\u003C",[662,671,673],{"class":672},"s-h7I","template",[662,675,676],{"class":668},">\n",[662,678,680,683,686],{"class":664,"line":679},2,[662,681,682],{"class":668},"  \u003C",[662,684,685],{"class":672},"article",[662,687,676],{"class":668},[662,689,691,694,697,701,704,708,712,715,718,720,723,725,728,732,734,736,739,741,743,746,748,750,752,754],{"class":664,"line":690},3,[662,692,693],{"class":668},"    \u003C",[662,695,696],{"class":672},"TipTapHtmlEditor",[662,698,700],{"class":699},"sm4w6"," v-if",[662,702,703],{"class":668},"=",[662,705,707],{"class":706},"seSrl","\"",[662,709,711],{"class":710},"sPB8G","$cwa",[662,713,714],{"class":668},".",[662,716,717],{"class":710},"admin",[662,719,714],{"class":668},[662,721,722],{"class":710},"isEditing",[662,724,707],{"class":706},[662,726,727],{"class":668}," :",[662,729,731],{"class":730},"sGtlX","model",[662,733,703],{"class":668},[662,735,707],{"class":706},[662,737,738],{"class":710},"resourceModel",[662,740,707],{"class":706},[662,742,727],{"class":668},[662,744,745],{"class":730},"iri",[662,747,703],{"class":668},[662,749,707],{"class":706},[662,751,745],{"class":710},[662,753,707],{"class":706},[662,755,756],{"class":668}," \u002F>\n",[662,758,760,762,765,768,771,773,775,779,781,784,786,788,791,793,796,798,800,803,805,809],{"class":664,"line":759},4,[662,761,693],{"class":668},[662,763,764],{"class":672},"div",[662,766,767],{"class":730}," v-else",[662,769,770],{"class":730}," ref",[662,772,703],{"class":668},[662,774,707],{"class":706},[662,776,778],{"class":777},"sLL54","container",[662,780,707],{"class":706},[662,782,783],{"class":730}," v-cwa-html",[662,785,703],{"class":668},[662,787,707],{"class":706},[662,789,790],{"class":777},"content",[662,792,707],{"class":706},[662,794,795],{"class":730}," class",[662,797,703],{"class":668},[662,799,707],{"class":706},[662,801,802],{"class":777},"prose",[662,804,707],{"class":706},[662,806,808],{"class":807},"s01iV"," \u002F",[662,810,676],{"class":668},[662,812,814,817,819],{"class":664,"line":813},5,[662,815,816],{"class":668},"  \u003C\u002F",[662,818,685],{"class":672},[662,820,676],{"class":668},[662,822,824,827,829],{"class":664,"line":823},6,[662,825,826],{"class":668},"\u003C\u002F",[662,828,673],{"class":672},[662,830,676],{"class":668},[662,832,834],{"class":664,"line":833},7,[662,835,836],{"emptyLinePlaceholder":23},"\n",[662,838,840,842,845,848,851,853,855,858,860],{"class":664,"line":839},8,[662,841,669],{"class":668},[662,843,844],{"class":672},"script",[662,846,847],{"class":730}," setup",[662,849,850],{"class":730}," lang",[662,852,703],{"class":668},[662,854,707],{"class":706},[662,856,857],{"class":777},"ts",[662,859,707],{"class":706},[662,861,676],{"class":668},[662,863,865,868,871,874,877,880,883,885],{"class":664,"line":864},9,[662,866,867],{"class":699},"import",[662,869,870],{"class":668}," {",[662,872,873],{"class":710}," defineAsyncComponent",[662,875,876],{"class":668}," }",[662,878,879],{"class":699}," from",[662,881,882],{"class":706}," '",[662,884,657],{"class":777},[662,886,887],{"class":706},"'\n",[662,889,891],{"class":664,"line":890},10,[662,892,836],{"emptyLinePlaceholder":23},[662,894,896],{"class":664,"line":895},11,[662,897,899],{"class":898},"sTBSN","\u002F\u002F Fetched only when an admin starts editing.\n",[662,901,905,909,913,917,920,923,926,929,932,934,937,940,942],{"class":902,"line":904},[664,903],"focused",12,[662,906,908],{"class":907},"swB56","const",[662,910,912],{"class":911},"sc2zw"," TipTapHtmlEditor",[662,914,916],{"class":915},"sVlFx"," =",[662,918,873],{"class":919},"sKpYG",[662,921,922],{"class":710},"(",[662,924,925],{"class":668},"()",[662,927,928],{"class":907}," =>",[662,930,931],{"class":915}," import",[662,933,922],{"class":710},[662,935,936],{"class":706},"'",[662,938,939],{"class":777},"~\u002Fcomponents\u002FTipTapHtmlEditor.vue",[662,941,936],{"class":706},[662,943,944],{"class":710},")) ",[662,946,948],{"class":664,"line":947},13,[662,949,950],{"class":898},"\u002F\u002F ...\n",[662,952,954,956,958],{"class":664,"line":953},14,[662,955,826],{"class":668},[662,957,844],{"class":672},[662,959,676],{"class":668},[611,961,962,963,966],{},"Anywhere else that only needs the editor's type, use ",[615,964,965],{},"import type",". A value import keeps the editor in the dev bundle.",[653,968,971],{"className":969,"code":970,"language":857,"meta":658,"style":658},"language-ts shiki shiki-themes github-light github-dark material-theme-palenight","import type TipTapHtmlEditor from '~\u002Fcomponents\u002FTipTapHtmlEditor.vue'\n\nconst editorComponent = ref\u003Ctypeof TipTapHtmlEditor | undefined>()\n",[615,972,973,992,996],{"__ignoreMap":658},[662,974,975,977,980,983,986,988,990],{"class":664,"line":665},[662,976,867],{"class":699},[662,978,979],{"class":699}," type",[662,981,982],{"class":710}," TipTapHtmlEditor ",[662,984,985],{"class":699},"from",[662,987,882],{"class":706},[662,989,939],{"class":777},[662,991,887],{"class":706},[662,993,994],{"class":664,"line":679},[662,995,836],{"emptyLinePlaceholder":23},[662,997,998,1000,1003,1005,1007,1009,1012,1014,1017,1021,1024],{"class":664,"line":690},[662,999,908],{"class":907},[662,1001,1002],{"class":911}," editorComponent",[662,1004,916],{"class":915},[662,1006,770],{"class":919},[662,1008,669],{"class":668},[662,1010,1011],{"class":915},"typeof",[662,1013,982],{"class":710},[662,1015,1016],{"class":915},"|",[662,1018,1020],{"class":1019},"sbW4m"," undefined",[662,1022,1023],{"class":668},">",[662,1025,1026],{"class":710},"()\n",[611,1028,1029,1030,1033,1034,1037,1038,1041,1042,1045],{},"Nuxt still adds a ",[615,1031,1032],{},"prefetch"," hint for the async chunk, so browsers may download it in the background. The template removes that hint with a ",[615,1035,1036],{},"build:manifest"," hook in ",[615,1039,1040],{},"nuxt.config.ts",". It filters the editor out of each chunk's ",[615,1043,1044],{},"dynamicImports",". The editor still loads on demand when it is first shown.",[653,1047,1049],{"className":969,"code":1048,"language":857,"meta":658,"style":658},"\u002F\u002F nuxt.config.ts\nconst isEditorSource = (id: string) => id.endsWith('components\u002FTipTapHtmlEditor.vue')\n\nexport default defineNuxtConfig({\n  modules: [\n    (_options, nuxt) => {\n      nuxt.hook('build:manifest', (manifest) => {\n        for (const chunk of Object.values(manifest)) {\n          chunk.dynamicImports = chunk.dynamicImports?.filter(id => !isEditorSource(id))\n        }\n      })\n    },\n  ],\n})\n",[615,1050,1051,1056,1104,1108,1124,1135,1156,1187,1218,1260,1265,1272,1277,1285],{"__ignoreMap":658},[662,1052,1053],{"class":664,"line":665},[662,1054,1055],{"class":898},"\u002F\u002F nuxt.config.ts\n",[662,1057,1058,1060,1064,1066,1069,1073,1076,1079,1082,1084,1087,1089,1092,1094,1096,1099,1101],{"class":664,"line":679},[662,1059,908],{"class":907},[662,1061,1063],{"class":1062},"scpWJ"," isEditorSource",[662,1065,916],{"class":915},[662,1067,1068],{"class":668}," (",[662,1070,1072],{"class":1071},"sNTR6","id",[662,1074,1075],{"class":915},":",[662,1077,1078],{"class":1019}," string",[662,1080,1081],{"class":668},")",[662,1083,928],{"class":907},[662,1085,1086],{"class":710}," id",[662,1088,714],{"class":668},[662,1090,1091],{"class":919},"endsWith",[662,1093,922],{"class":710},[662,1095,936],{"class":706},[662,1097,1098],{"class":777},"components\u002FTipTapHtmlEditor.vue",[662,1100,936],{"class":706},[662,1102,1103],{"class":710},")\n",[662,1105,1106],{"class":664,"line":690},[662,1107,836],{"emptyLinePlaceholder":23},[662,1109,1110,1113,1116,1119,1121],{"class":664,"line":759},[662,1111,1112],{"class":699},"export",[662,1114,1115],{"class":699}," default",[662,1117,1118],{"class":919}," defineNuxtConfig",[662,1120,922],{"class":710},[662,1122,1123],{"class":668},"{\n",[662,1125,1126,1130,1132],{"class":664,"line":813},[662,1127,1129],{"class":1128},"sDHlG","  modules",[662,1131,1075],{"class":668},[662,1133,1134],{"class":710}," [\n",[662,1136,1137,1140,1143,1146,1149,1151,1153],{"class":664,"line":823},[662,1138,1139],{"class":668},"    (",[662,1141,1142],{"class":1071},"_options",[662,1144,1145],{"class":668},",",[662,1147,1148],{"class":1071}," nuxt",[662,1150,1081],{"class":668},[662,1152,928],{"class":907},[662,1154,1155],{"class":668}," {\n",[662,1157,1158,1161,1163,1166,1168,1170,1172,1174,1176,1178,1181,1183,1185],{"class":664,"line":833},[662,1159,1160],{"class":710},"      nuxt",[662,1162,714],{"class":668},[662,1164,1165],{"class":919},"hook",[662,1167,922],{"class":1128},[662,1169,936],{"class":706},[662,1171,1036],{"class":777},[662,1173,936],{"class":706},[662,1175,1145],{"class":668},[662,1177,1068],{"class":668},[662,1179,1180],{"class":1071},"manifest",[662,1182,1081],{"class":668},[662,1184,928],{"class":907},[662,1186,1155],{"class":668},[662,1188,1189,1192,1194,1196,1199,1202,1205,1207,1210,1212,1214,1216],{"class":664,"line":839},[662,1190,1191],{"class":699},"        for",[662,1193,1068],{"class":1128},[662,1195,908],{"class":907},[662,1197,1198],{"class":911}," chunk",[662,1200,1201],{"class":915}," of",[662,1203,1204],{"class":710}," Object",[662,1206,714],{"class":668},[662,1208,1209],{"class":919},"values",[662,1211,922],{"class":1128},[662,1213,1180],{"class":710},[662,1215,944],{"class":1128},[662,1217,1123],{"class":668},[662,1219,1220,1223,1225,1227,1229,1231,1233,1235,1238,1241,1243,1245,1247,1250,1253,1255,1257],{"class":664,"line":864},[662,1221,1222],{"class":710},"          chunk",[662,1224,714],{"class":668},[662,1226,1044],{"class":710},[662,1228,916],{"class":915},[662,1230,1198],{"class":710},[662,1232,714],{"class":668},[662,1234,1044],{"class":710},[662,1236,1237],{"class":668},"?.",[662,1239,1240],{"class":919},"filter",[662,1242,922],{"class":1128},[662,1244,1072],{"class":1071},[662,1246,928],{"class":907},[662,1248,1249],{"class":915}," !",[662,1251,1252],{"class":919},"isEditorSource",[662,1254,922],{"class":1128},[662,1256,1072],{"class":710},[662,1258,1259],{"class":1128},"))\n",[662,1261,1262],{"class":664,"line":890},[662,1263,1264],{"class":668},"        }\n",[662,1266,1267,1270],{"class":664,"line":895},[662,1268,1269],{"class":668},"      }",[662,1271,1103],{"class":1128},[662,1273,1274],{"class":664,"line":904},[662,1275,1276],{"class":668},"    },\n",[662,1278,1279,1282],{"class":664,"line":947},[662,1280,1281],{"class":710},"  ]",[662,1283,1284],{"class":668},",\n",[662,1286,1287,1290],{"class":664,"line":953},[662,1288,1289],{"class":668},"}",[662,1291,1103],{"class":710},[611,1293,1294],{},"The module already keeps its own admin UI out of visitors' prefetch hints. It can't see your editor, because the editor is app code, so keep this hook.",[641,1296,1298],{"id":1297},"choosing-the-editors-buttons","Choosing the Editor's Buttons",[611,1300,1301,1302,1304,1305,1308],{},"The template's ",[615,1303,617],{}," shows a menu of formatting buttons: H1, H2, Bold, Italic, Underline, Link and Bullet List. Every button shows by default. Pass the ",[615,1306,1307],{},"config"," prop to hide some of them for one field.",[611,1310,1311],{},"For example, a short description that allows only bold, italic and links:",[653,1313,1316],{"className":1314,"code":1315,"language":657,"meta":658,"style":658},"language-vue shiki shiki-themes github-light github-dark material-theme-palenight","\u003CTipTapHtmlEditor\n  v-if=\"$cwa.admin.isEditing\"\n  :model=\"resourceModel\"\n  :iri=\"iri\"\n  :config=\"{ h1: false, h2: false, underline: false, bulletList: false }\"\n\u002F>\n",[615,1317,1318,1325,1347,1362,1376,1429],{"__ignoreMap":658},[662,1319,1320,1322],{"class":664,"line":665},[662,1321,669],{"class":668},[662,1323,1324],{"class":672},"TipTapHtmlEditor\n",[662,1326,1327,1330,1332,1334,1336,1338,1340,1342,1344],{"class":664,"line":679},[662,1328,1329],{"class":699},"  v-if",[662,1331,703],{"class":668},[662,1333,707],{"class":706},[662,1335,711],{"class":710},[662,1337,714],{"class":668},[662,1339,717],{"class":710},[662,1341,714],{"class":668},[662,1343,722],{"class":710},[662,1345,1346],{"class":706},"\"\n",[662,1348,1349,1352,1354,1356,1358,1360],{"class":664,"line":690},[662,1350,1351],{"class":668},"  :",[662,1353,731],{"class":730},[662,1355,703],{"class":668},[662,1357,707],{"class":706},[662,1359,738],{"class":710},[662,1361,1346],{"class":706},[662,1363,1364,1366,1368,1370,1372,1374],{"class":664,"line":759},[662,1365,1351],{"class":668},[662,1367,745],{"class":730},[662,1369,703],{"class":668},[662,1371,707],{"class":706},[662,1373,745],{"class":710},[662,1375,1346],{"class":706},[662,1377,1378,1380,1382,1384,1386,1389,1392,1394,1398,1400,1403,1405,1407,1409,1412,1414,1416,1418,1421,1423,1425,1427],{"class":664,"line":813},[662,1379,1351],{"class":668},[662,1381,1307],{"class":730},[662,1383,703],{"class":668},[662,1385,707],{"class":706},[662,1387,1388],{"class":668},"{",[662,1390,1391],{"class":1128}," h1",[662,1393,1075],{"class":668},[662,1395,1397],{"class":1396},"swWMF"," false",[662,1399,1145],{"class":668},[662,1401,1402],{"class":1128}," h2",[662,1404,1075],{"class":668},[662,1406,1397],{"class":1396},[662,1408,1145],{"class":668},[662,1410,1411],{"class":1128}," underline",[662,1413,1075],{"class":668},[662,1415,1397],{"class":1396},[662,1417,1145],{"class":668},[662,1419,1420],{"class":1128}," bulletList",[662,1422,1075],{"class":668},[662,1424,1397],{"class":1396},[662,1426,876],{"class":668},[662,1428,1346],{"class":706},[662,1430,1431],{"class":664,"line":823},[662,1432,1433],{"class":710},"\u002F>\n",[611,1435,1436,1437,1440,1441,1440,1443,1440,1446,1440,1449,1440,1452,1455,1456,1459,1460,1463,1464,1466],{},"The keys are ",[615,1438,1439],{},"h1",", ",[615,1442,641],{},[615,1444,1445],{},"bold",[615,1447,1448],{},"italic",[615,1450,1451],{},"underline",[615,1453,1454],{},"link"," and ",[615,1457,1458],{},"bulletList",". Set a key to ",[615,1461,1462],{},"false"," to hide that button. The prop is typed, so a misspelt key fails the type check. A project whose copy of the file has no ",[615,1465,1307],{}," prop can copy the current file from the template.",[611,1468,1469],{},"H1, H2 and Bullet List also appear in the menu shown on an empty line. That menu is hidden when all three are off.",[1471,1472,1475],"callout",{"icon":1473,"color":1474},"i-heroicons-exclamation-triangle","warning",[611,1476,1477,1481,1482,1484],{},[1478,1479,1480],"strong",{},"Hiding a button doesn't stop the style."," The editor still has every extension, so pasted content and keyboard shortcuts (such as Ctrl+U, or Cmd+U on a Mac, for underline) still apply it. ",[615,1483,1307],{}," only changes the menu. To forbid a style, remove its extension from the editor, or clean the HTML on the API.",[1471,1486,1488],{"icon":1487},"i-heroicons-photo",[611,1489,1490,1491,1493],{},"Image placeholder: the editor's selection menu for a field with ",[615,1492,1307],{}," set to bold, italic and link only, next to the full menu with all seven buttons.",[641,1495,1497],{"id":1496},"editing-together","Editing Together",[611,1499,1500,1501,1506,1507,1510,1511,1514],{},"The editor takes the HTML field's ",[620,1502,1503],{"href":401},[615,1504,1505],{},"useCwaResourceModel"," as ",[615,1508,1509],{},":model",", and the component's IRI as ",[615,1512,1513],{},":iri",". With them, it works with other admins like the kit fields do:",[1516,1517,1518,1529,1540,1550],"ul",{},[1519,1520,1521,1524,1525,1528],"li",{},[1478,1522,1523],{},"Who's in the field."," Another admin with the editor in focus outlines it in their colour, with their name above it (",[615,1526,1527],{},"\u003CCwaUiFieldPresence>",").",[1519,1530,1531,1534,1535,714],{},[1478,1532,1533],{},"Their carets."," Each admin's caret and selection show in their colour while they're in the field. The editor sends them with ",[620,1536,1537],{"href":413},[615,1538,1539],{},"useCwaRealtime",[1519,1541,1542,1545,1546,1549],{},[1478,1543,1544],{},"Their saves."," Another admin's save is applied in place: only the changed part is replaced, so your caret stays where it was, and ",[1478,1547,1548],{},"Undo"," doesn't undo their change.",[1519,1551,1552,1555,1556,1560,1561,1564,1565,1528],{},[1478,1553,1554],{},"Typing at once."," Your typing and theirs merge as you both type (see ",[620,1557,1559],{"href":1558},"#typing-at-the-same-time","Typing at the Same Time","). When a save can't be merged, ",[1478,1562,1563],{},"Use theirs \u002F Keep mine"," shows below the editor (",[615,1566,1567],{},"\u003CCwaUiRemoteChangeConflict>",[611,1569,1570,1571,714],{},"How an editor of your own does the same is in ",[620,1572,1574,1576],{"href":1573},"\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-model#your-own-field-editor",[615,1575,1505],{}," › Your Own Field Editor",[1471,1578,1579],{"icon":1487},[611,1580,1581],{},"IMAGE: The rich-text editor in edit mode, outlined in purple with the flag \"Ben Kay\" above it, Ben's purple caret in the second paragraph, and \"Ben Kay changed this · Use theirs \u002F Keep mine\" below the text",[1583,1584,1559],"h3",{"id":1585},"typing-at-the-same-time",[611,1587,1588,1589,1075],{},"When two admins type in the same field at once, the template's editor merges their typing with ",[620,1590,1593],{"href":1591,"rel":1592},"https:\u002F\u002Fyjs.dev",[624],"Yjs",[1516,1595,1596,1599,1604,1611,1614],{},[1519,1597,1598],{},"Each admin sees the other's keystrokes as they type, with live carets.",[1519,1600,1601,1603],{},[1478,1602,1548],{}," only undoes your own typing.",[1519,1605,1606,1607,1610],{},"Each window saves its own typing, so ",[1478,1608,1609],{},"Publish"," includes it. One window also saves the merged text.",[1519,1612,1613],{},"A change saved from outside the editor, such as from another tab of the manager panel, is applied into the shared text for everyone.",[1519,1615,1616,1617,1528],{},"The shared Yjs state for each field is kept in the API, so an admin who opens the field later starts from it (see ",[620,1618,1620],{"href":1619},"\u002Fapi\u002Fversions-and-conflicts#collaboration-states","API › Versions & Conflicts › Collaboration States",[611,1622,1623,1624,1627],{},"It needs api-components-bundle ",[615,1625,1626],{},"2.0.0-alpha.37"," or later, which stores the Yjs state. With an older bundle, the editor logs a warning and starts from the saved HTML.",[611,1629,1630,1631,1633,1634,1068,1637,1440,1640,1440,1643,1440,1646,1440,1649,1455,1652,1655,1656,1440,1659,1455,1662,1665,1666,1075],{},"The editor is ",[615,1632,617],{}," with the Yjs files in ",[615,1635,1636],{},"app\u002Fapp\u002Ftiptap\u002F",[615,1638,1639],{},"co-editing.ts",[615,1641,1642],{},"y-sync.ts",[615,1644,1645],{},"y-seed.ts",[615,1647,1648],{},"y-session.ts",[615,1650,1651],{},"y-state.ts",[615,1653,1654],{},"y-cursors.ts","), and it uses the ",[615,1657,1658],{},"yjs",[615,1660,1661],{},"@tiptap\u002Fextension-collaboration",[615,1663,1664],{},"@tiptap\u002Fy-tiptap"," packages. Pass it the name of the field it edits, as ",[615,1667,1668],{},"field",[653,1670,1672],{"className":1314,"code":1671,"language":657,"meta":658,"style":658},"\u003CTipTapHtmlEditor\n  v-if=\"$cwa.admin.isEditing\"\n  :model=\"resourceModel\"\n  :iri=\"iri\"\n  field=\"html\"\n\u002F>\n",[615,1673,1674,1680,1700,1714,1728,1742],{"__ignoreMap":658},[662,1675,1676,1678],{"class":664,"line":665},[662,1677,669],{"class":668},[662,1679,1324],{"class":672},[662,1681,1682,1684,1686,1688,1690,1692,1694,1696,1698],{"class":664,"line":679},[662,1683,1329],{"class":699},[662,1685,703],{"class":668},[662,1687,707],{"class":706},[662,1689,711],{"class":710},[662,1691,714],{"class":668},[662,1693,717],{"class":710},[662,1695,714],{"class":668},[662,1697,722],{"class":710},[662,1699,1346],{"class":706},[662,1701,1702,1704,1706,1708,1710,1712],{"class":664,"line":690},[662,1703,1351],{"class":668},[662,1705,731],{"class":730},[662,1707,703],{"class":668},[662,1709,707],{"class":706},[662,1711,738],{"class":710},[662,1713,1346],{"class":706},[662,1715,1716,1718,1720,1722,1724,1726],{"class":664,"line":759},[662,1717,1351],{"class":668},[662,1719,745],{"class":730},[662,1721,703],{"class":668},[662,1723,707],{"class":706},[662,1725,745],{"class":710},[662,1727,1346],{"class":706},[662,1729,1730,1733,1735,1737,1740],{"class":664,"line":813},[662,1731,1732],{"class":730},"  field",[662,1734,703],{"class":668},[662,1736,707],{"class":706},[662,1738,1739],{"class":777},"html",[662,1741,1346],{"class":706},[662,1743,1744],{"class":664,"line":823},[662,1745,1433],{"class":710},[611,1747,1748,1749,1752],{},"Load the editor lazily, as in ",[620,1750,644],{"href":1751},"#loading-an-editor-lazily",", so Yjs never reaches visitors.",[1471,1754,1755],{"icon":1473,"color":1474},[611,1756,1757,1762,1763,1765,1766,1769],{},[1478,1758,1759,1760,714],{},"Keep one copy of ",[615,1761,1658],{}," Two copies in the build break the editor's sync. Keep ",[615,1764,1661],{}," on the same version as your other TipTap packages, and check that ",[615,1767,1768],{},"pnpm why yjs"," lists one version.",[1471,1771,1773,1778],{"icon":1772},"i-heroicons-information-circle",[611,1774,1775],{},[1478,1776,1777],{},"Known limits:",[1516,1779,1780,1783,1786],{},[1519,1781,1782],{},"An editor that isn't selected shows no one's caret.",[1519,1784,1785],{},"Nothing stops the stored Yjs state growing past the API's limit for it: 8,388,608 base64 characters, about 6 MiB of Yjs data.",[1519,1787,1788,1789,1791],{},"If the window that saves the merged text has typing it hasn't sent when an outside save arrives, that admin gets ",[1478,1790,1563],{}," instead of a merge.",[1471,1793,1794],{"icon":1487},[611,1795,1796],{},"VIDEO: Two windows on the same HTML component, both with the editor selected. Typing in one window appears letter by letter in the other, each caret in its admin's colour, and pressing Undo in one window removes only that admin's words",[1798,1799,1800],"style",{},"html pre.shiki code .sOvfz, html code.shiki .sOvfz{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#89DDFF}html pre.shiki code .s-h7I, html code.shiki .s-h7I{--shiki-light:#22863A;--shiki-default:#85E89D;--shiki-dark:#F07178}html pre.shiki code .sm4w6, html code.shiki .sm4w6{--shiki-light:#D73A49;--shiki-light-font-style:inherit;--shiki-default:#F97583;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .seSrl, html code.shiki .seSrl{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#89DDFF}html pre.shiki code .sPB8G, html code.shiki .sPB8G{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#BABED8}html pre.shiki code .sGtlX, html code.shiki .sGtlX{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#C792EA}html pre.shiki code .sLL54, html code.shiki .sLL54{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#C3E88D}html pre.shiki code .s01iV, html code.shiki .s01iV{--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:inherit}html pre.shiki code .sTBSN, html code.shiki .sTBSN{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swB56, html code.shiki .swB56{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#C792EA}html pre.shiki code .sc2zw, html code.shiki .sc2zw{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#BABED8}html pre.shiki code .sVlFx, html code.shiki .sVlFx{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#89DDFF}html pre.shiki code .sKpYG, html code.shiki .sKpYG{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbW4m, html code.shiki .sbW4m{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#FFCB6B}html pre.shiki code .scpWJ, html code.shiki .scpWJ{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#BABED8}html pre.shiki code .sNTR6, html code.shiki .sNTR6{--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-default:#FFAB70;--shiki-default-font-style:inherit;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sDHlG, html code.shiki .sDHlG{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#F07178}html pre.shiki code .swWMF, html code.shiki .swWMF{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#FF9CAC}",{"title":658,"searchDepth":679,"depth":679,"links":1802},[1803,1804,1805],{"id":643,"depth":679,"text":644},{"id":1297,"depth":679,"text":1298},{"id":1496,"depth":679,"text":1497,"children":1806},[1807],{"id":1585,"depth":690,"text":1559},"The template's TipTap editor for HTML fields — load it only when an admin edits, keep it out of visitors' prefetch hints, choose its buttons, and edit together with other admins.","md",{},{"title":297,"description":1808},"dP-7mQkgb2H0u0PGxOgxjYqtwZDjchSpTMkDKRMlxC8",[1814,1816],{"title":293,"path":294,"stem":295,"description":1815,"children":-1},"Render rich-text HTML from a CWA resource with CwaLink replacing anchor tags so internal links stay client-side.",{"title":301,"path":302,"stem":303,"description":1817,"children":-1},"How Mercure broadcasts live content changes to all open browser sessions automatically when a component is published.",1793565698540]