[{"data":1,"prerenderedAt":1459},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-protokit/getting-started/concepts-en":444,"/docs/nuxt-protokit/getting-started/concepts-surround-en":1454},[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":1449},{"id":446,"title":348,"body":447,"description":1447,"extension":1448,"links":1449,"meta":1450,"navigation":1451,"ogImage":1449,"path":349,"seo":1452,"stem":350,"__hash__":1453},"nuxt_protokit/0.docs/4.nuxt-protokit/1.getting-started/2.concepts.md",{"type":448,"value":449,"toc":1440},"minimark",[450,454,458,463,471,481,484,488,500,534,541,567,573,577,584,800,810,890,904,908,918,1014,1017,1042,1052,1056,1059,1398,1436],[451,452,348],"h1",{"id":453},"core-concepts",[455,456,457],"p",{},"Five ideas underpin everything in protokit. Understanding them makes the rest of the docs straightforward.",[459,460,462],"h2",{"id":461},"_1-the-schema-is-the-single-source-of-truth","1. The schema is the single source of truth",[455,464,465,466,470],{},"A ",[467,468,469],"code",{},"PrototypeSchema"," object controls every aspect of a prototype:",[472,473,478],"pre",{"className":474,"code":476,"language":477},[475],"language-text","PrototypeSchema\n├── fields          → form inputs rendered by ProtoForm\n├── sections        → grouped form inputs (tabs or collapsible panels)\n├── collections     → CRUD lists (tasks, records, entries…)\n├── derived         → computed values recomputed on every change\n├── results         → badge + stat cards shown below the form\n├── visualizations  → charts, tables, timelines\n├── cards           → summary cards for dashboard views\n├── actions         → copy, export-markdown, reset with confirmation\n├── produces        → keys this prototype writes to the shared output map\n├── consumes        → upstream prototype.field paths this prototype reads\n└── layout          → custom dashboard layout (tabs, rows, columns)\n","text",[467,479,476],{"__ignoreMap":480},"",[455,482,483],{},"You define the schema once. Every component — form, results, visualizations, CRUD modals — reads from it at runtime. Changing a field label is one line.",[459,485,487],{"id":486},"_2-every-prototype-lives-in-a-yjs-document","2. Every prototype lives in a Y.js document",[455,489,490,491,495,496,499],{},"Every prototype is backed by a ",[492,493,494],"strong",{},"Y.js document"," (",[467,497,498],{},"Y.Doc","). Y.js is a CRDT library that provides:",[501,502,503,522,528],"ul",{},[504,505,506,509,510,513,514,517,518,521],"li",{},[492,507,508],{},"Shared data types",": ",[467,511,512],{},"Y.Map"," (key-value), ",[467,515,516],{},"Y.Array"," (ordered list), ",[467,519,520],{},"Y.Text"," (plain text)",[504,523,524,527],{},[492,525,526],{},"Local-first storage",": changes go to IndexedDB immediately, before any network round-trip",[504,529,530,533],{},[492,531,532],{},"Automatic merge",": concurrent edits in multiple tabs or devices merge without conflicts",[455,535,536,537,540],{},"When you write ",[467,538,539],{},"\u003CProtoTool :schema=\"mySchema\" doc-key=\"my-tool\" />",", the module:",[542,543,544,553,560],"ol",{},[504,545,546,547,549,550],{},"Opens (or reuses) a ",[467,548,498],{}," identified by ",[467,551,552],{},"doc-key",[504,554,555,556,559],{},"Attaches ",[467,557,558],{},"IndexeddbPersistence"," — the doc survives page reloads",[504,561,562,563,566],{},"Starts syncing to the server when connectivity is available (via the ",[467,564,565],{},"yjs-sync"," module)",[472,568,571],{"className":569,"code":570,"language":477},[475],"           Y.Doc \"my-tool\"\n          ┌──────────────────────────────┐\n          │  Y.Map  \"fields\"             │  ← form state\n          │  Y.Map  \"outputs:my-tool\"   │  ← produces values\n          │  Y.Array \"collection:items\" │  ← CRUD items\n          │  Y.Map  \"draft:item-abc\"    │  ← modal draft\n          └──────────────────────────────┘\n                   │              ▲\n           IndexedDB          server sync\n           (always)           (when online)\n",[467,572,570],{"__ignoreMap":480},[459,574,576],{"id":575},"_3-derived-values-are-pure-functions","3. Derived values are pure functions",[455,578,579,580,583],{},"Derived values are ",[492,581,582],{},"synchronous, side-effect-free"," functions that transform the current state into a new value:",[472,585,589],{"className":586,"code":587,"language":588,"meta":480,"style":480},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","derived: {\n  monthlyCost: {\n    compute: ({ fields }) => fields.seats * fields.pricePerSeat,\n    format:  { type: 'money', currency: '€' },\n  },\n  annualCost: {\n    compute: ({ fields, derived }) => derived.monthlyCost * 12,\n    format:  { type: 'money', currency: '€' },\n  },\n}\n","typescript",[467,590,591,607,617,661,705,711,721,756,789,794],{"__ignoreMap":480},[592,593,596,600,604],"span",{"class":594,"line":595},"line",1,[592,597,599],{"class":598},"sBMFI","derived",[592,601,603],{"class":602},"sMK4o",":",[592,605,606],{"class":602}," {\n",[592,608,610,613,615],{"class":594,"line":609},2,[592,611,612],{"class":598},"  monthlyCost",[592,614,603],{"class":602},[592,616,606],{"class":602},[592,618,620,623,625,628,632,635,639,642,645,648,651,653,655,658],{"class":594,"line":619},3,[592,621,622],{"class":598},"    compute",[592,624,603],{"class":602},[592,626,627],{"class":602}," ({",[592,629,631],{"class":630},"sHdIc"," fields",[592,633,634],{"class":602}," })",[592,636,638],{"class":637},"spNyl"," =>",[592,640,631],{"class":641},"sTEyZ",[592,643,644],{"class":602},".",[592,646,647],{"class":641},"seats",[592,649,650],{"class":602}," *",[592,652,631],{"class":641},[592,654,644],{"class":602},[592,656,657],{"class":641},"pricePerSeat",[592,659,660],{"class":602},",\n",[592,662,664,667,669,672,675,677,680,684,687,690,693,695,697,700,702],{"class":594,"line":663},4,[592,665,666],{"class":598},"    format",[592,668,603],{"class":602},[592,670,671],{"class":602},"  {",[592,673,674],{"class":598}," type",[592,676,603],{"class":602},[592,678,679],{"class":602}," '",[592,681,683],{"class":682},"sfazB","money",[592,685,686],{"class":602},"'",[592,688,689],{"class":602},",",[592,691,692],{"class":598}," currency",[592,694,603],{"class":602},[592,696,679],{"class":602},[592,698,699],{"class":682},"€",[592,701,686],{"class":602},[592,703,704],{"class":602}," },\n",[592,706,708],{"class":594,"line":707},5,[592,709,710],{"class":602},"  },\n",[592,712,714,717,719],{"class":594,"line":713},6,[592,715,716],{"class":598},"  annualCost",[592,718,603],{"class":602},[592,720,606],{"class":602},[592,722,724,726,728,730,732,734,737,739,741,743,745,748,750,754],{"class":594,"line":723},7,[592,725,622],{"class":598},[592,727,603],{"class":602},[592,729,627],{"class":602},[592,731,631],{"class":630},[592,733,689],{"class":602},[592,735,736],{"class":630}," derived",[592,738,634],{"class":602},[592,740,638],{"class":637},[592,742,736],{"class":641},[592,744,644],{"class":602},[592,746,747],{"class":641},"monthlyCost",[592,749,650],{"class":602},[592,751,753],{"class":752},"sbssI"," 12",[592,755,660],{"class":602},[592,757,759,761,763,765,767,769,771,773,775,777,779,781,783,785,787],{"class":594,"line":758},8,[592,760,666],{"class":598},[592,762,603],{"class":602},[592,764,671],{"class":602},[592,766,674],{"class":598},[592,768,603],{"class":602},[592,770,679],{"class":602},[592,772,683],{"class":682},[592,774,686],{"class":602},[592,776,689],{"class":602},[592,778,692],{"class":598},[592,780,603],{"class":602},[592,782,679],{"class":602},[592,784,699],{"class":682},[592,786,686],{"class":602},[592,788,704],{"class":602},[592,790,792],{"class":594,"line":791},9,[592,793,710],{"class":602},[592,795,797],{"class":594,"line":796},10,[592,798,799],{"class":602},"}\n",[455,801,802,803,806,807,603],{},"The ",[467,804,805],{},"compute"," function receives a ",[467,808,809],{},"ComputeContext",[811,812,813,829],"table",{},[814,815,816],"thead",{},[817,818,819,823,826],"tr",{},[820,821,822],"th",{},"Property",[820,824,825],{},"Type",[820,827,828],{},"Contains",[830,831,832,848,861,875],"tbody",{},[817,833,834,840,845],{},[835,836,837],"td",{},[467,838,839],{},"fields",[835,841,842],{},[467,843,844],{},"Record\u003Cstring, any>",[835,846,847],{},"Unwrapped current field values",[817,849,850,854,858],{},[835,851,852],{},[467,853,599],{},[835,855,856],{},[467,857,844],{},[835,859,860],{},"Previously computed derived values (definition order)",[817,862,863,868,872],{},[835,864,865],{},[467,866,867],{},"connections",[835,869,870],{},[467,871,844],{},[835,873,874],{},"Data flowing in from upstream tools",[817,876,877,882,887],{},[835,878,879],{},[467,880,881],{},"collections",[835,883,884],{},[467,885,886],{},"Record\u003Cstring, any[]>",[835,888,889],{},"CRUD collection items",[455,891,892,893,896,897,900,901,644],{},"Derived values are computed in ",[492,894,895],{},"definition order",". A derived value may reference earlier ones via ",[467,898,899],{},"derived.earlier",", but referencing a later key returns ",[467,902,903],{},"undefined",[459,905,907],{"id":906},"_4-produces-consumes-the-data-graph","4. Produces / Consumes — the data graph",[455,909,910,911,914,915,603],{},"Prototypes can share computed data without tight coupling via ",[467,912,913],{},"produces"," and ",[467,916,917],{},"consumes",[472,919,921],{"className":586,"code":920,"language":588,"meta":480,"style":480},"// Prototype A — writes to a shared output map\nproduces: {\n  unitCost:  'derived.unitCost',\n  margin:    'derived.contributionMargin',\n}\n\n// Prototype B — reads from Prototype A's output map\nconsumes: {\n  upstreamUnitCost: 'prototype-a.unitCost',\n}\n",[467,922,923,929,937,954,971,975,981,986,994,1010],{"__ignoreMap":480},[592,924,925],{"class":594,"line":595},[592,926,928],{"class":927},"sHwdD","// Prototype A — writes to a shared output map\n",[592,930,931,933,935],{"class":594,"line":609},[592,932,913],{"class":598},[592,934,603],{"class":602},[592,936,606],{"class":602},[592,938,939,942,944,947,950,952],{"class":594,"line":619},[592,940,941],{"class":598},"  unitCost",[592,943,603],{"class":602},[592,945,946],{"class":602},"  '",[592,948,949],{"class":682},"derived.unitCost",[592,951,686],{"class":602},[592,953,660],{"class":602},[592,955,956,959,961,964,967,969],{"class":594,"line":663},[592,957,958],{"class":598},"  margin",[592,960,603],{"class":602},[592,962,963],{"class":602},"    '",[592,965,966],{"class":682},"derived.contributionMargin",[592,968,686],{"class":602},[592,970,660],{"class":602},[592,972,973],{"class":594,"line":707},[592,974,799],{"class":602},[592,976,977],{"class":594,"line":713},[592,978,980],{"emptyLinePlaceholder":979},true,"\n",[592,982,983],{"class":594,"line":723},[592,984,985],{"class":927},"// Prototype B — reads from Prototype A's output map\n",[592,987,988,990,992],{"class":594,"line":758},[592,989,917],{"class":598},[592,991,603],{"class":602},[592,993,606],{"class":602},[592,995,996,999,1001,1003,1006,1008],{"class":594,"line":791},[592,997,998],{"class":598},"  upstreamUnitCost",[592,1000,603],{"class":602},[592,1002,679],{"class":602},[592,1004,1005],{"class":682},"prototype-a.unitCost",[592,1007,686],{"class":602},[592,1009,660],{"class":602},[592,1011,1012],{"class":594,"line":796},[592,1013,799],{"class":602},[455,1015,1016],{},"Internally:",[501,1018,1019,1030],{},[504,1020,1021,1023,1024,1026,1027],{},[467,1022,913],{}," writes values into a ",[467,1025,512],{}," named ",[467,1028,1029],{},"outputs:{schemaKey}",[504,1031,1032,1034,1035,1038,1039],{},[467,1033,917],{}," reads from the source tool's ",[467,1036,1037],{},"outputs:"," map, exposing values in ",[467,1040,1041],{},"ctx.connections",[455,1043,1044,1045,1047,1048,1051],{},"When both prototypes share the same ",[467,1046,498],{}," (the recommended pattern), data flows instantly and offline. When they use separate documents, ",[467,1049,1050],{},"useProtoConnections"," observes the source document reactively.",[459,1053,1055],{"id":1054},"_5-collections-are-yarrays-with-schema-driven-crud","5. Collections are Y.Arrays with schema-driven CRUD",[455,1057,1058],{},"A collection is a persistent, offline-capable list of structured items:",[472,1060,1062],{"className":586,"code":1061,"language":588,"meta":480,"style":480},"collections: {\n  tasks: {\n    label: 'Tasks',\n    fields: {\n      title:    { type: 'text',     label: 'Title',       required: true },\n      priority: { type: 'segmented', label: 'Priority',\n                  options: [\n                    { value: 'low',    label: 'Low' },\n                    { value: 'medium', label: 'Medium' },\n                    { value: 'high',   label: 'High' },\n                  ] },\n      done:     { type: 'toggle',   label: 'Done',        default: false },\n    },\n    searchable: true,\n    editMode:   'modal',\n  }\n}\n",[467,1063,1064,1072,1081,1097,1106,1153,1190,1201,1233,1263,1294,1303,1351,1357,1369,1387,1393],{"__ignoreMap":480},[592,1065,1066,1068,1070],{"class":594,"line":595},[592,1067,881],{"class":598},[592,1069,603],{"class":602},[592,1071,606],{"class":602},[592,1073,1074,1077,1079],{"class":594,"line":609},[592,1075,1076],{"class":598},"  tasks",[592,1078,603],{"class":602},[592,1080,606],{"class":602},[592,1082,1083,1086,1088,1090,1093,1095],{"class":594,"line":619},[592,1084,1085],{"class":598},"    label",[592,1087,603],{"class":602},[592,1089,679],{"class":602},[592,1091,1092],{"class":682},"Tasks",[592,1094,686],{"class":602},[592,1096,660],{"class":602},[592,1098,1099,1102,1104],{"class":594,"line":663},[592,1100,1101],{"class":598},"    fields",[592,1103,603],{"class":602},[592,1105,606],{"class":602},[592,1107,1108,1111,1113,1116,1118,1120,1122,1124,1126,1128,1131,1133,1135,1138,1140,1142,1145,1147,1151],{"class":594,"line":707},[592,1109,1110],{"class":598},"      title",[592,1112,603],{"class":602},[592,1114,1115],{"class":602},"    {",[592,1117,674],{"class":598},[592,1119,603],{"class":602},[592,1121,679],{"class":602},[592,1123,477],{"class":682},[592,1125,686],{"class":602},[592,1127,689],{"class":602},[592,1129,1130],{"class":598},"     label",[592,1132,603],{"class":602},[592,1134,679],{"class":602},[592,1136,1137],{"class":682},"Title",[592,1139,686],{"class":602},[592,1141,689],{"class":602},[592,1143,1144],{"class":598},"       required",[592,1146,603],{"class":602},[592,1148,1150],{"class":1149},"sfNiH"," true",[592,1152,704],{"class":602},[592,1154,1155,1158,1160,1163,1165,1167,1169,1172,1174,1176,1179,1181,1183,1186,1188],{"class":594,"line":713},[592,1156,1157],{"class":598},"      priority",[592,1159,603],{"class":602},[592,1161,1162],{"class":602}," {",[592,1164,674],{"class":598},[592,1166,603],{"class":602},[592,1168,679],{"class":602},[592,1170,1171],{"class":682},"segmented",[592,1173,686],{"class":602},[592,1175,689],{"class":602},[592,1177,1178],{"class":598}," label",[592,1180,603],{"class":602},[592,1182,679],{"class":602},[592,1184,1185],{"class":682},"Priority",[592,1187,686],{"class":602},[592,1189,660],{"class":602},[592,1191,1192,1195,1197],{"class":594,"line":723},[592,1193,1194],{"class":598},"                  options",[592,1196,603],{"class":602},[592,1198,1200],{"class":1199},"swJcz"," [\n",[592,1202,1203,1206,1209,1211,1213,1216,1218,1220,1222,1224,1226,1229,1231],{"class":594,"line":758},[592,1204,1205],{"class":602},"                    {",[592,1207,1208],{"class":1199}," value",[592,1210,603],{"class":602},[592,1212,679],{"class":602},[592,1214,1215],{"class":682},"low",[592,1217,686],{"class":602},[592,1219,689],{"class":602},[592,1221,1085],{"class":1199},[592,1223,603],{"class":602},[592,1225,679],{"class":602},[592,1227,1228],{"class":682},"Low",[592,1230,686],{"class":602},[592,1232,704],{"class":602},[592,1234,1235,1237,1239,1241,1243,1246,1248,1250,1252,1254,1256,1259,1261],{"class":594,"line":791},[592,1236,1205],{"class":602},[592,1238,1208],{"class":1199},[592,1240,603],{"class":602},[592,1242,679],{"class":602},[592,1244,1245],{"class":682},"medium",[592,1247,686],{"class":602},[592,1249,689],{"class":602},[592,1251,1178],{"class":1199},[592,1253,603],{"class":602},[592,1255,679],{"class":602},[592,1257,1258],{"class":682},"Medium",[592,1260,686],{"class":602},[592,1262,704],{"class":602},[592,1264,1265,1267,1269,1271,1273,1276,1278,1280,1283,1285,1287,1290,1292],{"class":594,"line":796},[592,1266,1205],{"class":602},[592,1268,1208],{"class":1199},[592,1270,603],{"class":602},[592,1272,679],{"class":602},[592,1274,1275],{"class":682},"high",[592,1277,686],{"class":602},[592,1279,689],{"class":602},[592,1281,1282],{"class":1199},"   label",[592,1284,603],{"class":602},[592,1286,679],{"class":602},[592,1288,1289],{"class":682},"High",[592,1291,686],{"class":602},[592,1293,704],{"class":602},[592,1295,1297,1300],{"class":594,"line":1296},11,[592,1298,1299],{"class":1199},"                  ] ",[592,1301,1302],{"class":602},"},\n",[592,1304,1306,1309,1311,1314,1316,1318,1320,1323,1325,1327,1329,1331,1333,1336,1338,1340,1344,1346,1349],{"class":594,"line":1305},12,[592,1307,1308],{"class":598},"      done",[592,1310,603],{"class":602},[592,1312,1313],{"class":602},"     {",[592,1315,674],{"class":598},[592,1317,603],{"class":602},[592,1319,679],{"class":602},[592,1321,1322],{"class":682},"toggle",[592,1324,686],{"class":602},[592,1326,689],{"class":602},[592,1328,1282],{"class":598},[592,1330,603],{"class":602},[592,1332,679],{"class":602},[592,1334,1335],{"class":682},"Done",[592,1337,686],{"class":602},[592,1339,689],{"class":602},[592,1341,1343],{"class":1342},"s7zQu","        default",[592,1345,509],{"class":1199},[592,1347,1348],{"class":1149},"false",[592,1350,704],{"class":602},[592,1352,1354],{"class":594,"line":1353},13,[592,1355,1356],{"class":602},"    },\n",[592,1358,1360,1363,1365,1367],{"class":594,"line":1359},14,[592,1361,1362],{"class":598},"    searchable",[592,1364,603],{"class":602},[592,1366,1150],{"class":1149},[592,1368,660],{"class":602},[592,1370,1372,1375,1377,1380,1383,1385],{"class":594,"line":1371},15,[592,1373,1374],{"class":598},"    editMode",[592,1376,603],{"class":602},[592,1378,1379],{"class":602},"   '",[592,1381,1382],{"class":682},"modal",[592,1384,686],{"class":602},[592,1386,660],{"class":602},[592,1388,1390],{"class":594,"line":1389},16,[592,1391,1392],{"class":602},"  }\n",[592,1394,1396],{"class":594,"line":1395},17,[592,1397,799],{"class":602},[455,1399,802,1400,1402,1403,1405,1406,1409,1410,1409,1413,1409,1416,1409,1419,1409,1422,1409,1425,1409,1428,1431,1432,1435],{},[467,1401,396],{}," composable wraps the underlying ",[467,1404,516],{}," and provides reactive ",[467,1407,1408],{},"items",", ",[467,1411,1412],{},"add",[467,1414,1415],{},"update",[467,1417,1418],{},"remove",[467,1420,1421],{},"move",[467,1423,1424],{},"search",[467,1426,1427],{},"filtered",[467,1429,1430],{},"sorted",", and ",[467,1433,1434],{},"count"," — all working offline automatically.",[1437,1438,1439],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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 pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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}",{"title":480,"searchDepth":609,"depth":609,"links":1441},[1442,1443,1444,1445,1446],{"id":461,"depth":609,"text":462},{"id":486,"depth":609,"text":487},{"id":575,"depth":609,"text":576},{"id":906,"depth":609,"text":907},{"id":1054,"depth":609,"text":1055},"The mental model behind protokit — schemas, Y.js documents, the produces/consumes data graph, and how everything connects.","md",null,{},{"title":348},{"title":348,"description":1447},"fBXMaE2rnF9TTpGYW6S5Q0dVPPkFzgoCdtR84JghVnI",[1455,1457],{"title":190,"path":343,"stem":344,"description":1456,"children":-1},"What protokit is, what problems it solves, and how it fits into a Nuxt 4 project.",{"title":198,"path":352,"stem":353,"description":1458,"children":-1},"Build your first tool in under 10 minutes — a resource cost estimator with form inputs, derived values, a result badge, and automatic offline persistence.",1772977476176]