[{"data":1,"prerenderedAt":969},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-protokit/getting-started-en":444,"/docs/nuxt-protokit/getting-started-surround-en":964},[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":959},{"id":446,"title":190,"body":447,"description":957,"extension":958,"links":959,"meta":960,"navigation":961,"ogImage":959,"path":343,"seo":962,"stem":344,"__hash__":963},"nuxt_protokit/0.docs/4.nuxt-protokit/1.getting-started/1.index.md",{"type":448,"value":449,"toc":950},"minimark",[450,454,462,467,470,486,493,497,504,530,537,548,552,560,565,645,649,768,773,876,897,901,924,934,937],[451,452,190],"h1",{"id":453},"introduction",[455,456,457,461],"p",{},[458,459,460],"strong",{},"protokit"," is a Nuxt 4 module for rapid product prototyping. It turns a plain TypeScript schema into a fully working interactive prototype — forms, CRUD lists, computed values, visualizations, and automatic offline persistence — so you can validate ideas and ship working demos without spending time on boilerplate.",[463,464,466],"h2",{"id":465},"the-problem-it-solves","The problem it solves",[455,468,469],{},"Building interactive prototypes by hand is repetitive:",[471,472,473,477,480,483],"ul",{},[474,475,476],"li",{},"Every calculator or configurator needs the same form wiring, computed watchers, and storage layer",[474,478,479],{},"Every CRUD list needs the same add/edit/delete/search/sort boilerplate",[474,481,482],{},"Every time a prototype needs to share data with another, you wire up custom state management",[474,484,485],{},"Changing a field type means touching the template, the store, and the TypeScript types simultaneously",[455,487,488,489,492],{},"protokit removes this repetition. The ",[458,490,491],{},"schema is the single source of truth",". The same object that describes which fields a prototype has also drives its form rendering, computed values, result display, visualizations, and IndexedDB key — all at once.",[463,494,496],{"id":495},"when-to-use-it","When to use it",[455,498,499,500,503],{},"protokit is designed for ",[458,501,502],{},"rapid product prototyping",". If you need to go from idea to working, data-persistent interface fast — without spending time on form wiring, storage, or CRUD boilerplate — it's a good fit:",[471,505,506,512,518,524],{},[474,507,508,511],{},[458,509,510],{},"Product configurators and pricing tools"," — cost models, pricing calculators, ROI estimators with live computed results",[474,513,514,517],{},[458,515,516],{},"Internal dashboards and trackers"," — CRUD-driven views with search, sort, and structured data entry (task trackers, item registries, pipeline boards)",[474,519,520,523],{},[458,521,522],{},"Assessment and evaluation prototypes"," — scoring rubrics, weighted questionnaires, comparison matrices",[474,525,526,529],{},[458,527,528],{},"Connected prototype suites"," — multiple screens sharing computed data through a reactive data graph",[455,531,532,533,536],{},"It is ",[458,534,535],{},"not"," designed for:",[471,538,539,542,545],{},[474,540,541],{},"General-purpose form libraries with arbitrary validation logic — use Vee-Validate or Formkit",[474,543,544],{},"Production database-backed admin panels — use a headless CMS or Nuxt UI Pro data tables",[474,546,547],{},"Real-time collaborative text editors — Y.js is the foundation, but you would be working at a lower level",[463,549,551],{"id":550},"auto-imported-api-surface","Auto-imported API surface",[455,553,554,555,559],{},"After adding the module to ",[556,557,558],"code",{},"nuxt.config.ts",", the following are available globally without any import statement:",[455,561,562],{},[458,563,564],{},"Utils",[566,567,568,581],"table",{},[569,570,571],"thead",{},[572,573,574,578],"tr",{},[575,576,577],"th",{},"Name",[575,579,580],{},"Description",[582,583,584,595,605,615,625,635],"tbody",{},[572,585,586,592],{},[587,588,589],"td",{},[556,590,591],{},"definePrototype",[587,593,594],{},"Type-safe schema definition helper (identity function for inference)",[572,596,597,602],{},[587,598,599],{},[556,600,601],{},"defineCollection",[587,603,604],{},"Type-safe collection schema helper",[572,606,607,612],{},[587,608,609],{},[556,610,611],{},"formatMoney",[587,613,614],{},"Format a number as currency",[572,616,617,622],{},[587,618,619],{},[556,620,621],{},"formatPercent",[587,623,624],{},"Format a number as a percentage",[572,626,627,632],{},[587,628,629],{},[556,630,631],{},"formatNumber",[587,633,634],{},"Format a number with locale-aware separators",[572,636,637,642],{},[587,638,639],{},[556,640,641],{},"formatDate",[587,643,644],{},"Format an ISO date string for display",[455,646,647],{},[458,648,335],{},[566,650,651,659],{},[569,652,653],{},[572,654,655,657],{},[575,656,577],{},[575,658,580],{},[582,660,661,670,679,689,699,708,718,728,738,748,758],{},[572,662,663,667],{},[587,664,665],{},[556,666,388],{},[587,668,669],{},"High-level facade — fields, derived, collections, reset, isReady",[572,671,672,676],{},[587,673,674],{},[556,675,392],{},[587,677,678],{},"Y.js document lifecycle — IndexedDB, BroadcastChannel, server sync",[572,680,681,686],{},[587,682,683],{},[556,684,685],{},"useProtoMap",[587,687,688],{},"Bidirectional Y.Map ↔ reactive refs sync",[572,690,691,696],{},[587,692,693],{},[556,694,695],{},"useProtoList",[587,697,698],{},"Low-level Y.Array CRUD",[572,700,701,705],{},[587,702,703],{},[556,704,396],{},[587,706,707],{},"High-level CRUD with search, sort, and item count",[572,709,710,715],{},[587,711,712],{},[556,713,714],{},"useProtoDerived",[587,716,717],{},"Reactive derived value computation from a schema and context",[572,719,720,725],{},[587,721,722],{},[556,723,724],{},"useProtoOutputs",[587,726,727],{},"Cross-prototype produces/consumes wiring via shared Y.Maps",[572,729,730,735],{},[587,731,732],{},[556,733,734],{},"useProtoDraft",[587,736,737],{},"Draft persistence for modal item editors",[572,739,740,745],{},[587,741,742],{},[556,743,744],{},"useProtoCorruption",[587,746,747],{},"Corruption event queue and recovery flow",[572,749,750,755],{},[587,751,752],{},[556,753,754],{},"useProtoRegistry",[587,756,757],{},"Global schema registry — register and look up schemas by key",[572,759,760,765],{},[587,761,762],{},[556,763,764],{},"useProtoKitConfig",[587,766,767],{},"Read the module's runtime config (serverSync enabled, baseUrl)",[455,769,770,772],{},[458,771,401],{}," (globally registered)",[566,774,775,783],{},[569,776,777],{},[572,778,779,781],{},[575,780,577],{},[575,782,580],{},[582,784,785,794,804,814,823,836,846,856,866],{},[572,786,787,791],{},[587,788,789],{},[556,790,407],{},[587,792,793],{},"Full prototype renderer — form, results, viz, collections, actions",[572,795,796,801],{},[587,797,798],{},[556,799,800],{},"ProtoForm",[587,802,803],{},"Form fields only, driven by schema fields or sections",[572,805,806,811],{},[587,807,808],{},[556,809,810],{},"ProtoCrudList",[587,812,813],{},"CRUD list or table for a single collection",[572,815,816,820],{},[587,817,818],{},[556,819,411],{},[587,821,822],{},"Modal item editor with automatic draft persistence",[572,824,825,830],{},[587,826,827],{},[556,828,829],{},"ProtoStatGrid",[587,831,832,833],{},"Stat card grid from ",[556,834,835],{},"results.stats",[572,837,838,843],{},[587,839,840],{},[556,841,842],{},"ProtoViz",[587,844,845],{},"Single visualization renderer",[572,847,848,853],{},[587,849,850],{},[556,851,852],{},"ProtoActionBar",[587,854,855],{},"Copy / export / reset action toolbar",[572,857,858,863],{},[587,859,860],{},[556,861,862],{},"ProtoDebugPanel",[587,864,865],{},"Dev-only Y.js state inspector",[572,867,868,873],{},[587,869,870],{},[556,871,872],{},"ProtoCorruptionModal",[587,874,875],{},"Non-dismissible corruption recovery modal",[455,877,878,879,882,883,882,886,889,890,882,893,896],{},"All field components (",[556,880,881],{},"ProtoFieldText",", ",[556,884,885],{},"ProtoFieldNumber",[556,887,888],{},"ProtoFieldSelect",", …) and visualization components (",[556,891,892],{},"VizProgressBar",[556,894,895],{},"VizBarChart",", …) are also globally registered for custom layout use.",[463,898,900],{"id":899},"server-sync-backend","Server sync backend",[455,902,903,904,907,908,882,911,882,914,917,918,923],{},"protokit handles the ",[458,905,906],{},"client side"," of persistence only. Cross-device sync and server-backed corruption recovery require a backend that implements the Y.js sync API endpoints (",[556,909,910],{},"POST /api/yjs/sync",[556,912,913],{},"GET /api/yjs/pull",[556,915,916],{},"GET /api/yjs/snapshots/:key","). You can use the separate ",[458,919,920],{},[556,921,922],{},"yjs-sync"," companion module or implement the endpoints yourself.",[925,926,931],"pre",{"className":927,"code":929,"language":930},[928],"language-text","Client (protokit)                      Server (yjs-sync)\n─────────────────                      ─────────────────\nuseProtoDoc                        ──► POST /api/yjs/sync\n  ├─ IndexedDB persistence              └─ Stores binary updates in D1/SQLite\n  ├─ BroadcastChannel tab sync     ──► POST /api/yjs/snapshots/create\n  └─ 30s debounced server push          └─ Deduplicated JSON snapshots\n                                   ◄── GET  /api/yjs/pull\n                                   ◄── GET  /api/yjs/snapshots/{key}\n","text",[556,932,929],{"__ignoreMap":933},"",[455,935,936],{},"The server module is required for cross-device sync and the full corruption recovery flow. Without it, prototypes still persist locally via IndexedDB — the corruption modal simply will not offer a \"restore from server backup\" option.",[455,938,939,940,943,944,949],{},"Server sync is controlled via the ",[556,941,942],{},"protokit.serverSync"," config key. See ",[945,946,948],"a",{"href":947},"/docs/nuxt-protokit/offline-first#server-sync","Server Sync →",".",{"title":933,"searchDepth":951,"depth":951,"links":952},2,[953,954,955,956],{"id":465,"depth":951,"text":466},{"id":495,"depth":951,"text":496},{"id":550,"depth":951,"text":551},{"id":899,"depth":951,"text":900},"What protokit is, what problems it solves, and how it fits into a Nuxt 4 project.","md",null,{},{"title":190},{"title":190,"description":957},"v1C82wXAbS6NiUU4ld9EWVEsbwtNiyCiQh6wQeSglq4",[965,967],{"title":5,"path":340,"stem":341,"description":966,"children":-1},"Schema-driven rapid prototyping for Nuxt 4 — from TypeScript schema to interactive prototype in minutes.",{"title":348,"path":349,"stem":350,"description":968,"children":-1},"The mental model behind protokit — schemas, Y.js documents, the produces/consumes data graph, and how everything connects.",1772977474801]