[{"data":1,"prerenderedAt":2674},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-protokit/getting-started/quick-start-en":444,"/docs/nuxt-protokit/getting-started/quick-start-surround-en":2669},[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":2664},{"id":446,"title":198,"body":447,"description":2662,"extension":2663,"links":2664,"meta":2665,"navigation":2666,"ogImage":2664,"path":352,"seo":2667,"stem":353,"__hash__":2668},"nuxt_protokit/0.docs/4.nuxt-protokit/1.getting-started/3.quick-start.md",{"type":448,"value":449,"toc":2652},"minimark",[450,454,458,463,614,637,641,644,2109,2122,2126,2376,2380,2399,2406,2410,2520,2524,2531,2578,2582,2589,2615,2618,2622,2648],[451,452,198],"h1",{"id":453},"quick-start",[455,456,457],"p",{},"This guide builds a resource cost estimator from scratch. By the end you have a fully working tool with reactive computed results and automatic IndexedDB persistence — in about 30 lines of schema code.",[459,460,462],"h2",{"id":461},"step-1-add-the-module","Step 1: Add the module",[464,465,471],"pre",{"className":466,"code":467,"filename":468,"language":469,"meta":470,"style":470},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: [\n    './websideproject/modules/protokit',\n    // Optional: add yjs-sync to enable cross-device sync and server-side backups\n    // './websideproject/modules/yjs-sync',\n  ],\n\n  // protokit options (all optional — defaults shown)\n  protokit: {\n    // serverSync: true,  // default: enabled (no-ops gracefully if yjs-sync is absent)\n    // serverSync: false, // disable entirely — no HTTP requests, purely local\n    // serverSync: { baseUrl: '/api/yjs' }, // custom server base URL\n  },\n})\n","nuxt.config.ts","ts","",[472,473,474,498,511,527,534,540,548,555,561,572,581,590,599,605],"code",{"__ignoreMap":470},[475,476,479,483,486,490,494],"span",{"class":477,"line":478},"line",1,[475,480,482],{"class":481},"s7zQu","export",[475,484,485],{"class":481}," default",[475,487,489],{"class":488},"s2Zo4"," defineNuxtConfig",[475,491,493],{"class":492},"sTEyZ","(",[475,495,497],{"class":496},"sMK4o","{\n",[475,499,501,505,508],{"class":477,"line":500},2,[475,502,504],{"class":503},"swJcz","  modules",[475,506,507],{"class":496},":",[475,509,510],{"class":492}," [\n",[475,512,514,517,521,524],{"class":477,"line":513},3,[475,515,516],{"class":496},"    '",[475,518,520],{"class":519},"sfazB","./websideproject/modules/protokit",[475,522,523],{"class":496},"'",[475,525,526],{"class":496},",\n",[475,528,530],{"class":477,"line":529},4,[475,531,533],{"class":532},"sHwdD","    // Optional: add yjs-sync to enable cross-device sync and server-side backups\n",[475,535,537],{"class":477,"line":536},5,[475,538,539],{"class":532},"    // './websideproject/modules/yjs-sync',\n",[475,541,543,546],{"class":477,"line":542},6,[475,544,545],{"class":492},"  ]",[475,547,526],{"class":496},[475,549,551],{"class":477,"line":550},7,[475,552,554],{"emptyLinePlaceholder":553},true,"\n",[475,556,558],{"class":477,"line":557},8,[475,559,560],{"class":532},"  // protokit options (all optional — defaults shown)\n",[475,562,564,567,569],{"class":477,"line":563},9,[475,565,566],{"class":503},"  protokit",[475,568,507],{"class":496},[475,570,571],{"class":496}," {\n",[475,573,575,578],{"class":477,"line":574},10,[475,576,577],{"class":532},"    // serverSync: true,",[475,579,580],{"class":532},"  // default: enabled (no-ops gracefully if yjs-sync is absent)\n",[475,582,584,587],{"class":477,"line":583},11,[475,585,586],{"class":532},"    // serverSync: false,",[475,588,589],{"class":532}," // disable entirely — no HTTP requests, purely local\n",[475,591,593,596],{"class":477,"line":592},12,[475,594,595],{"class":532},"    // serverSync: { baseUrl: '/api/yjs' },",[475,597,598],{"class":532}," // custom server base URL\n",[475,600,602],{"class":477,"line":601},13,[475,603,604],{"class":496},"  },\n",[475,606,608,611],{"class":477,"line":607},14,[475,609,610],{"class":496},"}",[475,612,613],{"class":492},")\n",[615,616,619],"callout",{"color":617,"icon":618},"blue","i-lucide-info",[455,620,621,624,625,628,629,632,633,636],{},[472,622,623],{},"serverSync"," defaults to ",[472,626,627],{},"true",". If ",[472,630,631],{},"yjs-sync"," (or a compatible server) is not present, sync calls fail silently — local IndexedDB still works. Set ",[472,634,635],{},"serverSync: false"," to skip the HTTP calls entirely.",[459,638,640],{"id":639},"step-2-define-the-schema","Step 2: Define the schema",[455,642,643],{},"Create a schema file anywhere in your project:",[464,645,650],{"className":646,"code":647,"filename":648,"language":649,"meta":470,"style":470},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export const resourceEstimator = definePrototype({\n  key: 'resource-estimator-v1',   // unique — also the IndexedDB key\n  title: 'Resource Cost Estimator',\n\n  fields: {\n    teamSize: {\n      type: 'number',\n      label: 'Team Size',\n      default: 3,\n    },\n    avgMonthlySalary: {\n      type: 'number',\n      label: 'Avg. Monthly Salary (€)',\n      default: 4500,\n    },\n    toolingCosts: {\n      type: 'number',\n      label: 'Monthly Tooling Budget (€)',\n      default: 300,\n    },\n    projectDurationMonths: {\n      type: 'range',\n      label: 'Project Duration (months)',\n      min: 1,\n      max: 24,\n      step: 1,\n      default: 6,\n    },\n    overheadPercent: {\n      type: 'range',\n      label: 'Overhead / Benefits (%)',\n      min: 0,\n      max: 60,\n      step: 5,\n      default: 25,\n    },\n  },\n\n  derived: {\n    monthlySalaryCost: {\n      compute: ({ fields }) => fields.teamSize * fields.avgMonthlySalary,\n      format: { type: 'money', currency: '€' },\n    },\n    monthlyOverhead: {\n      compute: ({ fields, derived }) =>\n        derived.monthlySalaryCost * (fields.overheadPercent / 100),\n      format: { type: 'money', currency: '€' },\n    },\n    monthlyTotal: {\n      compute: ({ fields, derived }) =>\n        derived.monthlySalaryCost + derived.monthlyOverhead + fields.toolingCosts,\n      format: { type: 'money', currency: '€' },\n    },\n    projectTotal: {\n      compute: ({ fields, derived }) =>\n        derived.monthlyTotal * fields.projectDurationMonths,\n      format: { type: 'money', currency: '€' },\n    },\n  },\n\n  results: {\n    badge: ({ derived }) => {\n      const cost = derived.projectTotal\n      if (cost \u003C 50_000)  return { label: 'Small Project',  color: 'primary' }\n      if (cost \u003C 200_000) return { label: 'Medium Project', color: 'warning' }\n      return                    { label: 'Large Project',   color: 'error' }\n    },\n    stats: ({ derived }) => [\n      { label: 'Monthly People Cost', value: derived.monthlySalaryCost, format: 'money' },\n      { label: 'Monthly Overhead',    value: derived.monthlyOverhead,   format: 'money' },\n      { label: 'Monthly Total',       value: derived.monthlyTotal,      format: 'money' },\n      { label: 'Project Total',       value: derived.projectTotal,      format: 'money' },\n    ],\n  },\n\n  visualizations: [\n    {\n      type: 'bar-chart',\n      label: 'Monthly Cost Breakdown',\n      items: ({ fields, derived }) => [\n        { label: 'Salaries',  value: derived.monthlySalaryCost },\n        { label: 'Overhead',  value: derived.monthlyOverhead },\n        { label: 'Tooling',   value: fields.toolingCosts },\n      ],\n      format: 'money',\n    },\n  ],\n})\n","composables/schemas/resourceEstimator.ts","typescript",[472,651,652,673,694,710,714,723,732,748,764,777,782,791,805,820,831,836,846,861,877,889,894,904,920,936,949,962,974,986,991,1001,1016,1032,1044,1056,1068,1080,1085,1090,1095,1105,1115,1156,1196,1201,1211,1232,1264,1297,1302,1312,1331,1361,1394,1399,1409,1428,1449,1482,1487,1492,1497,1507,1525,1544,1599,1647,1683,1688,1706,1752,1797,1841,1884,1892,1897,1902,1912,1918,1934,1950,1972,2005,2035,2067,2075,2090,2095,2102],{"__ignoreMap":470},[475,653,654,656,660,663,666,669,671],{"class":477,"line":478},[475,655,482],{"class":481},[475,657,659],{"class":658},"spNyl"," const",[475,661,662],{"class":492}," resourceEstimator ",[475,664,665],{"class":496},"=",[475,667,668],{"class":488}," definePrototype",[475,670,493],{"class":492},[475,672,497],{"class":496},[475,674,675,678,680,683,686,688,691],{"class":477,"line":500},[475,676,677],{"class":503},"  key",[475,679,507],{"class":496},[475,681,682],{"class":496}," '",[475,684,685],{"class":519},"resource-estimator-v1",[475,687,523],{"class":496},[475,689,690],{"class":496},",",[475,692,693],{"class":532},"   // unique — also the IndexedDB key\n",[475,695,696,699,701,703,706,708],{"class":477,"line":513},[475,697,698],{"class":503},"  title",[475,700,507],{"class":496},[475,702,682],{"class":496},[475,704,705],{"class":519},"Resource Cost Estimator",[475,707,523],{"class":496},[475,709,526],{"class":496},[475,711,712],{"class":477,"line":529},[475,713,554],{"emptyLinePlaceholder":553},[475,715,716,719,721],{"class":477,"line":536},[475,717,718],{"class":503},"  fields",[475,720,507],{"class":496},[475,722,571],{"class":496},[475,724,725,728,730],{"class":477,"line":542},[475,726,727],{"class":503},"    teamSize",[475,729,507],{"class":496},[475,731,571],{"class":496},[475,733,734,737,739,741,744,746],{"class":477,"line":550},[475,735,736],{"class":503},"      type",[475,738,507],{"class":496},[475,740,682],{"class":496},[475,742,743],{"class":519},"number",[475,745,523],{"class":496},[475,747,526],{"class":496},[475,749,750,753,755,757,760,762],{"class":477,"line":557},[475,751,752],{"class":503},"      label",[475,754,507],{"class":496},[475,756,682],{"class":496},[475,758,759],{"class":519},"Team Size",[475,761,523],{"class":496},[475,763,526],{"class":496},[475,765,766,769,771,775],{"class":477,"line":563},[475,767,768],{"class":503},"      default",[475,770,507],{"class":496},[475,772,774],{"class":773},"sbssI"," 3",[475,776,526],{"class":496},[475,778,779],{"class":477,"line":574},[475,780,781],{"class":496},"    },\n",[475,783,784,787,789],{"class":477,"line":583},[475,785,786],{"class":503},"    avgMonthlySalary",[475,788,507],{"class":496},[475,790,571],{"class":496},[475,792,793,795,797,799,801,803],{"class":477,"line":592},[475,794,736],{"class":503},[475,796,507],{"class":496},[475,798,682],{"class":496},[475,800,743],{"class":519},[475,802,523],{"class":496},[475,804,526],{"class":496},[475,806,807,809,811,813,816,818],{"class":477,"line":601},[475,808,752],{"class":503},[475,810,507],{"class":496},[475,812,682],{"class":496},[475,814,815],{"class":519},"Avg. Monthly Salary (€)",[475,817,523],{"class":496},[475,819,526],{"class":496},[475,821,822,824,826,829],{"class":477,"line":607},[475,823,768],{"class":503},[475,825,507],{"class":496},[475,827,828],{"class":773}," 4500",[475,830,526],{"class":496},[475,832,834],{"class":477,"line":833},15,[475,835,781],{"class":496},[475,837,839,842,844],{"class":477,"line":838},16,[475,840,841],{"class":503},"    toolingCosts",[475,843,507],{"class":496},[475,845,571],{"class":496},[475,847,849,851,853,855,857,859],{"class":477,"line":848},17,[475,850,736],{"class":503},[475,852,507],{"class":496},[475,854,682],{"class":496},[475,856,743],{"class":519},[475,858,523],{"class":496},[475,860,526],{"class":496},[475,862,864,866,868,870,873,875],{"class":477,"line":863},18,[475,865,752],{"class":503},[475,867,507],{"class":496},[475,869,682],{"class":496},[475,871,872],{"class":519},"Monthly Tooling Budget (€)",[475,874,523],{"class":496},[475,876,526],{"class":496},[475,878,880,882,884,887],{"class":477,"line":879},19,[475,881,768],{"class":503},[475,883,507],{"class":496},[475,885,886],{"class":773}," 300",[475,888,526],{"class":496},[475,890,892],{"class":477,"line":891},20,[475,893,781],{"class":496},[475,895,897,900,902],{"class":477,"line":896},21,[475,898,899],{"class":503},"    projectDurationMonths",[475,901,507],{"class":496},[475,903,571],{"class":496},[475,905,907,909,911,913,916,918],{"class":477,"line":906},22,[475,908,736],{"class":503},[475,910,507],{"class":496},[475,912,682],{"class":496},[475,914,915],{"class":519},"range",[475,917,523],{"class":496},[475,919,526],{"class":496},[475,921,923,925,927,929,932,934],{"class":477,"line":922},23,[475,924,752],{"class":503},[475,926,507],{"class":496},[475,928,682],{"class":496},[475,930,931],{"class":519},"Project Duration (months)",[475,933,523],{"class":496},[475,935,526],{"class":496},[475,937,939,942,944,947],{"class":477,"line":938},24,[475,940,941],{"class":503},"      min",[475,943,507],{"class":496},[475,945,946],{"class":773}," 1",[475,948,526],{"class":496},[475,950,952,955,957,960],{"class":477,"line":951},25,[475,953,954],{"class":503},"      max",[475,956,507],{"class":496},[475,958,959],{"class":773}," 24",[475,961,526],{"class":496},[475,963,965,968,970,972],{"class":477,"line":964},26,[475,966,967],{"class":503},"      step",[475,969,507],{"class":496},[475,971,946],{"class":773},[475,973,526],{"class":496},[475,975,977,979,981,984],{"class":477,"line":976},27,[475,978,768],{"class":503},[475,980,507],{"class":496},[475,982,983],{"class":773}," 6",[475,985,526],{"class":496},[475,987,989],{"class":477,"line":988},28,[475,990,781],{"class":496},[475,992,994,997,999],{"class":477,"line":993},29,[475,995,996],{"class":503},"    overheadPercent",[475,998,507],{"class":496},[475,1000,571],{"class":496},[475,1002,1004,1006,1008,1010,1012,1014],{"class":477,"line":1003},30,[475,1005,736],{"class":503},[475,1007,507],{"class":496},[475,1009,682],{"class":496},[475,1011,915],{"class":519},[475,1013,523],{"class":496},[475,1015,526],{"class":496},[475,1017,1019,1021,1023,1025,1028,1030],{"class":477,"line":1018},31,[475,1020,752],{"class":503},[475,1022,507],{"class":496},[475,1024,682],{"class":496},[475,1026,1027],{"class":519},"Overhead / Benefits (%)",[475,1029,523],{"class":496},[475,1031,526],{"class":496},[475,1033,1035,1037,1039,1042],{"class":477,"line":1034},32,[475,1036,941],{"class":503},[475,1038,507],{"class":496},[475,1040,1041],{"class":773}," 0",[475,1043,526],{"class":496},[475,1045,1047,1049,1051,1054],{"class":477,"line":1046},33,[475,1048,954],{"class":503},[475,1050,507],{"class":496},[475,1052,1053],{"class":773}," 60",[475,1055,526],{"class":496},[475,1057,1059,1061,1063,1066],{"class":477,"line":1058},34,[475,1060,967],{"class":503},[475,1062,507],{"class":496},[475,1064,1065],{"class":773}," 5",[475,1067,526],{"class":496},[475,1069,1071,1073,1075,1078],{"class":477,"line":1070},35,[475,1072,768],{"class":503},[475,1074,507],{"class":496},[475,1076,1077],{"class":773}," 25",[475,1079,526],{"class":496},[475,1081,1083],{"class":477,"line":1082},36,[475,1084,781],{"class":496},[475,1086,1088],{"class":477,"line":1087},37,[475,1089,604],{"class":496},[475,1091,1093],{"class":477,"line":1092},38,[475,1094,554],{"emptyLinePlaceholder":553},[475,1096,1098,1101,1103],{"class":477,"line":1097},39,[475,1099,1100],{"class":503},"  derived",[475,1102,507],{"class":496},[475,1104,571],{"class":496},[475,1106,1108,1111,1113],{"class":477,"line":1107},40,[475,1109,1110],{"class":503},"    monthlySalaryCost",[475,1112,507],{"class":496},[475,1114,571],{"class":496},[475,1116,1118,1121,1123,1126,1130,1133,1136,1138,1141,1144,1147,1149,1151,1154],{"class":477,"line":1117},41,[475,1119,1120],{"class":488},"      compute",[475,1122,507],{"class":496},[475,1124,1125],{"class":496}," ({",[475,1127,1129],{"class":1128},"sHdIc"," fields",[475,1131,1132],{"class":496}," })",[475,1134,1135],{"class":658}," =>",[475,1137,1129],{"class":492},[475,1139,1140],{"class":496},".",[475,1142,1143],{"class":492},"teamSize ",[475,1145,1146],{"class":496},"*",[475,1148,1129],{"class":492},[475,1150,1140],{"class":496},[475,1152,1153],{"class":492},"avgMonthlySalary",[475,1155,526],{"class":496},[475,1157,1159,1162,1164,1167,1170,1172,1174,1177,1179,1181,1184,1186,1188,1191,1193],{"class":477,"line":1158},42,[475,1160,1161],{"class":503},"      format",[475,1163,507],{"class":496},[475,1165,1166],{"class":496}," {",[475,1168,1169],{"class":503}," type",[475,1171,507],{"class":496},[475,1173,682],{"class":496},[475,1175,1176],{"class":519},"money",[475,1178,523],{"class":496},[475,1180,690],{"class":496},[475,1182,1183],{"class":503}," currency",[475,1185,507],{"class":496},[475,1187,682],{"class":496},[475,1189,1190],{"class":519},"€",[475,1192,523],{"class":496},[475,1194,1195],{"class":496}," },\n",[475,1197,1199],{"class":477,"line":1198},43,[475,1200,781],{"class":496},[475,1202,1204,1207,1209],{"class":477,"line":1203},44,[475,1205,1206],{"class":503},"    monthlyOverhead",[475,1208,507],{"class":496},[475,1210,571],{"class":496},[475,1212,1214,1216,1218,1220,1222,1224,1227,1229],{"class":477,"line":1213},45,[475,1215,1120],{"class":488},[475,1217,507],{"class":496},[475,1219,1125],{"class":496},[475,1221,1129],{"class":1128},[475,1223,690],{"class":496},[475,1225,1226],{"class":1128}," derived",[475,1228,1132],{"class":496},[475,1230,1231],{"class":658}," =>\n",[475,1233,1235,1238,1240,1243,1245,1248,1250,1253,1256,1259,1262],{"class":477,"line":1234},46,[475,1236,1237],{"class":492},"        derived",[475,1239,1140],{"class":496},[475,1241,1242],{"class":492},"monthlySalaryCost ",[475,1244,1146],{"class":496},[475,1246,1247],{"class":492}," (fields",[475,1249,1140],{"class":496},[475,1251,1252],{"class":492},"overheadPercent ",[475,1254,1255],{"class":496},"/",[475,1257,1258],{"class":773}," 100",[475,1260,1261],{"class":492},")",[475,1263,526],{"class":496},[475,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295],{"class":477,"line":1266},47,[475,1268,1161],{"class":503},[475,1270,507],{"class":496},[475,1272,1166],{"class":496},[475,1274,1169],{"class":503},[475,1276,507],{"class":496},[475,1278,682],{"class":496},[475,1280,1176],{"class":519},[475,1282,523],{"class":496},[475,1284,690],{"class":496},[475,1286,1183],{"class":503},[475,1288,507],{"class":496},[475,1290,682],{"class":496},[475,1292,1190],{"class":519},[475,1294,523],{"class":496},[475,1296,1195],{"class":496},[475,1298,1300],{"class":477,"line":1299},48,[475,1301,781],{"class":496},[475,1303,1305,1308,1310],{"class":477,"line":1304},49,[475,1306,1307],{"class":503},"    monthlyTotal",[475,1309,507],{"class":496},[475,1311,571],{"class":496},[475,1313,1315,1317,1319,1321,1323,1325,1327,1329],{"class":477,"line":1314},50,[475,1316,1120],{"class":488},[475,1318,507],{"class":496},[475,1320,1125],{"class":496},[475,1322,1129],{"class":1128},[475,1324,690],{"class":496},[475,1326,1226],{"class":1128},[475,1328,1132],{"class":496},[475,1330,1231],{"class":658},[475,1332,1334,1336,1338,1340,1343,1345,1347,1350,1352,1354,1356,1359],{"class":477,"line":1333},51,[475,1335,1237],{"class":492},[475,1337,1140],{"class":496},[475,1339,1242],{"class":492},[475,1341,1342],{"class":496},"+",[475,1344,1226],{"class":492},[475,1346,1140],{"class":496},[475,1348,1349],{"class":492},"monthlyOverhead ",[475,1351,1342],{"class":496},[475,1353,1129],{"class":492},[475,1355,1140],{"class":496},[475,1357,1358],{"class":492},"toolingCosts",[475,1360,526],{"class":496},[475,1362,1364,1366,1368,1370,1372,1374,1376,1378,1380,1382,1384,1386,1388,1390,1392],{"class":477,"line":1363},52,[475,1365,1161],{"class":503},[475,1367,507],{"class":496},[475,1369,1166],{"class":496},[475,1371,1169],{"class":503},[475,1373,507],{"class":496},[475,1375,682],{"class":496},[475,1377,1176],{"class":519},[475,1379,523],{"class":496},[475,1381,690],{"class":496},[475,1383,1183],{"class":503},[475,1385,507],{"class":496},[475,1387,682],{"class":496},[475,1389,1190],{"class":519},[475,1391,523],{"class":496},[475,1393,1195],{"class":496},[475,1395,1397],{"class":477,"line":1396},53,[475,1398,781],{"class":496},[475,1400,1402,1405,1407],{"class":477,"line":1401},54,[475,1403,1404],{"class":503},"    projectTotal",[475,1406,507],{"class":496},[475,1408,571],{"class":496},[475,1410,1412,1414,1416,1418,1420,1422,1424,1426],{"class":477,"line":1411},55,[475,1413,1120],{"class":488},[475,1415,507],{"class":496},[475,1417,1125],{"class":496},[475,1419,1129],{"class":1128},[475,1421,690],{"class":496},[475,1423,1226],{"class":1128},[475,1425,1132],{"class":496},[475,1427,1231],{"class":658},[475,1429,1431,1433,1435,1438,1440,1442,1444,1447],{"class":477,"line":1430},56,[475,1432,1237],{"class":492},[475,1434,1140],{"class":496},[475,1436,1437],{"class":492},"monthlyTotal ",[475,1439,1146],{"class":496},[475,1441,1129],{"class":492},[475,1443,1140],{"class":496},[475,1445,1446],{"class":492},"projectDurationMonths",[475,1448,526],{"class":496},[475,1450,1452,1454,1456,1458,1460,1462,1464,1466,1468,1470,1472,1474,1476,1478,1480],{"class":477,"line":1451},57,[475,1453,1161],{"class":503},[475,1455,507],{"class":496},[475,1457,1166],{"class":496},[475,1459,1169],{"class":503},[475,1461,507],{"class":496},[475,1463,682],{"class":496},[475,1465,1176],{"class":519},[475,1467,523],{"class":496},[475,1469,690],{"class":496},[475,1471,1183],{"class":503},[475,1473,507],{"class":496},[475,1475,682],{"class":496},[475,1477,1190],{"class":519},[475,1479,523],{"class":496},[475,1481,1195],{"class":496},[475,1483,1485],{"class":477,"line":1484},58,[475,1486,781],{"class":496},[475,1488,1490],{"class":477,"line":1489},59,[475,1491,604],{"class":496},[475,1493,1495],{"class":477,"line":1494},60,[475,1496,554],{"emptyLinePlaceholder":553},[475,1498,1500,1503,1505],{"class":477,"line":1499},61,[475,1501,1502],{"class":503},"  results",[475,1504,507],{"class":496},[475,1506,571],{"class":496},[475,1508,1510,1513,1515,1517,1519,1521,1523],{"class":477,"line":1509},62,[475,1511,1512],{"class":488},"    badge",[475,1514,507],{"class":496},[475,1516,1125],{"class":496},[475,1518,1226],{"class":1128},[475,1520,1132],{"class":496},[475,1522,1135],{"class":658},[475,1524,571],{"class":496},[475,1526,1528,1531,1534,1537,1539,1541],{"class":477,"line":1527},63,[475,1529,1530],{"class":658},"      const",[475,1532,1533],{"class":492}," cost",[475,1535,1536],{"class":496}," =",[475,1538,1226],{"class":492},[475,1540,1140],{"class":496},[475,1542,1543],{"class":492},"projectTotal\n",[475,1545,1547,1550,1553,1556,1559,1562,1565,1568,1570,1573,1575,1577,1580,1582,1584,1587,1589,1591,1594,1596],{"class":477,"line":1546},64,[475,1548,1549],{"class":481},"      if",[475,1551,1552],{"class":503}," (",[475,1554,1555],{"class":492},"cost",[475,1557,1558],{"class":496}," \u003C",[475,1560,1561],{"class":773}," 50_000",[475,1563,1564],{"class":503},")  ",[475,1566,1567],{"class":481},"return",[475,1569,1166],{"class":496},[475,1571,1572],{"class":503}," label",[475,1574,507],{"class":496},[475,1576,682],{"class":496},[475,1578,1579],{"class":519},"Small Project",[475,1581,523],{"class":496},[475,1583,690],{"class":496},[475,1585,1586],{"class":503},"  color",[475,1588,507],{"class":496},[475,1590,682],{"class":496},[475,1592,1593],{"class":519},"primary",[475,1595,523],{"class":496},[475,1597,1598],{"class":496}," }\n",[475,1600,1602,1604,1606,1608,1610,1613,1616,1618,1620,1622,1624,1626,1629,1631,1633,1636,1638,1640,1643,1645],{"class":477,"line":1601},65,[475,1603,1549],{"class":481},[475,1605,1552],{"class":503},[475,1607,1555],{"class":492},[475,1609,1558],{"class":496},[475,1611,1612],{"class":773}," 200_000",[475,1614,1615],{"class":503},") ",[475,1617,1567],{"class":481},[475,1619,1166],{"class":496},[475,1621,1572],{"class":503},[475,1623,507],{"class":496},[475,1625,682],{"class":496},[475,1627,1628],{"class":519},"Medium Project",[475,1630,523],{"class":496},[475,1632,690],{"class":496},[475,1634,1635],{"class":503}," color",[475,1637,507],{"class":496},[475,1639,682],{"class":496},[475,1641,1642],{"class":519},"warning",[475,1644,523],{"class":496},[475,1646,1598],{"class":496},[475,1648,1650,1653,1656,1658,1660,1662,1665,1667,1669,1672,1674,1676,1679,1681],{"class":477,"line":1649},66,[475,1651,1652],{"class":481},"      return",[475,1654,1655],{"class":496},"                    {",[475,1657,1572],{"class":503},[475,1659,507],{"class":496},[475,1661,682],{"class":496},[475,1663,1664],{"class":519},"Large Project",[475,1666,523],{"class":496},[475,1668,690],{"class":496},[475,1670,1671],{"class":503},"   color",[475,1673,507],{"class":496},[475,1675,682],{"class":496},[475,1677,1678],{"class":519},"error",[475,1680,523],{"class":496},[475,1682,1598],{"class":496},[475,1684,1686],{"class":477,"line":1685},67,[475,1687,781],{"class":496},[475,1689,1691,1694,1696,1698,1700,1702,1704],{"class":477,"line":1690},68,[475,1692,1693],{"class":488},"    stats",[475,1695,507],{"class":496},[475,1697,1125],{"class":496},[475,1699,1226],{"class":1128},[475,1701,1132],{"class":496},[475,1703,1135],{"class":658},[475,1705,510],{"class":492},[475,1707,1709,1712,1714,1716,1718,1721,1723,1725,1728,1730,1732,1734,1737,1739,1742,1744,1746,1748,1750],{"class":477,"line":1708},69,[475,1710,1711],{"class":496},"      {",[475,1713,1572],{"class":503},[475,1715,507],{"class":496},[475,1717,682],{"class":496},[475,1719,1720],{"class":519},"Monthly People Cost",[475,1722,523],{"class":496},[475,1724,690],{"class":496},[475,1726,1727],{"class":503}," value",[475,1729,507],{"class":496},[475,1731,1226],{"class":492},[475,1733,1140],{"class":496},[475,1735,1736],{"class":492},"monthlySalaryCost",[475,1738,690],{"class":496},[475,1740,1741],{"class":503}," format",[475,1743,507],{"class":496},[475,1745,682],{"class":496},[475,1747,1176],{"class":519},[475,1749,523],{"class":496},[475,1751,1195],{"class":496},[475,1753,1755,1757,1759,1761,1763,1766,1768,1770,1773,1775,1777,1779,1782,1784,1787,1789,1791,1793,1795],{"class":477,"line":1754},70,[475,1756,1711],{"class":496},[475,1758,1572],{"class":503},[475,1760,507],{"class":496},[475,1762,682],{"class":496},[475,1764,1765],{"class":519},"Monthly Overhead",[475,1767,523],{"class":496},[475,1769,690],{"class":496},[475,1771,1772],{"class":503},"    value",[475,1774,507],{"class":496},[475,1776,1226],{"class":492},[475,1778,1140],{"class":496},[475,1780,1781],{"class":492},"monthlyOverhead",[475,1783,690],{"class":496},[475,1785,1786],{"class":503},"   format",[475,1788,507],{"class":496},[475,1790,682],{"class":496},[475,1792,1176],{"class":519},[475,1794,523],{"class":496},[475,1796,1195],{"class":496},[475,1798,1800,1802,1804,1806,1808,1811,1813,1815,1818,1820,1822,1824,1827,1829,1831,1833,1835,1837,1839],{"class":477,"line":1799},71,[475,1801,1711],{"class":496},[475,1803,1572],{"class":503},[475,1805,507],{"class":496},[475,1807,682],{"class":496},[475,1809,1810],{"class":519},"Monthly Total",[475,1812,523],{"class":496},[475,1814,690],{"class":496},[475,1816,1817],{"class":503},"       value",[475,1819,507],{"class":496},[475,1821,1226],{"class":492},[475,1823,1140],{"class":496},[475,1825,1826],{"class":492},"monthlyTotal",[475,1828,690],{"class":496},[475,1830,1161],{"class":503},[475,1832,507],{"class":496},[475,1834,682],{"class":496},[475,1836,1176],{"class":519},[475,1838,523],{"class":496},[475,1840,1195],{"class":496},[475,1842,1844,1846,1848,1850,1852,1855,1857,1859,1861,1863,1865,1867,1870,1872,1874,1876,1878,1880,1882],{"class":477,"line":1843},72,[475,1845,1711],{"class":496},[475,1847,1572],{"class":503},[475,1849,507],{"class":496},[475,1851,682],{"class":496},[475,1853,1854],{"class":519},"Project Total",[475,1856,523],{"class":496},[475,1858,690],{"class":496},[475,1860,1817],{"class":503},[475,1862,507],{"class":496},[475,1864,1226],{"class":492},[475,1866,1140],{"class":496},[475,1868,1869],{"class":492},"projectTotal",[475,1871,690],{"class":496},[475,1873,1161],{"class":503},[475,1875,507],{"class":496},[475,1877,682],{"class":496},[475,1879,1176],{"class":519},[475,1881,523],{"class":496},[475,1883,1195],{"class":496},[475,1885,1887,1890],{"class":477,"line":1886},73,[475,1888,1889],{"class":492},"    ]",[475,1891,526],{"class":496},[475,1893,1895],{"class":477,"line":1894},74,[475,1896,604],{"class":496},[475,1898,1900],{"class":477,"line":1899},75,[475,1901,554],{"emptyLinePlaceholder":553},[475,1903,1905,1908,1910],{"class":477,"line":1904},76,[475,1906,1907],{"class":503},"  visualizations",[475,1909,507],{"class":496},[475,1911,510],{"class":492},[475,1913,1915],{"class":477,"line":1914},77,[475,1916,1917],{"class":496},"    {\n",[475,1919,1921,1923,1925,1927,1930,1932],{"class":477,"line":1920},78,[475,1922,736],{"class":503},[475,1924,507],{"class":496},[475,1926,682],{"class":496},[475,1928,1929],{"class":519},"bar-chart",[475,1931,523],{"class":496},[475,1933,526],{"class":496},[475,1935,1937,1939,1941,1943,1946,1948],{"class":477,"line":1936},79,[475,1938,752],{"class":503},[475,1940,507],{"class":496},[475,1942,682],{"class":496},[475,1944,1945],{"class":519},"Monthly Cost Breakdown",[475,1947,523],{"class":496},[475,1949,526],{"class":496},[475,1951,1953,1956,1958,1960,1962,1964,1966,1968,1970],{"class":477,"line":1952},80,[475,1954,1955],{"class":488},"      items",[475,1957,507],{"class":496},[475,1959,1125],{"class":496},[475,1961,1129],{"class":1128},[475,1963,690],{"class":496},[475,1965,1226],{"class":1128},[475,1967,1132],{"class":496},[475,1969,1135],{"class":658},[475,1971,510],{"class":492},[475,1973,1975,1978,1980,1982,1984,1987,1989,1991,1994,1996,1998,2000,2002],{"class":477,"line":1974},81,[475,1976,1977],{"class":496},"        {",[475,1979,1572],{"class":503},[475,1981,507],{"class":496},[475,1983,682],{"class":496},[475,1985,1986],{"class":519},"Salaries",[475,1988,523],{"class":496},[475,1990,690],{"class":496},[475,1992,1993],{"class":503},"  value",[475,1995,507],{"class":496},[475,1997,1226],{"class":492},[475,1999,1140],{"class":496},[475,2001,1242],{"class":492},[475,2003,2004],{"class":496},"},\n",[475,2006,2008,2010,2012,2014,2016,2019,2021,2023,2025,2027,2029,2031,2033],{"class":477,"line":2007},82,[475,2009,1977],{"class":496},[475,2011,1572],{"class":503},[475,2013,507],{"class":496},[475,2015,682],{"class":496},[475,2017,2018],{"class":519},"Overhead",[475,2020,523],{"class":496},[475,2022,690],{"class":496},[475,2024,1993],{"class":503},[475,2026,507],{"class":496},[475,2028,1226],{"class":492},[475,2030,1140],{"class":496},[475,2032,1349],{"class":492},[475,2034,2004],{"class":496},[475,2036,2038,2040,2042,2044,2046,2049,2051,2053,2056,2058,2060,2062,2065],{"class":477,"line":2037},83,[475,2039,1977],{"class":496},[475,2041,1572],{"class":503},[475,2043,507],{"class":496},[475,2045,682],{"class":496},[475,2047,2048],{"class":519},"Tooling",[475,2050,523],{"class":496},[475,2052,690],{"class":496},[475,2054,2055],{"class":503},"   value",[475,2057,507],{"class":496},[475,2059,1129],{"class":492},[475,2061,1140],{"class":496},[475,2063,2064],{"class":492},"toolingCosts ",[475,2066,2004],{"class":496},[475,2068,2070,2073],{"class":477,"line":2069},84,[475,2071,2072],{"class":492},"      ]",[475,2074,526],{"class":496},[475,2076,2078,2080,2082,2084,2086,2088],{"class":477,"line":2077},85,[475,2079,1161],{"class":503},[475,2081,507],{"class":496},[475,2083,682],{"class":496},[475,2085,1176],{"class":519},[475,2087,523],{"class":496},[475,2089,526],{"class":496},[475,2091,2093],{"class":477,"line":2092},86,[475,2094,781],{"class":496},[475,2096,2098,2100],{"class":477,"line":2097},87,[475,2099,545],{"class":492},[475,2101,526],{"class":496},[475,2103,2105,2107],{"class":477,"line":2104},88,[475,2106,610],{"class":496},[475,2108,613],{"class":492},[615,2110,2111],{"color":617,"icon":618},[455,2112,2113,2116,2117,2121],{},[472,2114,2115],{},"definePrototype"," is a ",[2118,2119,2120],"strong",{},"no-op identity function"," — it exists only for TypeScript inference. You can omit it and use a plain object if you prefer.",[459,2123,2125],{"id":2124},"step-3-render-it","Step 3: Render it",[464,2127,2132],{"className":2128,"code":2129,"filename":2130,"language":2131,"meta":470,"style":470},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { resourceEstimator } from '~/composables/schemas/resourceEstimator'\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"max-w-2xl mx-auto p-6\">\n    \u003CClientOnly>\n      \u003CProtoTool :schema=\"resourceEstimator\" />\n      \u003Ctemplate #fallback>\n        \u003Cdiv class=\"animate-pulse space-y-4\">\n          \u003Cdiv class=\"h-10 bg-muted rounded\" />\n          \u003Cdiv class=\"h-10 bg-muted rounded\" />\n        \u003C/div>\n      \u003C/template>\n    \u003C/ClientOnly>\n  \u003C/div>\n\u003C/template>\n","pages/estimator.vue","vue",[472,2133,2134,2160,2184,2193,2197,2206,2228,2238,2260,2274,2294,2314,2332,2341,2350,2359,2368],{"__ignoreMap":470},[475,2135,2136,2139,2142,2145,2148,2150,2153,2155,2157],{"class":477,"line":478},[475,2137,2138],{"class":496},"\u003C",[475,2140,2141],{"class":503},"script",[475,2143,2144],{"class":658}," setup",[475,2146,2147],{"class":658}," lang",[475,2149,665],{"class":496},[475,2151,2152],{"class":496},"\"",[475,2154,469],{"class":519},[475,2156,2152],{"class":496},[475,2158,2159],{"class":496},">\n",[475,2161,2162,2165,2167,2170,2173,2176,2178,2181],{"class":477,"line":500},[475,2163,2164],{"class":481},"import",[475,2166,1166],{"class":496},[475,2168,2169],{"class":492}," resourceEstimator",[475,2171,2172],{"class":496}," }",[475,2174,2175],{"class":481}," from",[475,2177,682],{"class":496},[475,2179,2180],{"class":519},"~/composables/schemas/resourceEstimator",[475,2182,2183],{"class":496},"'\n",[475,2185,2186,2189,2191],{"class":477,"line":513},[475,2187,2188],{"class":496},"\u003C/",[475,2190,2141],{"class":503},[475,2192,2159],{"class":496},[475,2194,2195],{"class":477,"line":529},[475,2196,554],{"emptyLinePlaceholder":553},[475,2198,2199,2201,2204],{"class":477,"line":536},[475,2200,2138],{"class":496},[475,2202,2203],{"class":503},"template",[475,2205,2159],{"class":496},[475,2207,2208,2211,2214,2217,2219,2221,2224,2226],{"class":477,"line":542},[475,2209,2210],{"class":496},"  \u003C",[475,2212,2213],{"class":503},"div",[475,2215,2216],{"class":658}," class",[475,2218,665],{"class":496},[475,2220,2152],{"class":496},[475,2222,2223],{"class":519},"max-w-2xl mx-auto p-6",[475,2225,2152],{"class":496},[475,2227,2159],{"class":496},[475,2229,2230,2233,2236],{"class":477,"line":550},[475,2231,2232],{"class":496},"    \u003C",[475,2234,2235],{"class":503},"ClientOnly",[475,2237,2159],{"class":496},[475,2239,2240,2243,2245,2248,2250,2252,2255,2257],{"class":477,"line":557},[475,2241,2242],{"class":496},"      \u003C",[475,2244,407],{"class":503},[475,2246,2247],{"class":658}," :schema",[475,2249,665],{"class":496},[475,2251,2152],{"class":496},[475,2253,2254],{"class":519},"resourceEstimator",[475,2256,2152],{"class":496},[475,2258,2259],{"class":496}," />\n",[475,2261,2262,2264,2266,2269,2272],{"class":477,"line":563},[475,2263,2242],{"class":496},[475,2265,2203],{"class":503},[475,2267,2268],{"class":496}," #",[475,2270,2271],{"class":658},"fallback",[475,2273,2159],{"class":496},[475,2275,2276,2279,2281,2283,2285,2287,2290,2292],{"class":477,"line":574},[475,2277,2278],{"class":496},"        \u003C",[475,2280,2213],{"class":503},[475,2282,2216],{"class":658},[475,2284,665],{"class":496},[475,2286,2152],{"class":496},[475,2288,2289],{"class":519},"animate-pulse space-y-4",[475,2291,2152],{"class":496},[475,2293,2159],{"class":496},[475,2295,2296,2299,2301,2303,2305,2307,2310,2312],{"class":477,"line":583},[475,2297,2298],{"class":496},"          \u003C",[475,2300,2213],{"class":503},[475,2302,2216],{"class":658},[475,2304,665],{"class":496},[475,2306,2152],{"class":496},[475,2308,2309],{"class":519},"h-10 bg-muted rounded",[475,2311,2152],{"class":496},[475,2313,2259],{"class":496},[475,2315,2316,2318,2320,2322,2324,2326,2328,2330],{"class":477,"line":592},[475,2317,2298],{"class":496},[475,2319,2213],{"class":503},[475,2321,2216],{"class":658},[475,2323,665],{"class":496},[475,2325,2152],{"class":496},[475,2327,2309],{"class":519},[475,2329,2152],{"class":496},[475,2331,2259],{"class":496},[475,2333,2334,2337,2339],{"class":477,"line":601},[475,2335,2336],{"class":496},"        \u003C/",[475,2338,2213],{"class":503},[475,2340,2159],{"class":496},[475,2342,2343,2346,2348],{"class":477,"line":607},[475,2344,2345],{"class":496},"      \u003C/",[475,2347,2203],{"class":503},[475,2349,2159],{"class":496},[475,2351,2352,2355,2357],{"class":477,"line":833},[475,2353,2354],{"class":496},"    \u003C/",[475,2356,2235],{"class":503},[475,2358,2159],{"class":496},[475,2360,2361,2364,2366],{"class":477,"line":838},[475,2362,2363],{"class":496},"  \u003C/",[475,2365,2213],{"class":503},[475,2367,2159],{"class":496},[475,2369,2370,2372,2374],{"class":477,"line":848},[475,2371,2188],{"class":496},[475,2373,2203],{"class":503},[475,2375,2159],{"class":496},[459,2377,2379],{"id":2378},"step-4-see-it-work","Step 4: See it work",[464,2381,2385],{"className":2382,"code":2383,"language":2384,"meta":470,"style":470},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm run dev\n","bash",[472,2386,2387],{"__ignoreMap":470},[475,2388,2389,2393,2396],{"class":477,"line":478},[475,2390,2392],{"class":2391},"sBMFI","npm",[475,2394,2395],{"class":519}," run",[475,2397,2398],{"class":519}," dev\n",[455,2400,2401,2402,2405],{},"Visit ",[472,2403,2404],{},"/estimator",". Adjust the sliders. The derived values update instantly. Refresh the page — your values are still there, loaded from IndexedDB. No server call was needed to save them.",[459,2407,2409],{"id":2408},"what-you-got-for-free","What you got for free",[2411,2412,2413,2426],"table",{},[2414,2415,2416],"thead",{},[2417,2418,2419,2423],"tr",{},[2420,2421,2422],"th",{},"Feature",[2420,2424,2425],{},"Source in schema",[2427,2428,2429,2440,2450,2460,2470,2480,2490,2498,2510],"tbody",{},[2417,2430,2431,2435],{},[2432,2433,2434],"td",{},"Form with labels and default values",[2432,2436,2437],{},[472,2438,2439],{},"fields",[2417,2441,2442,2445],{},[2432,2443,2444],{},"Range sliders for duration and overhead",[2432,2446,2447,1129],{},[472,2448,2449],{},"type: 'range'",[2417,2451,2452,2455],{},[2432,2453,2454],{},"Reactive computed totals",[2432,2456,2457],{},[472,2458,2459],{},"derived",[2417,2461,2462,2465],{},[2432,2463,2464],{},"Project size badge",[2432,2466,2467],{},[472,2468,2469],{},"results.badge",[2417,2471,2472,2475],{},[2432,2473,2474],{},"Four stat cards below the form",[2432,2476,2477],{},[472,2478,2479],{},"results.stats",[2417,2481,2482,2485],{},[2432,2483,2484],{},"Bar chart of monthly breakdown",[2432,2486,2487],{},[472,2488,2489],{},"visualizations",[2417,2491,2492,2495],{},[2432,2493,2494],{},"IndexedDB persistence (survives refresh)",[2432,2496,2497],{},"Automatic via Y.js",[2417,2499,2500,2503],{},[2432,2501,2502],{},"Server sync when online",[2432,2504,2505,2506,2509],{},"Automatic when ",[472,2507,2508],{},"protokit.serverSync"," is enabled + yjs-sync is installed",[2417,2511,2512,2515],{},[2432,2513,2514],{},"Corruption recovery modal",[2432,2516,2517,2518],{},"Automatic via ",[472,2519,392],{},[459,2521,2523],{"id":2522},"multiple-independent-instances","Multiple independent instances",[455,2525,2526,2527,2530],{},"Provide a custom ",[472,2528,2529],{},"doc-key"," to run multiple instances of the same schema with separate storage:",[464,2532,2534],{"className":2128,"code":2533,"language":2131,"meta":470,"style":470},"\u003CClientOnly>\n  \u003CProtoTool :schema=\"resourceEstimator\" doc-key=\"estimator-project-a\" />\n\u003C/ClientOnly>\n\u003CClientOnly>\n  \u003CProtoTool :schema=\"resourceEstimator\" doc-key=\"estimator-project-b\" />\n\u003C/ClientOnly>\n",[472,2535,2536,2544,2549,2557,2565,2570],{"__ignoreMap":470},[475,2537,2538,2540,2542],{"class":477,"line":478},[475,2539,2138],{"class":496},[475,2541,2235],{"class":503},[475,2543,2159],{"class":496},[475,2545,2546],{"class":477,"line":500},[475,2547,2548],{"class":492},"  \u003CProtoTool :schema=\"resourceEstimator\" doc-key=\"estimator-project-a\" />\n",[475,2550,2551,2553,2555],{"class":477,"line":513},[475,2552,2188],{"class":496},[475,2554,2235],{"class":503},[475,2556,2159],{"class":496},[475,2558,2559,2561,2563],{"class":477,"line":529},[475,2560,2138],{"class":496},[475,2562,2235],{"class":503},[475,2564,2159],{"class":496},[475,2566,2567],{"class":477,"line":536},[475,2568,2569],{"class":492},"  \u003CProtoTool :schema=\"resourceEstimator\" doc-key=\"estimator-project-b\" />\n",[475,2571,2572,2574,2576],{"class":477,"line":542},[475,2573,2188],{"class":496},[475,2575,2235],{"class":503},[475,2577,2159],{"class":496},[459,2579,2581],{"id":2580},"local-only-demo-tools","Local-only / demo tools",[455,2583,2584,2585,2588],{},"Add ",[472,2586,2587],{},"disable-sync"," to any tool that should never push to the server — regardless of the global config. Useful for public demo pages where you don't want to accumulate server snapshots per visitor:",[464,2590,2592],{"className":2128,"code":2591,"language":2131,"meta":470,"style":470},"\u003CClientOnly>\n  \u003CProtoTool :schema=\"resourceEstimator\" disable-sync />\n\u003C/ClientOnly>\n",[472,2593,2594,2602,2607],{"__ignoreMap":470},[475,2595,2596,2598,2600],{"class":477,"line":478},[475,2597,2138],{"class":496},[475,2599,2235],{"class":503},[475,2601,2159],{"class":496},[475,2603,2604],{"class":477,"line":500},[475,2605,2606],{"class":492},"  \u003CProtoTool :schema=\"resourceEstimator\" disable-sync />\n",[475,2608,2609,2611,2613],{"class":477,"line":513},[475,2610,2188],{"class":496},[475,2612,2235],{"class":503},[475,2614,2159],{"class":496},[455,2616,2617],{},"The tool still saves to the user's local IndexedDB — inputs survive page refresh. Only the server push is suppressed.",[459,2619,2621],{"id":2620},"next-steps","Next steps",[2623,2624,2625,2633,2639],"ul",{},[2626,2627,2628,2632],"li",{},[2629,2630,2631],"a",{"href":357},"Schema reference →"," — all field types, collection options, derived formatting",[2626,2634,2635,2638],{},[2629,2636,2637],{"href":416},"Offline-first →"," — how Y.js + IndexedDB work and what survives what",[2626,2640,2641,2644,2645,2647],{},[2629,2642,2643],{"href":383},"Composables →"," — use ",[472,2646,388],{}," directly for custom rendering",[2649,2650,2651],"style",{},"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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}",{"title":470,"searchDepth":500,"depth":500,"links":2653},[2654,2655,2656,2657,2658,2659,2660,2661],{"id":461,"depth":500,"text":462},{"id":639,"depth":500,"text":640},{"id":2124,"depth":500,"text":2125},{"id":2378,"depth":500,"text":2379},{"id":2408,"depth":500,"text":2409},{"id":2522,"depth":500,"text":2523},{"id":2580,"depth":500,"text":2581},{"id":2620,"depth":500,"text":2621},"Build your first tool in under 10 minutes — a resource cost estimator with form inputs, derived values, a result badge, and automatic offline persistence.","md",null,{},{"title":198},{"title":198,"description":2662},"1YIGTCJ3p7gkDIywPF4OPhOek4WclYEvkrp6MFc5a8s",[2670,2672],{"title":348,"path":349,"stem":350,"description":2671,"children":-1},"The mental model behind protokit — schemas, Y.js documents, the produces/consumes data graph, and how everything connects.",{"title":5,"path":357,"stem":358,"description":2673,"children":-1},"The PrototypeSchema type controls every aspect of a tool — its fields, derived values, collections, results, visualizations, and layout.",1772977476250]