[{"data":1,"prerenderedAt":1858},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-protokit/composables/use-proto-doc-en":444,"/docs/nuxt-protokit/composables/use-proto-doc-surround-en":1853},[4,8,13,28,41,51,64,77,94,110,134,150,157,172],{"title":5,"path":6,"stem":7},"Overview","/docs/landing","0.docs/1.landing/001.index",{"title":9,"path":10,"stem":11,"badge":12},"Built-in Features","/docs/landing/built-in-features","0.docs/1.landing/002.built-in-features","New",{"title":14,"path":15,"stem":16,"children":17,"icon":27},"Content Foundation","/docs/landing/content","0.docs/1.landing/02.content/1.index",[18,19,23],{"title":5,"path":15,"stem":16},{"title":20,"path":21,"stem":22},"Details","/docs/landing/content/details","0.docs/1.landing/02.content/2.details",{"title":24,"path":25,"stem":26},"Technical","/docs/landing/content/technical","0.docs/1.landing/02.content/4.technical","i-heroicons-document-text",{"title":29,"path":30,"stem":31,"children":32,"icon":40},"Regional Content","/docs/landing/regional","0.docs/1.landing/03.regional/1.index",[33,34,37],{"title":5,"path":30,"stem":31},{"title":20,"path":35,"stem":36},"/docs/landing/regional/details","0.docs/1.landing/03.regional/2.details",{"title":24,"path":38,"stem":39},"/docs/landing/regional/technical","0.docs/1.landing/03.regional/4.technical","i-heroicons-globe-alt",{"title":42,"path":43,"stem":44,"children":45,"icon":50},"Multi-language","/docs/landing/multilang","0.docs/1.landing/04.multilang/1.index",[46,47],{"title":5,"path":43,"stem":44},{"title":20,"path":48,"stem":49},"/docs/landing/multilang/details","0.docs/1.landing/04.multilang/2.details","i-heroicons-language",{"title":52,"path":53,"stem":54,"children":55,"icon":63},"Blog","/docs/landing/blog","0.docs/1.landing/05.blog/1.index",[56,57,60],{"title":5,"path":53,"stem":54},{"title":20,"path":58,"stem":59},"/docs/landing/blog/details","0.docs/1.landing/05.blog/2.details",{"title":24,"path":61,"stem":62},"/docs/landing/blog/technical","0.docs/1.landing/05.blog/4.technical","i-heroicons-pencil-square",{"title":65,"path":66,"stem":67,"children":68,"icon":76},"Documentation","/docs/landing/docs","0.docs/1.landing/06.docs/1.index",[69,70,73],{"title":5,"path":66,"stem":67},{"title":20,"path":71,"stem":72},"/docs/landing/docs/details","0.docs/1.landing/06.docs/2.details",{"title":24,"path":74,"stem":75},"/docs/landing/docs/technical","0.docs/1.landing/06.docs/4.technical","i-heroicons-book-open",{"title":78,"path":79,"stem":80,"children":81,"icon":93},"Forms","/docs/landing/forms","0.docs/1.landing/07.forms/1.index",[82,83,86,90],{"title":5,"path":79,"stem":80},{"title":20,"path":84,"stem":85},"/docs/landing/forms/details","0.docs/1.landing/07.forms/2.details",{"title":87,"path":88,"stem":89},"Admin","/docs/landing/forms/admin","0.docs/1.landing/07.forms/3.admin",{"title":24,"path":91,"stem":92},"/docs/landing/forms/technical","0.docs/1.landing/07.forms/4.technical","i-heroicons-clipboard-document-list",{"title":95,"path":96,"stem":97,"children":98,"icon":109},"Email","/docs/landing/email","0.docs/1.landing/08.email/1.index",[99,100,103,106],{"title":5,"path":96,"stem":97},{"title":20,"path":101,"stem":102},"/docs/landing/email/details","0.docs/1.landing/08.email/2.details",{"title":87,"path":104,"stem":105},"/docs/landing/email/admin","0.docs/1.landing/08.email/3.admin",{"title":24,"path":107,"stem":108},"/docs/landing/email/technical","0.docs/1.landing/08.email/4.technical","i-heroicons-envelope",{"title":111,"path":112,"stem":113,"children":114,"icon":133},"Feedback Platform","/docs/landing/feedback","0.docs/1.landing/09.feedback/1.index",[115,116,119,122,125,129],{"title":5,"path":112,"stem":113},{"title":20,"path":117,"stem":118},"/docs/landing/feedback/details","0.docs/1.landing/09.feedback/2.details",{"title":87,"path":120,"stem":121},"/docs/landing/feedback/admin","0.docs/1.landing/09.feedback/3.admin",{"title":24,"path":123,"stem":124},"/docs/landing/feedback/technical","0.docs/1.landing/09.feedback/4.technical",{"title":126,"path":127,"stem":128},"Compare vs SaaS","/docs/landing/feedback/compare","0.docs/1.landing/09.feedback/5.compare",{"title":130,"path":131,"stem":132},"FAQ","/docs/landing/feedback/faq","0.docs/1.landing/09.feedback/6.faq","i-heroicons-chat-bubble-left-right",{"title":135,"path":136,"stem":137,"children":138,"icon":149},"Storage","/docs/landing/storage","0.docs/1.landing/10.storage/1.index",[139,140,143,146],{"title":5,"path":136,"stem":137},{"title":20,"path":141,"stem":142},"/docs/landing/storage/details","0.docs/1.landing/10.storage/2.details",{"title":87,"path":144,"stem":145},"/docs/landing/storage/admin","0.docs/1.landing/10.storage/3.admin",{"title":24,"path":147,"stem":148},"/docs/landing/storage/technical","0.docs/1.landing/10.storage/4.technical","i-heroicons-circle-stack",{"title":151,"path":152,"stem":153,"children":154,"icon":156},"Offline First","/docs/landing/offline-first","0.docs/1.landing/11.offline-first/1.index",[155],{"title":151,"path":152,"stem":153},"i-heroicons-users",{"title":158,"path":159,"stem":160,"children":161,"icon":156},"Yjs Sync","/docs/landing/yjs-sync","0.docs/1.landing/12.yjs-sync/1.index",[162,163,166,169],{"title":5,"path":159,"stem":160},{"title":20,"path":164,"stem":165},"/docs/landing/yjs-sync/details","0.docs/1.landing/12.yjs-sync/2.details",{"title":87,"path":167,"stem":168},"/docs/landing/yjs-sync/admin","0.docs/1.landing/12.yjs-sync/3.admin",{"title":24,"path":170,"stem":171},"/docs/landing/yjs-sync/technical","0.docs/1.landing/12.yjs-sync/4.technical",{"title":173,"path":174,"stem":175,"children":176,"badge":178,"icon":179},"Newsletter","/docs/landing/newsletter","0.docs/1.landing/13.newsletter/index",[177],{"title":173,"path":174,"stem":175,"badge":178},"Coming Soon","i-lucide-send",[181,184,202,298],{"title":5,"path":182,"stem":183},"/docs/nuxt-auto","0.docs/3.nuxt-auto/index",{"title":185,"path":186,"stem":187,"children":188,"page":201},"Getting Started","/docs/nuxt-auto/getting-started","0.docs/3.nuxt-auto/1.getting-started",[189,193,197],{"title":190,"path":191,"stem":192},"Introduction","/docs/nuxt-auto/getting-started/introduction","0.docs/3.nuxt-auto/1.getting-started/1.introduction",{"title":194,"path":195,"stem":196},"Installation","/docs/nuxt-auto/getting-started/installation","0.docs/3.nuxt-auto/1.getting-started/2.installation",{"title":198,"path":199,"stem":200},"Quick Start","/docs/nuxt-auto/getting-started/quick-start","0.docs/3.nuxt-auto/1.getting-started/3.quick-start",false,{"title":203,"path":204,"stem":205,"children":206,"page":201},"Auto API","/docs/nuxt-auto/auto-api","0.docs/3.nuxt-auto/2.auto-api",[207,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294],{"title":185,"path":208,"stem":209},"/docs/nuxt-auto/auto-api/getting-started","0.docs/3.nuxt-auto/2.auto-api/1.getting-started",{"title":211,"path":212,"stem":213},"Aggregations","/docs/nuxt-auto/auto-api/aggregations","0.docs/3.nuxt-auto/2.auto-api/10.aggregations",{"title":215,"path":216,"stem":217},"Lifecycle Hooks","/docs/nuxt-auto/auto-api/lifecycle-hooks","0.docs/3.nuxt-auto/2.auto-api/11.lifecycle-hooks",{"title":219,"path":220,"stem":221},"Many-to-Many (M2M) Relationships","/docs/nuxt-auto/auto-api/m2m-relationships","0.docs/3.nuxt-auto/2.auto-api/12.m2m-relationships",{"title":223,"path":224,"stem":225},"Plugin System","/docs/nuxt-auto/auto-api/plugin-system","0.docs/3.nuxt-auto/2.auto-api/13.plugin-system",{"title":227,"path":228,"stem":229},"Database Adapters","/docs/nuxt-auto/auto-api/database-adapters","0.docs/3.nuxt-auto/2.auto-api/14.database-adapters",{"title":231,"path":232,"stem":233},"Custom Endpoints","/docs/nuxt-auto/auto-api/custom-endpoints","0.docs/3.nuxt-auto/2.auto-api/15.custom-endpoints",{"title":235,"path":236,"stem":237},"Multi-Tenancy","/docs/nuxt-auto/auto-api/multi-tenancy","0.docs/3.nuxt-auto/2.auto-api/16.multi-tenancy",{"title":239,"path":240,"stem":241},"Validation","/docs/nuxt-auto/auto-api/validation","0.docs/3.nuxt-auto/2.auto-api/2.validation",{"title":243,"path":244,"stem":245},"Rate Limiting","/docs/nuxt-auto/auto-api/rate-limiting","0.docs/3.nuxt-auto/2.auto-api/20.rate-limiting",{"title":247,"path":248,"stem":249},"Request Metadata Plugin","/docs/nuxt-auto/auto-api/request-metadata","0.docs/3.nuxt-auto/2.auto-api/21.request-metadata",{"title":251,"path":252,"stem":253},"Plugin Catalog","/docs/nuxt-auto/auto-api/plugin-catalog","0.docs/3.nuxt-auto/2.auto-api/22.plugin-catalog",{"title":255,"path":256,"stem":257},"Handler Overrides","/docs/nuxt-auto/auto-api/handler-overrides","0.docs/3.nuxt-auto/2.auto-api/3.handler-overrides",{"title":259,"path":260,"stem":261},"Cloudflare D1","/docs/nuxt-auto/auto-api/cloudflare-d1","0.docs/3.nuxt-auto/2.auto-api/30.cloudflare-d1",{"title":263,"path":264,"stem":265},"SQLite to D1 Migration","/docs/nuxt-auto/auto-api/migration-sqlite-d1","0.docs/3.nuxt-auto/2.auto-api/31.migration-sqlite-d1",{"title":267,"path":268,"stem":269},"Frontend Composables","/docs/nuxt-auto/auto-api/frontend-composables","0.docs/3.nuxt-auto/2.auto-api/32.frontend-composables",{"title":271,"path":272,"stem":273},"Testing","/docs/nuxt-auto/auto-api/testing","0.docs/3.nuxt-auto/2.auto-api/33.testing",{"title":275,"path":276,"stem":277},"Pagination","/docs/nuxt-auto/auto-api/pagination","0.docs/3.nuxt-auto/2.auto-api/4.pagination",{"title":279,"path":280,"stem":281},"Soft Deletes","/docs/nuxt-auto/auto-api/soft-deletes","0.docs/3.nuxt-auto/2.auto-api/5.soft-deletes",{"title":283,"path":284,"stem":285},"Authentication & Authorization","/docs/nuxt-auto/auto-api/authentication-authorization","0.docs/3.nuxt-auto/2.auto-api/6.authentication-authorization",{"title":287,"path":288,"stem":289},"Better-Auth Integration","/docs/nuxt-auto/auto-api/better-auth","0.docs/3.nuxt-auto/2.auto-api/7.better-auth",{"title":291,"path":292,"stem":293},"Nested Relations","/docs/nuxt-auto/auto-api/nested-relationships","0.docs/3.nuxt-auto/2.auto-api/8.nested-relationships",{"title":295,"path":296,"stem":297},"Bulk Operations","/docs/nuxt-auto/auto-api/bulk-operations","0.docs/3.nuxt-auto/2.auto-api/9.bulk-operations",{"title":299,"path":300,"stem":301,"children":302,"page":201},"Auto Admin","/docs/nuxt-auto/auto-admin","0.docs/3.nuxt-auto/3.auto-admin",[303,306,310,314,318,322,326,330,334],{"title":185,"path":304,"stem":305},"/docs/nuxt-auto/auto-admin/getting-started","0.docs/3.nuxt-auto/3.auto-admin/1.getting-started",{"title":307,"path":308,"stem":309},"Configuration & Theming","/docs/nuxt-auto/auto-admin/configuration-theming","0.docs/3.nuxt-auto/3.auto-admin/2.configuration-theming",{"title":311,"path":312,"stem":313},"Resource Configuration","/docs/nuxt-auto/auto-admin/resource-configuration","0.docs/3.nuxt-auto/3.auto-admin/3.resource-configuration",{"title":315,"path":316,"stem":317},"Form Fields & Widgets","/docs/nuxt-auto/auto-admin/form-fields-widgets","0.docs/3.nuxt-auto/3.auto-admin/4.form-fields-widgets",{"title":319,"path":320,"stem":321},"Permissions","/docs/nuxt-auto/auto-admin/permissions","0.docs/3.nuxt-auto/3.auto-admin/5.permissions",{"title":323,"path":324,"stem":325},"Custom Pages","/docs/nuxt-auto/auto-admin/custom-pages","0.docs/3.nuxt-auto/3.auto-admin/6.custom-pages",{"title":327,"path":328,"stem":329},"M2M Relationships","/docs/nuxt-auto/auto-admin/m2m-relationships","0.docs/3.nuxt-auto/3.auto-admin/7.m2m-relationships",{"title":331,"path":332,"stem":333},"Custom Actions","/docs/nuxt-auto/auto-admin/custom-actions","0.docs/3.nuxt-auto/3.auto-admin/8.custom-actions",{"title":335,"path":336,"stem":337},"Composables","/docs/nuxt-auto/auto-admin/composables","0.docs/3.nuxt-auto/3.auto-admin/9.composables",[339,342,355,382,400,415,425],{"title":5,"path":340,"stem":341},"/docs/nuxt-protokit","0.docs/4.nuxt-protokit/index",{"title":185,"path":343,"stem":344,"children":345,"icon":354},"/docs/nuxt-protokit/getting-started","0.docs/4.nuxt-protokit/1.getting-started/1.index",[346,347,351],{"title":190,"path":343,"stem":344},{"title":348,"path":349,"stem":350},"Core Concepts","/docs/nuxt-protokit/getting-started/concepts","0.docs/4.nuxt-protokit/1.getting-started/2.concepts",{"title":198,"path":352,"stem":353},"/docs/nuxt-protokit/getting-started/quick-start","0.docs/4.nuxt-protokit/1.getting-started/3.quick-start","i-lucide-rocket",{"title":356,"path":357,"stem":358,"children":359,"icon":381},"Schemas","/docs/nuxt-protokit/schemas","0.docs/4.nuxt-protokit/2.schemas/1.index",[360,361,365,369,373,377],{"title":5,"path":357,"stem":358},{"title":362,"path":363,"stem":364},"Field Types","/docs/nuxt-protokit/schemas/fields","0.docs/4.nuxt-protokit/2.schemas/2.fields",{"title":366,"path":367,"stem":368},"Collections","/docs/nuxt-protokit/schemas/collections","0.docs/4.nuxt-protokit/2.schemas/3.collections",{"title":370,"path":371,"stem":372},"Derived & Computed","/docs/nuxt-protokit/schemas/derived-computed","0.docs/4.nuxt-protokit/2.schemas/4.derived-computed",{"title":374,"path":375,"stem":376},"Connections","/docs/nuxt-protokit/schemas/connections","0.docs/4.nuxt-protokit/2.schemas/5.connections",{"title":378,"path":379,"stem":380},"Visualizations & Layouts","/docs/nuxt-protokit/schemas/visualizations","0.docs/4.nuxt-protokit/2.schemas/6.visualizations","i-lucide-file-code",{"title":335,"path":383,"stem":384,"children":385,"icon":399},"/docs/nuxt-protokit/composables","0.docs/4.nuxt-protokit/3.composables/1.index",[386,387,391,395],{"title":5,"path":383,"stem":384},{"title":388,"path":389,"stem":390},"usePrototype","/docs/nuxt-protokit/composables/use-prototype","0.docs/4.nuxt-protokit/3.composables/2.use-prototype",{"title":392,"path":393,"stem":394},"useProtoDoc","/docs/nuxt-protokit/composables/use-proto-doc","0.docs/4.nuxt-protokit/3.composables/3.use-proto-doc",{"title":396,"path":397,"stem":398},"useProtoCollection","/docs/nuxt-protokit/composables/use-proto-collection","0.docs/4.nuxt-protokit/3.composables/4.use-proto-collection","i-lucide-layers",{"title":401,"path":402,"stem":403,"children":404,"icon":414},"Components","/docs/nuxt-protokit/components","0.docs/4.nuxt-protokit/4.components/1.index",[405,406,410],{"title":5,"path":402,"stem":403},{"title":407,"path":408,"stem":409},"ProtoTool","/docs/nuxt-protokit/components/proto-tool","0.docs/4.nuxt-protokit/4.components/2.proto-tool",{"title":411,"path":412,"stem":413},"ProtoCrudModal","/docs/nuxt-protokit/components/proto-crud-modal","0.docs/4.nuxt-protokit/4.components/3.proto-crud-modal","i-lucide-puzzle",{"title":151,"path":416,"stem":417,"children":418,"icon":424},"/docs/nuxt-protokit/offline-first","0.docs/4.nuxt-protokit/5.offline-first/1.index",[419,420],{"title":151,"path":416,"stem":417},{"title":421,"path":422,"stem":423},"Corruption Recovery","/docs/nuxt-protokit/offline-first/corruption-recovery","0.docs/4.nuxt-protokit/5.offline-first/2.corruption-recovery","i-lucide-wifi-off",{"title":426,"icon":427,"path":428,"stem":429,"children":430},"Advanced","i-lucide-graduation-cap","/docs/nuxt-protokit/advanced","0.docs/4.nuxt-protokit/6.advanced/1.index",[431,432,436,440],{"title":5,"path":428,"stem":429},{"title":433,"path":434,"stem":435},"Multi-Tool Apps","/docs/nuxt-protokit/advanced/building-a-toolkit","0.docs/4.nuxt-protokit/6.advanced/1.building-a-toolkit",{"title":437,"path":438,"stem":439},"Schema Patterns","/docs/nuxt-protokit/advanced/custom-schema-patterns","0.docs/4.nuxt-protokit/6.advanced/2.custom-schema-patterns",{"title":441,"path":442,"stem":443},"Custom Fields & Viz","/docs/nuxt-protokit/advanced/extensibility","0.docs/4.nuxt-protokit/6.advanced/3.extensibility",{"page":445,"fallbackPage":1848},{"id":446,"title":392,"body":447,"description":1846,"extension":1847,"links":1848,"meta":1849,"navigation":1850,"ogImage":1848,"path":393,"seo":1851,"stem":394,"__hash__":1852},"nuxt_protokit/0.docs/4.nuxt-protokit/3.composables/3.use-proto-doc.md",{"type":448,"value":449,"toc":1829},"minimark",[450,457,461,474,479,603,607,684,688,709,810,813,817,825,829,847,853,858,939,943,950,1004,1007,1011,1033,1037,1050,1053,1057,1064,1232,1238,1274,1281,1297,1415,1419,1644,1648,1662,1819,1825],[451,452,454],"h1",{"id":453},"useprotodoc",[455,456,392],"code",{},[458,459,460],"p",{},"Manages the complete lifecycle of a Y.js document. Handles reference counting, IndexedDB persistence, BroadcastChannel tab sync, server push, snapshot creation, and corruption detection/recovery.",[458,462,463,464,466,467,469,470,473],{},"You rarely need to call this directly — ",[455,465,388],{}," calls it internally. Use ",[455,468,392],{}," when you need direct access to the ",[455,471,472],{},"Y.Doc"," object or the sync state.",[475,476,478],"h2",{"id":477},"signature","Signature",[480,481,486],"pre",{"className":482,"code":483,"language":484,"meta":485,"style":485},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","function useProtoDoc(\n  docKey: string,\n  options?: {\n    enableIndexedDB?: boolean   // default: true\n    enableBroadcast?: boolean   // default: true\n    skipAutoCleanup?: boolean   // default: false\n    disableSync?: boolean       // default: false — override global serverSync config\n  }\n): UseProtoDocReturn\n","typescript","",[455,487,488,505,522,534,550,562,575,588,594],{"__ignoreMap":485},[489,490,493,497,501],"span",{"class":491,"line":492},"line",1,[489,494,496],{"class":495},"spNyl","function",[489,498,500],{"class":499},"s2Zo4"," useProtoDoc",[489,502,504],{"class":503},"sMK4o","(\n",[489,506,508,512,515,519],{"class":491,"line":507},2,[489,509,511],{"class":510},"sHdIc","  docKey",[489,513,514],{"class":503},":",[489,516,518],{"class":517},"sBMFI"," string",[489,520,521],{"class":503},",\n",[489,523,525,528,531],{"class":491,"line":524},3,[489,526,527],{"class":510},"  options",[489,529,530],{"class":503},"?:",[489,532,533],{"class":503}," {\n",[489,535,537,541,543,546],{"class":491,"line":536},4,[489,538,540],{"class":539},"swJcz","    enableIndexedDB",[489,542,530],{"class":503},[489,544,545],{"class":517}," boolean",[489,547,549],{"class":548},"sHwdD","   // default: true\n",[489,551,553,556,558,560],{"class":491,"line":552},5,[489,554,555],{"class":539},"    enableBroadcast",[489,557,530],{"class":503},[489,559,545],{"class":517},[489,561,549],{"class":548},[489,563,565,568,570,572],{"class":491,"line":564},6,[489,566,567],{"class":539},"    skipAutoCleanup",[489,569,530],{"class":503},[489,571,545],{"class":517},[489,573,574],{"class":548},"   // default: false\n",[489,576,578,581,583,585],{"class":491,"line":577},7,[489,579,580],{"class":539},"    disableSync",[489,582,530],{"class":503},[489,584,545],{"class":517},[489,586,587],{"class":548},"       // default: false — override global serverSync config\n",[489,589,591],{"class":491,"line":590},8,[489,592,593],{"class":503},"  }\n",[489,595,597,600],{"class":491,"line":596},9,[489,598,599],{"class":503},"):",[489,601,602],{"class":517}," UseProtoDocReturn\n",[475,604,606],{"id":605},"return-value","Return value",[480,608,610],{"className":482,"code":609,"language":484,"meta":485,"style":485},"interface UseProtoDocReturn {\n  doc:      Y.Doc\n  isReady:  Ref\u003Cboolean>   // true once IndexedDB has loaded\n  destroy:  () => void     // manually trigger cleanup (ref-counted)\n}\n",[455,611,612,622,638,660,679],{"__ignoreMap":485},[489,613,614,617,620],{"class":491,"line":492},[489,615,616],{"class":495},"interface",[489,618,619],{"class":517}," UseProtoDocReturn",[489,621,533],{"class":503},[489,623,624,627,629,632,635],{"class":491,"line":507},[489,625,626],{"class":539},"  doc",[489,628,514],{"class":503},[489,630,631],{"class":517},"      Y",[489,633,634],{"class":503},".",[489,636,637],{"class":517},"Doc\n",[489,639,640,643,645,648,651,654,657],{"class":491,"line":524},[489,641,642],{"class":539},"  isReady",[489,644,514],{"class":503},[489,646,647],{"class":517},"  Ref",[489,649,650],{"class":503},"\u003C",[489,652,653],{"class":517},"boolean",[489,655,656],{"class":503},">",[489,658,659],{"class":548},"   // true once IndexedDB has loaded\n",[489,661,662,665,667,670,673,676],{"class":491,"line":536},[489,663,664],{"class":539},"  destroy",[489,666,514],{"class":503},[489,668,669],{"class":503},"  ()",[489,671,672],{"class":495}," =>",[489,674,675],{"class":517}," void",[489,677,678],{"class":548},"     // manually trigger cleanup (ref-counted)\n",[489,680,681],{"class":491,"line":552},[489,682,683],{"class":503},"}\n",[475,685,687],{"id":686},"document-caching","Document caching",[458,689,690,692,693,697,698,701,702,708],{},[455,691,392],{}," maintains a ",[694,695,696],"strong",{},"module-level reference-counted cache",". If two components call ",[455,699,700],{},"useProtoDoc('my-tool')"," simultaneously, they receive the ",[694,703,704,705,707],{},"same ",[455,706,472],{}," instance",". The document is destroyed only when all consumers have unmounted.",[480,710,712],{"className":482,"code":711,"language":484,"meta":485,"style":485},"// Component A and Component B share the same Y.Doc\nconst { doc: docA } = useProtoDoc('idea-123')\nconst { doc: docB } = useProtoDoc('idea-123')\nconsole.log(docA === docB) // true\n",[455,713,714,719,759,788],{"__ignoreMap":485},[489,715,716],{"class":491,"line":492},[489,717,718],{"class":548},"// Component A and Component B share the same Y.Doc\n",[489,720,721,724,727,730,732,736,739,742,744,747,750,754,756],{"class":491,"line":507},[489,722,723],{"class":495},"const",[489,725,726],{"class":503}," {",[489,728,729],{"class":539}," doc",[489,731,514],{"class":503},[489,733,735],{"class":734},"sTEyZ"," docA ",[489,737,738],{"class":503},"}",[489,740,741],{"class":503}," =",[489,743,500],{"class":499},[489,745,746],{"class":734},"(",[489,748,749],{"class":503},"'",[489,751,753],{"class":752},"sfazB","idea-123",[489,755,749],{"class":503},[489,757,758],{"class":734},")\n",[489,760,761,763,765,767,769,772,774,776,778,780,782,784,786],{"class":491,"line":524},[489,762,723],{"class":495},[489,764,726],{"class":503},[489,766,729],{"class":539},[489,768,514],{"class":503},[489,770,771],{"class":734}," docB ",[489,773,738],{"class":503},[489,775,741],{"class":503},[489,777,500],{"class":499},[489,779,746],{"class":734},[489,781,749],{"class":503},[489,783,753],{"class":752},[489,785,749],{"class":503},[489,787,758],{"class":734},[489,789,790,793,795,798,801,804,807],{"class":491,"line":536},[489,791,792],{"class":734},"console",[489,794,634],{"class":503},[489,796,797],{"class":499},"log",[489,799,800],{"class":734},"(docA ",[489,802,803],{"class":503},"===",[489,805,806],{"class":734}," docB) ",[489,808,809],{"class":548},"// true\n",[458,811,812],{},"This is safe and intended — it enables multiple components to observe and modify the same document simultaneously, with Y.js merging changes automatically.",[475,814,816],{"id":815},"lifecycle","Lifecycle",[480,818,823],{"className":819,"code":821,"language":822},[820],"language-text","Component mounts\n      │\n      ▼\nuseProtoDoc('key')\n      │\n      ├── Check cache: existing doc? → return cached + increment ref count\n      │\n      └── New doc:\n            ├── new Y.Doc()\n            ├── new IndexeddbPersistence('proto:key', doc)\n            │     └── loads stored data from browser DB\n            ├── isReady = true  ← when IndexedDB fires 'synced' event\n            ├── new BroadcastChannel('proto:key')\n            │     └── notifies other tabs of updates\n            └── if serverSync enabled:\n                  └── push doc state + create snapshot (30s debounce on updates)\n\nComponent unmounts\n      │\n      └── decrement ref count\n            └── if ref count === 0:\n                  ├── clear debounced server push timer\n                  ├── destroy BroadcastChannel\n                  ├── destroy IndexeddbPersistence\n                  └── remove from cache\n","text",[455,824,821],{"__ignoreMap":485},[475,826,828],{"id":827},"server-sync","Server sync",[458,830,831,832,835,836,839,840,842,843,846],{},"Server sync is controlled by the ",[455,833,834],{},"protokit.serverSync"," option in ",[455,837,838],{},"nuxt.config.ts",". When enabled, ",[455,841,392],{}," pushes the document state every ",[694,844,845],{},"30 seconds"," (debounced on changes):",[480,848,851],{"className":849,"code":850,"language":822},[820],"Client                                Server (yjs-sync or compatible)\n──────                                ───────────────────────────────\nPOST {baseUrl}/sync  ──────────────►  Stores binary Y.js updates\nPOST {baseUrl}/snapshots/create ───►  Creates deduplicated JSON snapshot\n",[455,852,850],{"__ignoreMap":485},[854,855,857],"h3",{"id":856},"global-config","Global config",[480,859,861],{"className":482,"code":860,"language":484,"meta":485,"style":485},"// nuxt.config.ts\nprotokit: {\n  serverSync: true,                    // default — enabled, baseUrl: '/api/yjs'\n  serverSync: false,                   // disabled — zero HTTP calls made\n  serverSync: { baseUrl: '/api/yjs' }, // custom server base URL\n}\n",[455,862,863,868,877,894,908,935],{"__ignoreMap":485},[489,864,865],{"class":491,"line":492},[489,866,867],{"class":548},"// nuxt.config.ts\n",[489,869,870,873,875],{"class":491,"line":507},[489,871,872],{"class":517},"protokit",[489,874,514],{"class":503},[489,876,533],{"class":503},[489,878,879,882,884,888,891],{"class":491,"line":524},[489,880,881],{"class":517},"  serverSync",[489,883,514],{"class":503},[489,885,887],{"class":886},"sfNiH"," true",[489,889,890],{"class":503},",",[489,892,893],{"class":548},"                    // default — enabled, baseUrl: '/api/yjs'\n",[489,895,896,898,900,903,905],{"class":491,"line":536},[489,897,881],{"class":517},[489,899,514],{"class":503},[489,901,902],{"class":886}," false",[489,904,890],{"class":503},[489,906,907],{"class":548},"                   // disabled — zero HTTP calls made\n",[489,909,910,912,914,916,919,921,924,927,929,932],{"class":491,"line":552},[489,911,881],{"class":517},[489,913,514],{"class":503},[489,915,726],{"class":503},[489,917,918],{"class":517}," baseUrl",[489,920,514],{"class":503},[489,922,923],{"class":503}," '",[489,925,926],{"class":752},"/api/yjs",[489,928,749],{"class":503},[489,930,931],{"class":503}," },",[489,933,934],{"class":548}," // custom server base URL\n",[489,936,937],{"class":491,"line":564},[489,938,683],{"class":503},[854,940,942],{"id":941},"per-document-override","Per-document override",[458,944,945,946,949],{},"Pass ",[455,947,948],{},"disableSync: true"," to suppress server sync for one specific document, regardless of global config. Useful for public demo tools or scratch pads that should not accumulate server snapshots:",[480,951,953],{"className":482,"code":952,"language":484,"meta":485,"style":485},"// This doc never syncs to the server, even if serverSync: true globally\nconst { doc, isReady } = useProtoDoc('public-demo', { disableSync: true })\n",[455,954,955,960],{"__ignoreMap":485},[489,956,957],{"class":491,"line":492},[489,958,959],{"class":548},"// This doc never syncs to the server, even if serverSync: true globally\n",[489,961,962,964,966,968,970,973,975,977,979,981,983,986,988,990,992,995,997,999,1002],{"class":491,"line":507},[489,963,723],{"class":495},[489,965,726],{"class":503},[489,967,729],{"class":734},[489,969,890],{"class":503},[489,971,972],{"class":734}," isReady ",[489,974,738],{"class":503},[489,976,741],{"class":503},[489,978,500],{"class":499},[489,980,746],{"class":734},[489,982,749],{"class":503},[489,984,985],{"class":752},"public-demo",[489,987,749],{"class":503},[489,989,890],{"class":503},[489,991,726],{"class":503},[489,993,994],{"class":539}," disableSync",[489,996,514],{"class":503},[489,998,887],{"class":886},[489,1000,1001],{"class":503}," }",[489,1003,758],{"class":734},[458,1005,1006],{},"The document still persists to IndexedDB locally.",[854,1008,1010],{"id":1009},"what-happens-when-sync-is-disabled","What happens when sync is disabled",[1012,1013,1014,1022,1027,1030],"ul",{},[1015,1016,1017,1018,1021],"li",{},"No ",[455,1019,1020],{},"POST /api/yjs/sync"," calls are made",[1015,1023,1017,1024,1021],{},[455,1025,1026],{},"POST /api/yjs/snapshots/create",[1015,1028,1029],{},"If IndexedDB corruption occurs, the recovery modal shows only \"Start fresh\" (no server backup to restore from)",[1015,1031,1032],{},"Local IndexedDB + BroadcastChannel tab sync work normally",[475,1034,1036],{"id":1035},"broadcastchannel-tab-sync","BroadcastChannel tab sync",[458,1038,1039,1040,1042,1043,1046,1047,1049],{},"When a doc is updated in one browser tab, ",[455,1041,392],{}," broadcasts the update to all other tabs via ",[455,1044,1045],{},"BroadcastChannel",". Other tabs apply the update to their in-memory ",[455,1048,472],{}," immediately — no round-trip to the server.",[458,1051,1052],{},"This means: open the same tool in two tabs, type in one — the other updates in real time, offline.",[475,1054,1056],{"id":1055},"readiness-guard","Readiness guard",[458,1058,1059,1060,1063],{},"Always wait for ",[455,1061,1062],{},"isReady"," before reading field values:",[480,1065,1067],{"className":482,"code":1066,"language":484,"meta":485,"style":485},"const { doc, isReady } = useProtoDoc('my-tool')\n\nwatch(isReady, (ready) => {\n  if (ready) {\n    const fieldsMap = doc.getMap('fields')\n    console.log('stored MRR:', fieldsMap.get('mrr'))\n  }\n}, { immediate: true })\n",[455,1068,1069,1098,1104,1127,1143,1171,1210,1214],{"__ignoreMap":485},[489,1070,1071,1073,1075,1077,1079,1081,1083,1085,1087,1089,1091,1094,1096],{"class":491,"line":492},[489,1072,723],{"class":495},[489,1074,726],{"class":503},[489,1076,729],{"class":734},[489,1078,890],{"class":503},[489,1080,972],{"class":734},[489,1082,738],{"class":503},[489,1084,741],{"class":503},[489,1086,500],{"class":499},[489,1088,746],{"class":734},[489,1090,749],{"class":503},[489,1092,1093],{"class":752},"my-tool",[489,1095,749],{"class":503},[489,1097,758],{"class":734},[489,1099,1100],{"class":491,"line":507},[489,1101,1103],{"emptyLinePlaceholder":1102},true,"\n",[489,1105,1106,1109,1112,1114,1117,1120,1123,1125],{"class":491,"line":524},[489,1107,1108],{"class":499},"watch",[489,1110,1111],{"class":734},"(isReady",[489,1113,890],{"class":503},[489,1115,1116],{"class":503}," (",[489,1118,1119],{"class":510},"ready",[489,1121,1122],{"class":503},")",[489,1124,672],{"class":495},[489,1126,533],{"class":503},[489,1128,1129,1133,1135,1137,1140],{"class":491,"line":536},[489,1130,1132],{"class":1131},"s7zQu","  if",[489,1134,1116],{"class":539},[489,1136,1119],{"class":734},[489,1138,1139],{"class":539},") ",[489,1141,1142],{"class":503},"{\n",[489,1144,1145,1148,1151,1153,1155,1157,1160,1162,1164,1167,1169],{"class":491,"line":552},[489,1146,1147],{"class":495},"    const",[489,1149,1150],{"class":734}," fieldsMap",[489,1152,741],{"class":503},[489,1154,729],{"class":734},[489,1156,634],{"class":503},[489,1158,1159],{"class":499},"getMap",[489,1161,746],{"class":539},[489,1163,749],{"class":503},[489,1165,1166],{"class":752},"fields",[489,1168,749],{"class":503},[489,1170,758],{"class":539},[489,1172,1173,1176,1178,1180,1182,1184,1187,1189,1191,1193,1195,1198,1200,1202,1205,1207],{"class":491,"line":564},[489,1174,1175],{"class":734},"    console",[489,1177,634],{"class":503},[489,1179,797],{"class":499},[489,1181,746],{"class":539},[489,1183,749],{"class":503},[489,1185,1186],{"class":752},"stored MRR:",[489,1188,749],{"class":503},[489,1190,890],{"class":503},[489,1192,1150],{"class":734},[489,1194,634],{"class":503},[489,1196,1197],{"class":499},"get",[489,1199,746],{"class":539},[489,1201,749],{"class":503},[489,1203,1204],{"class":752},"mrr",[489,1206,749],{"class":503},[489,1208,1209],{"class":539},"))\n",[489,1211,1212],{"class":491,"line":577},[489,1213,593],{"class":503},[489,1215,1216,1219,1221,1224,1226,1228,1230],{"class":491,"line":590},[489,1217,1218],{"class":503},"},",[489,1220,726],{"class":503},[489,1222,1223],{"class":539}," immediate",[489,1225,514],{"class":503},[489,1227,887],{"class":886},[489,1229,1001],{"class":503},[489,1231,758],{"class":734},[458,1233,1234,1235,514],{},"In templates, guard with ",[455,1236,1237],{},"v-if",[480,1239,1243],{"className":1240,"code":1241,"language":1242,"meta":485,"style":485},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003CClientOnly>\n  \u003CMyTool v-if=\"isReady\" :doc=\"doc\" />\n  \u003CUSkeleton v-else />\n\u003C/ClientOnly>\n","vue",[455,1244,1245,1255,1260,1265],{"__ignoreMap":485},[489,1246,1247,1249,1252],{"class":491,"line":492},[489,1248,650],{"class":503},[489,1250,1251],{"class":539},"ClientOnly",[489,1253,1254],{"class":503},">\n",[489,1256,1257],{"class":491,"line":507},[489,1258,1259],{"class":734},"  \u003CMyTool v-if=\"isReady\" :doc=\"doc\" />\n",[489,1261,1262],{"class":491,"line":524},[489,1263,1264],{"class":734},"  \u003CUSkeleton v-else />\n",[489,1266,1267,1270,1272],{"class":491,"line":536},[489,1268,1269],{"class":503},"\u003C/",[489,1271,1251],{"class":539},[489,1273,1254],{"class":503},[475,1275,1277,1278,1280],{"id":1276},"the-clientonly-requirement","The ",[455,1279,1251],{}," requirement",[458,1282,1283,1284,1287,1288,1290,1291,1293,1294,514],{},"Because ",[455,1285,1286],{},"IndexeddbPersistence"," uses browser APIs unavailable on the server, always wrap components that use ",[455,1289,392],{}," (or ",[455,1292,388],{},") in ",[455,1295,1296],{},"\u003CClientOnly>",[480,1298,1300],{"className":1240,"code":1299,"language":1242,"meta":485,"style":485},"\u003Ctemplate>\n  \u003CClientOnly>\n    \u003CProtoTool :schema=\"mySchema\" />\n    \u003Ctemplate #fallback>\n      \u003Cdiv class=\"animate-pulse\">Loading…\u003C/div>\n    \u003C/template>\n  \u003C/ClientOnly>\n\u003C/template>\n",[455,1301,1302,1311,1320,1344,1358,1389,1398,1407],{"__ignoreMap":485},[489,1303,1304,1306,1309],{"class":491,"line":492},[489,1305,650],{"class":503},[489,1307,1308],{"class":539},"template",[489,1310,1254],{"class":503},[489,1312,1313,1316,1318],{"class":491,"line":507},[489,1314,1315],{"class":503},"  \u003C",[489,1317,1251],{"class":539},[489,1319,1254],{"class":503},[489,1321,1322,1325,1327,1330,1333,1336,1339,1341],{"class":491,"line":524},[489,1323,1324],{"class":503},"    \u003C",[489,1326,407],{"class":539},[489,1328,1329],{"class":495}," :schema",[489,1331,1332],{"class":503},"=",[489,1334,1335],{"class":503},"\"",[489,1337,1338],{"class":752},"mySchema",[489,1340,1335],{"class":503},[489,1342,1343],{"class":503}," />\n",[489,1345,1346,1348,1350,1353,1356],{"class":491,"line":536},[489,1347,1324],{"class":503},[489,1349,1308],{"class":539},[489,1351,1352],{"class":503}," #",[489,1354,1355],{"class":495},"fallback",[489,1357,1254],{"class":503},[489,1359,1360,1363,1366,1369,1371,1373,1376,1378,1380,1383,1385,1387],{"class":491,"line":552},[489,1361,1362],{"class":503},"      \u003C",[489,1364,1365],{"class":539},"div",[489,1367,1368],{"class":495}," class",[489,1370,1332],{"class":503},[489,1372,1335],{"class":503},[489,1374,1375],{"class":752},"animate-pulse",[489,1377,1335],{"class":503},[489,1379,656],{"class":503},[489,1381,1382],{"class":734},"Loading…",[489,1384,1269],{"class":503},[489,1386,1365],{"class":539},[489,1388,1254],{"class":503},[489,1390,1391,1394,1396],{"class":491,"line":564},[489,1392,1393],{"class":503},"    \u003C/",[489,1395,1308],{"class":539},[489,1397,1254],{"class":503},[489,1399,1400,1403,1405],{"class":491,"line":577},[489,1401,1402],{"class":503},"  \u003C/",[489,1404,1251],{"class":539},[489,1406,1254],{"class":503},[489,1408,1409,1411,1413],{"class":491,"line":590},[489,1410,1269],{"class":503},[489,1412,1308],{"class":539},[489,1414,1254],{"class":503},[475,1416,1418],{"id":1417},"accessing-the-raw-ydoc","Accessing the raw Y.Doc",[480,1420,1422],{"className":482,"code":1421,"language":484,"meta":485,"style":485},"const { doc } = useProtoDoc('my-tool')\n\n// Read a value directly\nconst fieldsMap = doc.getMap('fields')\nconst mrr = fieldsMap.get('mrr')\n\n// Write a value directly (in a Y.js transaction)\ndoc.transact(() => {\n  fieldsMap.set('mrr', 15000)\n})\n\n// Observe changes\nfieldsMap.observe(event => {\n  console.log('changed keys:', [...event.keysChanged])\n})\n",[455,1423,1424,1449,1453,1458,1483,1508,1512,1517,1536,1562,1569,1574,1580,1600,1637],{"__ignoreMap":485},[489,1425,1426,1428,1430,1433,1435,1437,1439,1441,1443,1445,1447],{"class":491,"line":492},[489,1427,723],{"class":495},[489,1429,726],{"class":503},[489,1431,1432],{"class":734}," doc ",[489,1434,738],{"class":503},[489,1436,741],{"class":503},[489,1438,500],{"class":499},[489,1440,746],{"class":734},[489,1442,749],{"class":503},[489,1444,1093],{"class":752},[489,1446,749],{"class":503},[489,1448,758],{"class":734},[489,1450,1451],{"class":491,"line":507},[489,1452,1103],{"emptyLinePlaceholder":1102},[489,1454,1455],{"class":491,"line":524},[489,1456,1457],{"class":548},"// Read a value directly\n",[489,1459,1460,1462,1465,1467,1469,1471,1473,1475,1477,1479,1481],{"class":491,"line":536},[489,1461,723],{"class":495},[489,1463,1464],{"class":734}," fieldsMap ",[489,1466,1332],{"class":503},[489,1468,729],{"class":734},[489,1470,634],{"class":503},[489,1472,1159],{"class":499},[489,1474,746],{"class":734},[489,1476,749],{"class":503},[489,1478,1166],{"class":752},[489,1480,749],{"class":503},[489,1482,758],{"class":734},[489,1484,1485,1487,1490,1492,1494,1496,1498,1500,1502,1504,1506],{"class":491,"line":552},[489,1486,723],{"class":495},[489,1488,1489],{"class":734}," mrr ",[489,1491,1332],{"class":503},[489,1493,1150],{"class":734},[489,1495,634],{"class":503},[489,1497,1197],{"class":499},[489,1499,746],{"class":734},[489,1501,749],{"class":503},[489,1503,1204],{"class":752},[489,1505,749],{"class":503},[489,1507,758],{"class":734},[489,1509,1510],{"class":491,"line":564},[489,1511,1103],{"emptyLinePlaceholder":1102},[489,1513,1514],{"class":491,"line":577},[489,1515,1516],{"class":548},"// Write a value directly (in a Y.js transaction)\n",[489,1518,1519,1522,1524,1527,1529,1532,1534],{"class":491,"line":590},[489,1520,1521],{"class":734},"doc",[489,1523,634],{"class":503},[489,1525,1526],{"class":499},"transact",[489,1528,746],{"class":734},[489,1530,1531],{"class":503},"()",[489,1533,672],{"class":495},[489,1535,533],{"class":503},[489,1537,1538,1541,1543,1546,1548,1550,1552,1554,1556,1560],{"class":491,"line":596},[489,1539,1540],{"class":734},"  fieldsMap",[489,1542,634],{"class":503},[489,1544,1545],{"class":499},"set",[489,1547,746],{"class":539},[489,1549,749],{"class":503},[489,1551,1204],{"class":752},[489,1553,749],{"class":503},[489,1555,890],{"class":503},[489,1557,1559],{"class":1558},"sbssI"," 15000",[489,1561,758],{"class":539},[489,1563,1565,1567],{"class":491,"line":1564},10,[489,1566,738],{"class":503},[489,1568,758],{"class":734},[489,1570,1572],{"class":491,"line":1571},11,[489,1573,1103],{"emptyLinePlaceholder":1102},[489,1575,1577],{"class":491,"line":1576},12,[489,1578,1579],{"class":548},"// Observe changes\n",[489,1581,1583,1586,1588,1591,1593,1596,1598],{"class":491,"line":1582},13,[489,1584,1585],{"class":734},"fieldsMap",[489,1587,634],{"class":503},[489,1589,1590],{"class":499},"observe",[489,1592,746],{"class":734},[489,1594,1595],{"class":510},"event",[489,1597,672],{"class":495},[489,1599,533],{"class":503},[489,1601,1603,1606,1608,1610,1612,1614,1617,1619,1621,1624,1627,1629,1631,1634],{"class":491,"line":1602},14,[489,1604,1605],{"class":734},"  console",[489,1607,634],{"class":503},[489,1609,797],{"class":499},[489,1611,746],{"class":539},[489,1613,749],{"class":503},[489,1615,1616],{"class":752},"changed keys:",[489,1618,749],{"class":503},[489,1620,890],{"class":503},[489,1622,1623],{"class":539}," [",[489,1625,1626],{"class":503},"...",[489,1628,1595],{"class":734},[489,1630,634],{"class":503},[489,1632,1633],{"class":734},"keysChanged",[489,1635,1636],{"class":539},"])\n",[489,1638,1640,1642],{"class":491,"line":1639},15,[489,1641,738],{"class":503},[489,1643,758],{"class":734},[475,1645,1647],{"id":1646},"pinia-store-integration","Pinia store integration",[458,1649,1650,1651,1653,1654,1657,1658,1661],{},"When using ",[455,1652,392],{}," inside a Pinia store, ",[694,1655,1656],{},"never"," call ",[455,1659,1660],{},"onUnmounted"," inside the store — it will register to the initializing component and break when that component unmounts. Use the default ref-counting cleanup instead:",[480,1663,1665],{"className":482,"code":1664,"language":484,"meta":485,"style":485},"// ❌ Wrong — causes subtle lifecycle bugs\ndefineStore('myStore', () => {\n  onUnmounted(() => { /* cleanup */ })  // DON'T do this inside a Pinia store\n})\n\n// ✅ Correct — let useProtoDoc's ref counting handle cleanup\ndefineStore('myStore', () => {\n  const { doc, isReady } = useProtoDoc('my-tool', { skipAutoCleanup: true })\n  return { doc, isReady }\n})\n",[455,1666,1667,1672,1695,1719,1725,1729,1734,1754,1797,1813],{"__ignoreMap":485},[489,1668,1669],{"class":491,"line":492},[489,1670,1671],{"class":548},"// ❌ Wrong — causes subtle lifecycle bugs\n",[489,1673,1674,1677,1679,1681,1684,1686,1688,1691,1693],{"class":491,"line":507},[489,1675,1676],{"class":499},"defineStore",[489,1678,746],{"class":734},[489,1680,749],{"class":503},[489,1682,1683],{"class":752},"myStore",[489,1685,749],{"class":503},[489,1687,890],{"class":503},[489,1689,1690],{"class":503}," ()",[489,1692,672],{"class":495},[489,1694,533],{"class":503},[489,1696,1697,1700,1702,1704,1706,1708,1711,1713,1716],{"class":491,"line":524},[489,1698,1699],{"class":499},"  onUnmounted",[489,1701,746],{"class":539},[489,1703,1531],{"class":503},[489,1705,672],{"class":495},[489,1707,726],{"class":503},[489,1709,1710],{"class":548}," /* cleanup */",[489,1712,1001],{"class":503},[489,1714,1715],{"class":539},")  ",[489,1717,1718],{"class":548},"// DON'T do this inside a Pinia store\n",[489,1720,1721,1723],{"class":491,"line":536},[489,1722,738],{"class":503},[489,1724,758],{"class":734},[489,1726,1727],{"class":491,"line":552},[489,1728,1103],{"emptyLinePlaceholder":1102},[489,1730,1731],{"class":491,"line":564},[489,1732,1733],{"class":548},"// ✅ Correct — let useProtoDoc's ref counting handle cleanup\n",[489,1735,1736,1738,1740,1742,1744,1746,1748,1750,1752],{"class":491,"line":577},[489,1737,1676],{"class":499},[489,1739,746],{"class":734},[489,1741,749],{"class":503},[489,1743,1683],{"class":752},[489,1745,749],{"class":503},[489,1747,890],{"class":503},[489,1749,1690],{"class":503},[489,1751,672],{"class":495},[489,1753,533],{"class":503},[489,1755,1756,1759,1761,1763,1765,1768,1770,1772,1774,1776,1778,1780,1782,1784,1786,1789,1791,1793,1795],{"class":491,"line":590},[489,1757,1758],{"class":495},"  const",[489,1760,726],{"class":503},[489,1762,729],{"class":734},[489,1764,890],{"class":503},[489,1766,1767],{"class":734}," isReady",[489,1769,1001],{"class":503},[489,1771,741],{"class":503},[489,1773,500],{"class":499},[489,1775,746],{"class":539},[489,1777,749],{"class":503},[489,1779,1093],{"class":752},[489,1781,749],{"class":503},[489,1783,890],{"class":503},[489,1785,726],{"class":503},[489,1787,1788],{"class":539}," skipAutoCleanup",[489,1790,514],{"class":503},[489,1792,887],{"class":886},[489,1794,1001],{"class":503},[489,1796,758],{"class":539},[489,1798,1799,1802,1804,1806,1808,1810],{"class":491,"line":596},[489,1800,1801],{"class":1131},"  return",[489,1803,726],{"class":503},[489,1805,729],{"class":734},[489,1807,890],{"class":503},[489,1809,1767],{"class":734},[489,1811,1812],{"class":503}," }\n",[489,1814,1815,1817],{"class":491,"line":1564},[489,1816,738],{"class":503},[489,1818,758],{"class":734},[458,1820,945,1821,1824],{},[455,1822,1823],{},"skipAutoCleanup: true"," when the store owns the document lifetime (i.e. the store is a Pinia singleton that outlives any single component).",[1826,1827,1828],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":485,"searchDepth":507,"depth":507,"links":1830},[1831,1832,1833,1834,1835,1840,1841,1842,1844,1845],{"id":477,"depth":507,"text":478},{"id":605,"depth":507,"text":606},{"id":686,"depth":507,"text":687},{"id":815,"depth":507,"text":816},{"id":827,"depth":507,"text":828,"children":1836},[1837,1838,1839],{"id":856,"depth":524,"text":857},{"id":941,"depth":524,"text":942},{"id":1009,"depth":524,"text":1010},{"id":1035,"depth":507,"text":1036},{"id":1055,"depth":507,"text":1056},{"id":1276,"depth":507,"text":1843},"The ClientOnly requirement",{"id":1417,"depth":507,"text":1418},{"id":1646,"depth":507,"text":1647},"Low-level Y.js document lifecycle composable — creates, caches, and manages Y.Doc instances with IndexedDB persistence, optional server sync, and corruption detection.","md",null,{},{"title":392},{"title":392,"description":1846},"DQK35NwVgnEYOmFciocfFboLjLJkf4s1LoiEeSNwm-Q",[1854,1856],{"title":388,"path":389,"stem":390,"description":1855,"children":-1},"The high-level facade composable that combines document management, field sync, CRUD, derived computation, and cross-tool outputs into a single call.",{"title":396,"path":397,"stem":398,"description":1857,"children":-1},"High-level CRUD composable for Y.Array-backed collection lists — reactive items, add/update/remove/move, search, sort, and item count.",1772977477354]