[{"data":1,"prerenderedAt":3625},["ShallowReactive",2],{"navigation_docs":3,"-docs-products-apps-cockpit-integration":984},[4,8,44,50,86,583,625,918],{"title":5,"path":6,"stem":7},"Home","\u002Fdocs","docs\u002Findex",{"title":9,"path":10,"stem":11,"children":12},"API usage","\u002Fdocs\u002Fapi-usage","docs\u002Fapi-usage\u002Findex",[13,14,20,26,32,38],{"title":9,"path":10,"stem":11},{"title":15,"path":16,"stem":17,"children":18},"Errors","\u002Fdocs\u002Fapi-usage\u002Ferrors","docs\u002Fapi-usage\u002Ferrors\u002Findex",[19],{"title":15,"path":16,"stem":17},{"title":21,"path":22,"stem":23,"children":24},"Retries & idempotency","\u002Fdocs\u002Fapi-usage\u002Fidempotency","docs\u002Fapi-usage\u002Fidempotency\u002Findex",[25],{"title":21,"path":22,"stem":23},{"title":27,"path":28,"stem":29,"children":30},"Pagination & filtering","\u002Fdocs\u002Fapi-usage\u002Fpagination","docs\u002Fapi-usage\u002Fpagination\u002Findex",[31],{"title":27,"path":28,"stem":29},{"title":33,"path":34,"stem":35,"children":36},"Rate limits","\u002Fdocs\u002Fapi-usage\u002Frate-limits","docs\u002Fapi-usage\u002Frate-limits\u002Findex",[37],{"title":33,"path":34,"stem":35},{"title":39,"path":40,"stem":41,"children":42},"Versioning & stability","\u002Fdocs\u002Fapi-usage\u002Fversioning","docs\u002Fapi-usage\u002Fversioning\u002Findex",[43],{"title":39,"path":40,"stem":41},{"title":45,"path":46,"stem":47,"children":48},"What's new","\u002Fdocs\u002Fchangelog","docs\u002Fchangelog\u002Findex",[49],{"title":45,"path":46,"stem":47},{"title":51,"path":52,"stem":53,"children":54},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002Fgetting-started\u002Findex",[55,56,62,68,74,80],{"title":51,"path":52,"stem":53},{"title":57,"path":58,"stem":59,"children":60},"Architecture Overview","\u002Fdocs\u002Fgetting-started\u002Farchitecture","docs\u002Fgetting-started\u002Farchitecture\u002Findex",[61],{"title":57,"path":58,"stem":59},{"title":63,"path":64,"stem":65,"children":66},"Glossary","\u002Fdocs\u002Fgetting-started\u002Fglossary","docs\u002Fgetting-started\u002Fglossary\u002Findex",[67],{"title":63,"path":64,"stem":65},{"title":69,"path":70,"stem":71,"children":72},"Platform Overview","\u002Fdocs\u002Fgetting-started\u002Fplatform-overview","docs\u002Fgetting-started\u002Fplatform-overview\u002Findex",[73],{"title":69,"path":70,"stem":71},{"title":75,"path":76,"stem":77,"children":78},"Prerequisites","\u002Fdocs\u002Fgetting-started\u002Fprerequisites","docs\u002Fgetting-started\u002Fprerequisites\u002Findex",[79],{"title":75,"path":76,"stem":77},{"title":81,"path":82,"stem":83,"children":84},"Your First App in 15 Minutes","\u002Fdocs\u002Fgetting-started\u002Fquick-start","docs\u002Fgetting-started\u002Fquick-start\u002Findex",[85],{"title":81,"path":82,"stem":83},{"title":87,"path":88,"stem":89,"children":90},"Products","\u002Fdocs\u002Fproducts","docs\u002Fproducts\u002Findex",[91,92,98,170,200,218,254,320,517,565],{"title":87,"path":88,"stem":89},{"title":93,"path":94,"stem":95,"children":96},"AI Studio","\u002Fdocs\u002Fproducts\u002Fai","docs\u002Fproducts\u002Fai\u002Findex",[97],{"title":93,"path":94,"stem":95},{"title":99,"path":100,"stem":101,"children":102},"App Studio","\u002Fdocs\u002Fproducts\u002Fapps","docs\u002Fproducts\u002Fapps\u002Findex",[103,104,110,116,122,128,134,140,146,152,158,164],{"title":99,"path":100,"stem":101},{"title":105,"path":106,"stem":107,"children":108},"App Model","\u002Fdocs\u002Fproducts\u002Fapps\u002Fapp-model","docs\u002Fproducts\u002Fapps\u002Fapp-model\u002Findex",[109],{"title":105,"path":106,"stem":107},{"title":111,"path":112,"stem":113,"children":114},"Auto-generated data APIs","\u002Fdocs\u002Fproducts\u002Fapps\u002Fauto-generated-data-apis","docs\u002Fproducts\u002Fapps\u002Fauto-generated-data-apis\u002Findex",[115],{"title":111,"path":112,"stem":113},{"title":117,"path":118,"stem":119,"children":120},"Billing & Events","\u002Fdocs\u002Fproducts\u002Fapps\u002Fbilling-events","docs\u002Fproducts\u002Fapps\u002Fbilling-events\u002Findex",[121],{"title":117,"path":118,"stem":119},{"title":123,"path":124,"stem":125,"children":126},"Cockpit Integration","\u002Fdocs\u002Fproducts\u002Fapps\u002Fcockpit-integration","docs\u002Fproducts\u002Fapps\u002Fcockpit-integration\u002Findex",[127],{"title":123,"path":124,"stem":125},{"title":129,"path":130,"stem":131,"children":132},"App Model Concept","\u002Fdocs\u002Fproducts\u002Fapps\u002Fconcept","docs\u002Fproducts\u002Fapps\u002Fconcept\u002Findex",[133],{"title":129,"path":130,"stem":131},{"title":135,"path":136,"stem":137,"children":138},"App Lifecycle","\u002Fdocs\u002Fproducts\u002Fapps\u002Flifecycle","docs\u002Fproducts\u002Fapps\u002Flifecycle\u002Findex",[139],{"title":135,"path":136,"stem":137},{"title":141,"path":142,"stem":143,"children":144},"Manifest Reference","\u002Fdocs\u002Fproducts\u002Fapps\u002Fmanifest-reference","docs\u002Fproducts\u002Fapps\u002Fmanifest-reference\u002Findex",[145],{"title":141,"path":142,"stem":143},{"title":147,"path":148,"stem":149,"children":150},"Market Concept","\u002Fdocs\u002Fproducts\u002Fapps\u002Fmarket-concept","docs\u002Fproducts\u002Fapps\u002Fmarket-concept\u002Findex",[151],{"title":147,"path":148,"stem":149},{"title":153,"path":154,"stem":155,"children":156},"Policies","\u002Fdocs\u002Fproducts\u002Fapps\u002Fpolicies","docs\u002Fproducts\u002Fapps\u002Fpolicies\u002Findex",[157],{"title":153,"path":154,"stem":155},{"title":159,"path":160,"stem":161,"children":162},"Schema migrations","\u002Fdocs\u002Fproducts\u002Fapps\u002Fschema-migrator","docs\u002Fproducts\u002Fapps\u002Fschema-migrator\u002Findex",[163],{"title":159,"path":160,"stem":161},{"title":165,"path":166,"stem":167,"children":168},"Schema Reference","\u002Fdocs\u002Fproducts\u002Fapps\u002Fschema-reference","docs\u002Fproducts\u002Fapps\u002Fschema-reference\u002Findex",[169],{"title":165,"path":166,"stem":167},{"title":171,"path":172,"stem":173,"children":174},"Authentication","\u002Fdocs\u002Fproducts\u002Fauth","docs\u002Fproducts\u002Fauth\u002Findex",[175,176,182,188,194],{"title":171,"path":172,"stem":173},{"title":177,"path":178,"stem":179,"children":180},"API keys","\u002Fdocs\u002Fproducts\u002Fauth\u002Fapi-keys","docs\u002Fproducts\u002Fauth\u002Fapi-keys\u002Findex",[181],{"title":177,"path":178,"stem":179},{"title":183,"path":184,"stem":185,"children":186},"Multi-factor authentication","\u002Fdocs\u002Fproducts\u002Fauth\u002Fmfa","docs\u002Fproducts\u002Fauth\u002Fmfa\u002Findex",[187],{"title":183,"path":184,"stem":185},{"title":189,"path":190,"stem":191,"children":192},"Social sign-in","\u002Fdocs\u002Fproducts\u002Fauth\u002Foauth2","docs\u002Fproducts\u002Fauth\u002Foauth2\u002Findex",[193],{"title":189,"path":190,"stem":191},{"title":195,"path":196,"stem":197,"children":198},"Sessions","\u002Fdocs\u002Fproducts\u002Fauth\u002Fsessions","docs\u002Fproducts\u002Fauth\u002Fsessions\u002Findex",[199],{"title":195,"path":196,"stem":197},{"title":201,"path":202,"stem":203,"children":204},"Events","\u002Fdocs\u002Fproducts\u002Fevents","docs\u002Fproducts\u002Fevents\u002Findex",[205,206,212],{"title":201,"path":202,"stem":203},{"title":207,"path":208,"stem":209,"children":210},"Consuming events","\u002Fdocs\u002Fproducts\u002Fevents\u002Fconsuming-events","docs\u002Fproducts\u002Fevents\u002Fconsuming-events\u002Findex",[211],{"title":207,"path":208,"stem":209},{"title":213,"path":214,"stem":215,"children":216},"Event types","\u002Fdocs\u002Fproducts\u002Fevents\u002Fevent-types","docs\u002Fproducts\u002Fevents\u002Fevent-types\u002Findex",[217],{"title":213,"path":214,"stem":215},{"title":219,"path":220,"stem":221,"children":222},"Integration Studio","\u002Fdocs\u002Fproducts\u002Fintegration-studio","docs\u002Fproducts\u002Fintegration-studio\u002Findex",[223,224,230,236,242,248],{"title":219,"path":220,"stem":221},{"title":225,"path":226,"stem":227,"children":228},"Expression Syntax","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Fexpression-syntax","docs\u002Fproducts\u002Fintegration-studio\u002Fexpression-syntax\u002Findex",[229],{"title":225,"path":226,"stem":227},{"title":231,"path":232,"stem":233,"children":234},"Node Types","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Fnode-types","docs\u002Fproducts\u002Fintegration-studio\u002Fnode-types\u002Findex",[235],{"title":231,"path":232,"stem":233},{"title":237,"path":238,"stem":239,"children":240},"Dual-engine architecture","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Foverview","docs\u002Fproducts\u002Fintegration-studio\u002Foverview\u002Findex",[241],{"title":237,"path":238,"stem":239},{"title":243,"path":244,"stem":245,"children":246},"Triggers","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Ftriggers","docs\u002Fproducts\u002Fintegration-studio\u002Ftriggers\u002Findex",[247],{"title":243,"path":244,"stem":245},{"title":249,"path":250,"stem":251,"children":252},"Workflow Builder","\u002Fdocs\u002Fproducts\u002Fintegration-studio\u002Fworkflow-builder","docs\u002Fproducts\u002Fintegration-studio\u002Fworkflow-builder\u002Findex",[253],{"title":249,"path":250,"stem":251},{"title":255,"path":256,"stem":257,"children":258},"Network","\u002Fdocs\u002Fproducts\u002Fnetwork","docs\u002Fproducts\u002Fnetwork\u002Findex",[259,260,266,272,278,284,290,296,302,308,314],{"title":255,"path":256,"stem":257},{"title":261,"path":262,"stem":263,"children":264},"Caching","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fcaching","docs\u002Fproducts\u002Fnetwork\u002Fcaching\u002Findex",[265],{"title":261,"path":262,"stem":263},{"title":267,"path":268,"stem":269,"children":270},"Content delivery (CDN)","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fcdn","docs\u002Fproducts\u002Fnetwork\u002Fcdn\u002Findex",[271],{"title":267,"path":268,"stem":269},{"title":273,"path":274,"stem":275,"children":276},"Compression","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fcompression","docs\u002Fproducts\u002Fnetwork\u002Fcompression\u002Findex",[277],{"title":273,"path":274,"stem":275},{"title":279,"path":280,"stem":281,"children":282},"DDoS mitigation","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fddos","docs\u002Fproducts\u002Fnetwork\u002Fddos\u002Findex",[283],{"title":279,"path":280,"stem":281},{"title":285,"path":286,"stem":287,"children":288},"revenexx DNS service","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fdns","docs\u002Fproducts\u002Fnetwork\u002Fdns\u002Findex",[289],{"title":285,"path":286,"stem":287},{"title":291,"path":292,"stem":293,"children":294},"Edges","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fedges","docs\u002Fproducts\u002Fnetwork\u002Fedges\u002Findex",[295],{"title":291,"path":292,"stem":293},{"title":297,"path":298,"stem":299,"children":300},"Endpoints","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fendpoints","docs\u002Fproducts\u002Fnetwork\u002Fendpoints\u002Findex",[301],{"title":297,"path":298,"stem":299},{"title":303,"path":304,"stem":305,"children":306},"Regions","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fregions","docs\u002Fproducts\u002Fnetwork\u002Fregions\u002Findex",[307],{"title":303,"path":304,"stem":305},{"title":309,"path":310,"stem":311,"children":312},"Transport Layer Security (TLS)","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Ftls","docs\u002Fproducts\u002Fnetwork\u002Ftls\u002Findex",[313],{"title":309,"path":310,"stem":311},{"title":315,"path":316,"stem":317,"children":318},"Web application firewall (WAF)","\u002Fdocs\u002Fproducts\u002Fnetwork\u002Fwaf","docs\u002Fproducts\u002Fnetwork\u002Fwaf\u002Findex",[319],{"title":315,"path":316,"stem":317},{"title":321,"path":322,"stem":323,"children":324},"Experience Studio","\u002Fdocs\u002Fproducts\u002Fsites","docs\u002Fproducts\u002Fsites\u002Findex",[325,326,332,337,343,349,355,361,367,373,379,385,391,397,403,409,487,505,511],{"title":321,"path":322,"stem":323},{"title":327,"path":328,"stem":329,"children":330},"Storefront Architecture","\u002Fdocs\u002Fproducts\u002Fsites\u002Farchitecture","docs\u002Fproducts\u002Fsites\u002Farchitecture\u002Findex",[331],{"title":327,"path":328,"stem":329},{"title":171,"path":333,"stem":334,"children":335},"\u002Fdocs\u002Fproducts\u002Fsites\u002Fauthentication","docs\u002Fproducts\u002Fsites\u002Fauthentication\u002Findex",[336],{"title":171,"path":333,"stem":334},{"title":338,"path":339,"stem":340,"children":341},"Blökkli Blocks","\u002Fdocs\u002Fproducts\u002Fsites\u002Fblokki-blocks","docs\u002Fproducts\u002Fsites\u002Fblokki-blocks\u002Findex",[342],{"title":338,"path":339,"stem":340},{"title":344,"path":345,"stem":346,"children":347},"Checkout","\u002Fdocs\u002Fproducts\u002Fsites\u002Fcheckout","docs\u002Fproducts\u002Fsites\u002Fcheckout\u002Findex",[348],{"title":344,"path":345,"stem":346},{"title":350,"path":351,"stem":352,"children":353},"Deploy from CLI","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdeploy-from-cli","docs\u002Fproducts\u002Fsites\u002Fdeploy-from-cli\u002Findex",[354],{"title":350,"path":351,"stem":352},{"title":356,"path":357,"stem":358,"children":359},"Deploy from Git","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdeploy-from-git","docs\u002Fproducts\u002Fsites\u002Fdeploy-from-git\u002Findex",[360],{"title":356,"path":357,"stem":358},{"title":362,"path":363,"stem":364,"children":365},"Deploy manually","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdeploy-manually","docs\u002Fproducts\u002Fsites\u002Fdeploy-manually\u002Findex",[366],{"title":362,"path":363,"stem":364},{"title":368,"path":369,"stem":370,"children":371},"Deployments","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdeployments","docs\u002Fproducts\u002Fsites\u002Fdeployments\u002Findex",[372],{"title":368,"path":369,"stem":370},{"title":374,"path":375,"stem":376,"children":377},"Develop revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdevelop","docs\u002Fproducts\u002Fsites\u002Fdevelop\u002Findex",[378],{"title":374,"path":375,"stem":376},{"title":380,"path":381,"stem":382,"children":383},"Domains","\u002Fdocs\u002Fproducts\u002Fsites\u002Fdomains","docs\u002Fproducts\u002Fsites\u002Fdomains\u002Findex",[384],{"title":380,"path":381,"stem":382},{"title":386,"path":387,"stem":388,"children":389},"Frameworks","\u002Fdocs\u002Fproducts\u002Fsites\u002Fframeworks","docs\u002Fproducts\u002Fsites\u002Fframeworks\u002Findex",[390],{"title":386,"path":387,"stem":388},{"title":392,"path":393,"stem":394,"children":395},"Instant rollbacks","\u002Fdocs\u002Fproducts\u002Fsites\u002Finstant-rollbacks","docs\u002Fproducts\u002Fsites\u002Finstant-rollbacks\u002Findex",[396],{"title":392,"path":393,"stem":394},{"title":398,"path":399,"stem":400,"children":401},"Logs","\u002Fdocs\u002Fproducts\u002Fsites\u002Flogs","docs\u002Fproducts\u002Fsites\u002Flogs\u002Findex",[402],{"title":398,"path":399,"stem":400},{"title":404,"path":405,"stem":406,"children":407},"Previews","\u002Fdocs\u002Fproducts\u002Fsites\u002Fpreviews","docs\u002Fproducts\u002Fsites\u002Fpreviews\u002Findex",[408],{"title":404,"path":405,"stem":406},{"title":410,"path":411,"stem":412,"children":413},"Start with Sites","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Findex",[414,415,421,427,433,439,445,451,457,463,469,475,481],{"title":410,"path":411,"stem":412},{"title":416,"path":417,"stem":418,"children":419},"Deploy an Angular app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fangular","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fangular\u002Findex",[420],{"title":416,"path":417,"stem":418},{"title":422,"path":423,"stem":424,"children":425},"Deploy a Astro app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fastro","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fastro\u002Findex",[426],{"title":422,"path":423,"stem":424},{"title":428,"path":429,"stem":430,"children":431},"Deploy a Flutter Web app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fflutter","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fflutter\u002Findex",[432],{"title":428,"path":429,"stem":430},{"title":434,"path":435,"stem":436,"children":437},"Deploy a Next.js app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fnextjs","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fnextjs\u002Findex",[438],{"title":434,"path":435,"stem":436},{"title":440,"path":441,"stem":442,"children":443},"Deploy a Nuxt app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fnuxt","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fnuxt\u002Findex",[444],{"title":440,"path":441,"stem":442},{"title":446,"path":447,"stem":448,"children":449},"Deploy a React Native app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Freact-native","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Freact-native\u002Findex",[450],{"title":446,"path":447,"stem":448},{"title":452,"path":453,"stem":454,"children":455},"Deploy a React app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Freact","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Freact\u002Findex",[456],{"title":452,"path":453,"stem":454},{"title":458,"path":459,"stem":460,"children":461},"Deploy a Remix app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fremix","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fremix\u002Findex",[462],{"title":458,"path":459,"stem":460},{"title":464,"path":465,"stem":466,"children":467},"Deploy a SvelteKit app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fsveltekit","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fsveltekit\u002Findex",[468],{"title":464,"path":465,"stem":466},{"title":470,"path":471,"stem":472,"children":473},"Deploy a TanStack Start app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Ftanstack-start","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Ftanstack-start\u002Findex",[474],{"title":470,"path":471,"stem":472},{"title":476,"path":477,"stem":478,"children":479},"Deploy a Vanilla JS app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fvanilla","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fvanilla\u002Findex",[480],{"title":476,"path":477,"stem":478},{"title":482,"path":483,"stem":484,"children":485},"Deploy a Vue.js app to revenexx Storefronts","\u002Fdocs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fvue","docs\u002Fproducts\u002Fsites\u002Fquick-start\u002Fvue\u002Findex",[486],{"title":482,"path":483,"stem":484},{"title":488,"path":489,"stem":490,"children":491},"Rendering","\u002Fdocs\u002Fproducts\u002Fsites\u002Frendering","docs\u002Fproducts\u002Fsites\u002Frendering\u002Findex",[492,493,499],{"title":488,"path":489,"stem":490},{"title":494,"path":495,"stem":496,"children":497},"Server Side Rendering","\u002Fdocs\u002Fproducts\u002Fsites\u002Frendering\u002Fssr","docs\u002Fproducts\u002Fsites\u002Frendering\u002Fssr\u002Findex",[498],{"title":494,"path":495,"stem":496},{"title":500,"path":501,"stem":502,"children":503},"Static","\u002Fdocs\u002Fproducts\u002Fsites\u002Frendering\u002Fstatic","docs\u002Fproducts\u002Fsites\u002Frendering\u002Fstatic\u002Findex",[504],{"title":500,"path":501,"stem":502},{"title":506,"path":507,"stem":508,"children":509},"Templates","\u002Fdocs\u002Fproducts\u002Fsites\u002Ftemplates","docs\u002Fproducts\u002Fsites\u002Ftemplates\u002Findex",[510],{"title":506,"path":507,"stem":508},{"title":512,"path":513,"stem":514,"children":515},"Theming","\u002Fdocs\u002Fproducts\u002Fsites\u002Ftheming","docs\u002Fproducts\u002Fsites\u002Ftheming\u002Findex",[516],{"title":512,"path":513,"stem":514},{"title":518,"path":519,"stem":520,"children":521},"Storage","\u002Fdocs\u002Fproducts\u002Fstorage","docs\u002Fproducts\u002Fstorage\u002Findex",[522,523,529,535,541,547,553,559],{"title":518,"path":519,"stem":520},{"title":524,"path":525,"stem":526,"children":527},"Folders","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fbuckets","docs\u002Fproducts\u002Fstorage\u002Fbuckets\u002Findex",[528],{"title":524,"path":525,"stem":526},{"title":530,"path":531,"stem":532,"children":533},"Signed URLs and access","\u002Fdocs\u002Fproducts\u002Fstorage\u002Ffile-tokens","docs\u002Fproducts\u002Fstorage\u002Ffile-tokens\u002Findex",[534],{"title":530,"path":531,"stem":532},{"title":536,"path":537,"stem":538,"children":539},"Serve and transform images","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fimages","docs\u002Fproducts\u002Fstorage\u002Fimages\u002Findex",[540],{"title":536,"path":537,"stem":538},{"title":542,"path":543,"stem":544,"children":545},"3D assets","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fmodel-viewer","docs\u002Fproducts\u002Fstorage\u002Fmodel-viewer\u002Findex",[546],{"title":542,"path":543,"stem":544},{"title":548,"path":549,"stem":550,"children":551},"Access control and visibility","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fpermissions","docs\u002Fproducts\u002Fstorage\u002Fpermissions\u002Findex",[552],{"title":548,"path":549,"stem":550},{"title":554,"path":555,"stem":556,"children":557},"Quick start","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fquick-start","docs\u002Fproducts\u002Fstorage\u002Fquick-start\u002Findex",[558],{"title":554,"path":555,"stem":556},{"title":560,"path":561,"stem":562,"children":563},"Upload and manage files","\u002Fdocs\u002Fproducts\u002Fstorage\u002Fupload-download","docs\u002Fproducts\u002Fstorage\u002Fupload-download\u002Findex",[564],{"title":560,"path":561,"stem":562},{"title":566,"path":567,"stem":568,"children":569},"Webhooks","\u002Fdocs\u002Fproducts\u002Fwebhooks","docs\u002Fproducts\u002Fwebhooks\u002Findex",[570,571,577],{"title":566,"path":567,"stem":568},{"title":572,"path":573,"stem":574,"children":575},"Delivery","\u002Fdocs\u002Fproducts\u002Fwebhooks\u002Fdelivery","docs\u002Fproducts\u002Fwebhooks\u002Fdelivery\u002Findex",[576],{"title":572,"path":573,"stem":574},{"title":578,"path":579,"stem":580,"children":581},"Security","\u002Fdocs\u002Fproducts\u002Fwebhooks\u002Fsecurity","docs\u002Fproducts\u002Fwebhooks\u002Fsecurity\u002Findex",[582],{"title":578,"path":579,"stem":580},{"title":584,"path":585,"stem":586,"children":587},"SDKs","\u002Fdocs\u002Fsdks","docs\u002Fsdks\u002Findex",[588,589,595,601,607,613,619],{"title":584,"path":585,"stem":586},{"title":590,"path":591,"stem":592,"children":593},"App SDK","\u002Fdocs\u002Fsdks\u002Fapp-sdk","docs\u002Fsdks\u002Fapp-sdk\u002Findex",[594],{"title":590,"path":591,"stem":592},{"title":596,"path":597,"stem":598,"children":599},"CLI","\u002Fdocs\u002Fsdks\u002Fcli","docs\u002Fsdks\u002Fcli\u002Findex",[600],{"title":596,"path":597,"stem":598},{"title":602,"path":603,"stem":604,"children":605},"Integration Node SDK","\u002Fdocs\u002Fsdks\u002Fintegration-nodes","docs\u002Fsdks\u002Fintegration-nodes\u002Findex",[606],{"title":602,"path":603,"stem":604},{"title":608,"path":609,"stem":610,"children":611},"Node SDK","\u002Fdocs\u002Fsdks\u002Fnode","docs\u002Fsdks\u002Fnode\u002Findex",[612],{"title":608,"path":609,"stem":610},{"title":614,"path":615,"stem":616,"children":617},"PHP SDK","\u002Fdocs\u002Fsdks\u002Fphp","docs\u002Fsdks\u002Fphp\u002Findex",[618],{"title":614,"path":615,"stem":616},{"title":620,"path":621,"stem":622,"children":623},"Web \u002F JavaScript SDK","\u002Fdocs\u002Fsdks\u002Fweb","docs\u002Fsdks\u002Fweb\u002Findex",[624],{"title":620,"path":621,"stem":622},{"title":626,"path":627,"stem":628,"children":629},"Tooling","\u002Fdocs\u002Ftooling","docs\u002Ftooling\u002Findex",[630,631,637,864],{"title":626,"path":627,"stem":628},{"title":632,"path":633,"stem":634,"children":635},"Command Center","\u002Fdocs\u002Ftooling\u002Fcommand-center","docs\u002Ftooling\u002Fcommand-center\u002Findex",[636],{"title":632,"path":633,"stem":634},{"title":638,"path":639,"stem":640,"children":641},"Command line","\u002Fdocs\u002Ftooling\u002Fcommand-line","docs\u002Ftooling\u002Fcommand-line\u002Findex",[642,643,649,654,660,666,672,678,684,828,834,840,846,852,858],{"title":638,"path":639,"stem":640},{"title":644,"path":645,"stem":646,"children":647},"Aliases","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Faliases","docs\u002Ftooling\u002Fcommand-line\u002Faliases\u002Findex",[648],{"title":644,"path":645,"stem":646},{"title":171,"path":650,"stem":651,"children":652},"\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fauthentication","docs\u002Ftooling\u002Fcommand-line\u002Fauthentication\u002Findex",[653],{"title":171,"path":650,"stem":651},{"title":655,"path":656,"stem":657,"children":658},"Commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fcommands","docs\u002Ftooling\u002Fcommand-line\u002Fcommands\u002Findex",[659],{"title":655,"path":656,"stem":657},{"title":661,"path":662,"stem":663,"children":664},"Installation","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Finstallation","docs\u002Ftooling\u002Fcommand-line\u002Finstallation\u002Findex",[665],{"title":661,"path":662,"stem":663},{"title":667,"path":668,"stem":669,"children":670},"Interactive use","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Finteractive","docs\u002Ftooling\u002Fcommand-line\u002Finteractive\u002Findex",[671],{"title":667,"path":668,"stem":669},{"title":673,"path":674,"stem":675,"children":676},"Non-interactive use","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fnon-interactive","docs\u002Ftooling\u002Fcommand-line\u002Fnon-interactive\u002Findex",[677],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681,"children":682},"Project configuration","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fproject-configuration","docs\u002Ftooling\u002Fcommand-line\u002Fproject-configuration\u002Findex",[683],{"title":679,"path":680,"stem":681},{"title":685,"path":686,"stem":687,"children":688},"Command reference","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Findex",[689,690,696,702,708,714,720,726,732,738,744,750,756,762,768,774,780,786,792,798,804,810,816,822],{"title":685,"path":686,"stem":687},{"title":691,"path":692,"stem":693,"children":694},"About commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fabout","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fabout\u002Findex",[695],{"title":691,"path":692,"stem":693},{"title":697,"path":698,"stem":699,"children":700},"Apps commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fapps","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fapps\u002Findex",[701],{"title":697,"path":698,"stem":699},{"title":703,"path":704,"stem":705,"children":706},"Carts commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcarts","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcarts\u002Findex",[707],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711,"children":712},"Channels commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fchannels","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fchannels\u002Findex",[713],{"title":709,"path":710,"stem":711},{"title":715,"path":716,"stem":717,"children":718},"Create commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcreate","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcreate\u002Findex",[719],{"title":715,"path":716,"stem":717},{"title":721,"path":722,"stem":723,"children":724},"Customers commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcustomers","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fcustomers\u002Findex",[725],{"title":721,"path":722,"stem":723},{"title":727,"path":728,"stem":729,"children":730},"Deploy commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fdeploy","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fdeploy\u002Findex",[731],{"title":727,"path":728,"stem":729},{"title":733,"path":734,"stem":735,"children":736},"Forms commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fforms","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fforms\u002Findex",[737],{"title":733,"path":734,"stem":735},{"title":739,"path":740,"stem":741,"children":742},"Inventories commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Finventories","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Finventories\u002Findex",[743],{"title":739,"path":740,"stem":741},{"title":745,"path":746,"stem":747,"children":748},"Markets commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fmarkets","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fmarkets\u002Findex",[749],{"title":745,"path":746,"stem":747},{"title":751,"path":752,"stem":753,"children":754},"Order lists commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Forderlists","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Forderlists\u002Findex",[755],{"title":751,"path":752,"stem":753},{"title":757,"path":758,"stem":759,"children":760},"Orders commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Forders","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Forders\u002Findex",[761],{"title":757,"path":758,"stem":759},{"title":763,"path":764,"stem":765,"children":766},"Pages commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fpages","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fpages\u002Findex",[767],{"title":763,"path":764,"stem":765},{"title":769,"path":770,"stem":771,"children":772},"Payments commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fpayments","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fpayments\u002Findex",[773],{"title":769,"path":770,"stem":771},{"title":775,"path":776,"stem":777,"children":778},"Prices commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fprices","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fprices\u002Findex",[779],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783,"children":784},"Products commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fproducts","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fproducts\u002Findex",[785],{"title":781,"path":782,"stem":783},{"title":787,"path":788,"stem":789,"children":790},"Search commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsearch","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsearch\u002Findex",[791],{"title":787,"path":788,"stem":789},{"title":793,"path":794,"stem":795,"children":796},"Settings commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsettings","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsettings\u002Findex",[797],{"title":793,"path":794,"stem":795},{"title":799,"path":800,"stem":801,"children":802},"Shipping commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fshipping","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fshipping\u002Findex",[803],{"title":799,"path":800,"stem":801},{"title":805,"path":806,"stem":807,"children":808},"Sites commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsites","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fsites\u002Findex",[809],{"title":805,"path":806,"stem":807},{"title":811,"path":812,"stem":813,"children":814},"Skills commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fskills","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fskills\u002Findex",[815],{"title":811,"path":812,"stem":813},{"title":817,"path":818,"stem":819,"children":820},"Storage commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fstorage","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Fstorage\u002Findex",[821],{"title":817,"path":818,"stem":819},{"title":823,"path":824,"stem":825,"children":826},"Tokens commands","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Freference\u002Ftokens","docs\u002Ftooling\u002Fcommand-line\u002Freference\u002Ftokens\u002Findex",[827],{"title":823,"path":824,"stem":825},{"title":829,"path":830,"stem":831,"children":832},"Interactive shell (REPL)","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Frepl","docs\u002Ftooling\u002Fcommand-line\u002Frepl\u002Findex",[833],{"title":829,"path":830,"stem":831},{"title":835,"path":836,"stem":837,"children":838},"Scaffolding","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fscaffolding","docs\u002Ftooling\u002Fcommand-line\u002Fscaffolding\u002Findex",[839],{"title":835,"path":836,"stem":837},{"title":841,"path":842,"stem":843,"children":844},"Scripting & output","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fscripting","docs\u002Ftooling\u002Fcommand-line\u002Fscripting\u002Findex",[845],{"title":841,"path":842,"stem":843},{"title":847,"path":848,"stem":849,"children":850},"Skills","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Fskills","docs\u002Ftooling\u002Fcommand-line\u002Fskills\u002Findex",[851],{"title":847,"path":848,"stem":849},{"title":853,"path":854,"stem":855,"children":856},"Full-screen app (TUI)","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Ftui","docs\u002Ftooling\u002Fcommand-line\u002Ftui\u002Findex",[857],{"title":853,"path":854,"stem":855},{"title":859,"path":860,"stem":861,"children":862},"Type generation","\u002Fdocs\u002Ftooling\u002Fcommand-line\u002Ftype-generation","docs\u002Ftooling\u002Fcommand-line\u002Ftype-generation\u002Findex",[863],{"title":859,"path":860,"stem":861},{"title":865,"path":866,"stem":867,"children":868},"Model Context Protocol","\u002Fdocs\u002Ftooling\u002Fmcp","docs\u002Ftooling\u002Fmcp\u002Findex",[869,870,876,882,888,894,900,906,912],{"title":865,"path":866,"stem":867},{"title":871,"path":872,"stem":873,"children":874},"revenexx docs MCP in Google Antigravity","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fantigravity","docs\u002Ftooling\u002Fmcp\u002Fantigravity\u002Findex",[875],{"title":871,"path":872,"stem":873},{"title":877,"path":878,"stem":879,"children":880},"revenexx docs MCP in Claude Code","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fclaude-code","docs\u002Ftooling\u002Fmcp\u002Fclaude-code\u002Findex",[881],{"title":877,"path":878,"stem":879},{"title":883,"path":884,"stem":885,"children":886},"revenexx docs MCP in Claude Desktop","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fclaude-desktop","docs\u002Ftooling\u002Fmcp\u002Fclaude-desktop\u002Findex",[887],{"title":883,"path":884,"stem":885},{"title":889,"path":890,"stem":891,"children":892},"revenexx docs MCP in Cursor","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fcursor","docs\u002Ftooling\u002Fmcp\u002Fcursor\u002Findex",[893],{"title":889,"path":890,"stem":891},{"title":895,"path":896,"stem":897,"children":898},"revenexx docs MCP in OpenCode","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fopencode","docs\u002Ftooling\u002Fmcp\u002Fopencode\u002Findex",[899],{"title":895,"path":896,"stem":897},{"title":901,"path":902,"stem":903,"children":904},"revenexx docs MCP in VS Code","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fvscode","docs\u002Ftooling\u002Fmcp\u002Fvscode\u002Findex",[905],{"title":901,"path":902,"stem":903},{"title":907,"path":908,"stem":909,"children":910},"revenexx docs MCP in Windsurf","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fwindsurf","docs\u002Ftooling\u002Fmcp\u002Fwindsurf\u002Findex",[911],{"title":907,"path":908,"stem":909},{"title":913,"path":914,"stem":915,"children":916},"revenexx docs MCP in Zenflow","\u002Fdocs\u002Ftooling\u002Fmcp\u002Fzenflow","docs\u002Ftooling\u002Fmcp\u002Fzenflow\u002Findex",[917],{"title":913,"path":914,"stem":915},{"title":919,"path":920,"stem":921,"children":922},"Tutorials","\u002Fdocs\u002Ftutorials","docs\u002Ftutorials\u002Findex",[923,924,948,954],{"title":919,"path":920,"stem":921},{"title":925,"path":926,"stem":927,"children":928},"Build a revenexx App","\u002Fdocs\u002Ftutorials\u002Fapps","docs\u002Ftutorials\u002Fapps\u002Findex",[929,930,936,942],{"title":925,"path":926,"stem":927},{"title":931,"path":932,"stem":933,"children":934},"Add a data model","\u002Fdocs\u002Ftutorials\u002Fapps\u002Fadd-a-data-model","docs\u002Ftutorials\u002Fapps\u002Fadd-a-data-model\u002Findex",[935],{"title":931,"path":932,"stem":933},{"title":937,"path":938,"stem":939,"children":940},"Build your first app","\u002Fdocs\u002Ftutorials\u002Fapps\u002Fbuild-your-first-app","docs\u002Ftutorials\u002Fapps\u002Fbuild-your-first-app\u002Findex",[941],{"title":937,"path":938,"stem":939},{"title":943,"path":944,"stem":945,"children":946},"Deploy with the CLI","\u002Fdocs\u002Ftutorials\u002Fapps\u002Fdeploy-with-the-cli","docs\u002Ftutorials\u002Fapps\u002Fdeploy-with-the-cli\u002Findex",[947],{"title":943,"path":944,"stem":945},{"title":949,"path":950,"stem":951,"children":952},"Examples","\u002Fdocs\u002Ftutorials\u002Fexamples","docs\u002Ftutorials\u002Fexamples\u002Findex",[953],{"title":949,"path":950,"stem":951},{"title":955,"path":956,"stem":957,"children":958},"Build a storefront Theme","\u002Fdocs\u002Ftutorials\u002Fthemes","docs\u002Ftutorials\u002Fthemes\u002Findex",[959,960,966,972,978],{"title":955,"path":956,"stem":957},{"title":961,"path":962,"stem":963,"children":964},"Build your first Theme","\u002Fdocs\u002Ftutorials\u002Fthemes\u002Fbuild-your-first-theme","docs\u002Ftutorials\u002Fthemes\u002Fbuild-your-first-theme\u002Findex",[965],{"title":961,"path":962,"stem":963},{"title":967,"path":968,"stem":969,"children":970},"Customize blocks","\u002Fdocs\u002Ftutorials\u002Fthemes\u002Fcustomize-blocks","docs\u002Ftutorials\u002Fthemes\u002Fcustomize-blocks\u002Findex",[971],{"title":967,"path":968,"stem":969},{"title":973,"path":974,"stem":975,"children":976},"Deploy your storefront","\u002Fdocs\u002Ftutorials\u002Fthemes\u002Fdeploy-your-storefront","docs\u002Ftutorials\u002Fthemes\u002Fdeploy-your-storefront\u002Findex",[977],{"title":973,"path":974,"stem":975},{"title":979,"path":980,"stem":981,"children":982},"Theme tokens and styling","\u002Fdocs\u002Ftutorials\u002Fthemes\u002Ftheme-tokens-and-styling","docs\u002Ftutorials\u002Fthemes\u002Ftheme-tokens-and-styling\u002Findex",[983],{"title":979,"path":980,"stem":981},{"id":985,"title":123,"body":986,"description":3617,"extension":3618,"landing":3619,"links":3619,"meta":3620,"navigation":2342,"path":124,"seo":3622,"sitemap":3623,"stem":125,"__hash__":3624},"docs\u002Fdocs\u002Fproducts\u002Fapps\u002Fcockpit-integration\u002Findex.md",{"type":987,"value":988,"toc":3602},"minimark",[989,998,1013,1024,1041,1046,1665,1669,1675,1680,1683,1789,1891,1897,2003,2007,2014,2210,2293,2298,2304,2457,2461,2472,2590,2666,2669,2673,2679,2816,2919,2922,3179,3183,3186,3267,3278,3282,3303,3307,3314,3318,3321,3534,3538,3541,3551,3560,3566,3570,3598],[990,991,992,993,997],"p",{},"This is for ",[994,995,996],"strong",{},"app developers"," whose app needs to appear in Cockpit — with a sidebar entry, a full-page view, a dashboard widget, or an action button on another app's screen. If your app is purely a backend service (only exposes an API, no UI in Cockpit), you don't need this page.",[990,999,1000,1001,1004,1005,1009,1010,1012],{},"Cockpit isn't a single application that has every feature hard-coded. It's a Vue.js shell that ",[994,1002,1003],{},"composes its UI at runtime"," from the apps a customer has installed. Each app declares its UI contributions in ",[1006,1007,1008],"code",{},"cockpit.json"," — what navigation items to add, what routes to register, what widgets to put on the dashboard. When the customer opens Cockpit, the shell reads each installed app's ",[1006,1011,1008],{}," and weaves the contributions together.",[990,1014,1015,1016,1018,1019,1023],{},"The Vue components that implement your views and widgets are deployed alongside your app. The configuration in ",[1006,1017,1008],{}," is what tells Cockpit ",[1020,1021,1022],"em",{},"where"," in the UI those components show up.",[990,1025,1026,1027,1030,1031,1030,1034,1030,1037,1040],{},"This page documents the four extension point types — ",[1006,1028,1029],{},"navigation",", ",[1006,1032,1033],{},"views",[1006,1035,1036],{},"widgets",[1006,1038,1039],{},"action_buttons"," — and how to wire each one up.",[1042,1043,1045],"h2",{"id":1044},"complete-example","Complete Example",[1047,1048,1053],"pre",{"className":1049,"code":1050,"language":1051,"meta":1052,"style":1052},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"$schema\": \"https:\u002F\u002Frevenexx.com\u002Fschemas\u002Fcockpit.schema.json\",\n  \"navigation\": [\n    {\n      \"id\": \"orders-nav\",\n      \"label\": \"Orders\",\n      \"icon\": \"shopping-cart\",\n      \"path\": \"\u002Forders\"\n    }\n  ],\n  \"views\": [\n    {\n      \"id\": \"orders-list\",\n      \"route\": \"\u002Forders\",\n      \"label\": \"Orders\",\n      \"title\": \"Order Management\",\n      \"component\": \"OrdersList\"\n    },\n    {\n      \"id\": \"orders-detail\",\n      \"route\": \"\u002Forders\u002F:id\",\n      \"label\": \"Order Detail\",\n      \"component\": \"OrderDetail\"\n    }\n  ],\n  \"widgets\": [\n    {\n      \"id\": \"orders-summary\",\n      \"label\": \"Order Summary\",\n      \"description\": \"Today's order count and revenue\",\n      \"component\": \"OrderSummaryWidget\"\n    }\n  ],\n  \"action_buttons\": [\n    {\n      \"id\": \"sync-erp\",\n      \"label\": \"Sync to ERP\",\n      \"description\": \"Send this order to the ERP system\",\n      \"target_view\": \"\u002Forders\u002F:id\",\n      \"component\": \"SyncToERPButton\"\n    }\n  ]\n}\n","json","",[1006,1054,1055,1064,1092,1106,1112,1135,1156,1177,1197,1203,1209,1222,1227,1247,1267,1286,1307,1326,1332,1337,1357,1377,1397,1415,1420,1425,1438,1443,1463,1483,1504,1522,1527,1532,1545,1550,1570,1590,1610,1630,1648,1653,1659],{"__ignoreMap":1052},[1056,1057,1060],"span",{"class":1058,"line":1059},"line",1,[1056,1061,1063],{"class":1062},"sMK4o","{\n",[1056,1065,1067,1070,1074,1077,1080,1083,1087,1089],{"class":1058,"line":1066},2,[1056,1068,1069],{"class":1062},"  \"",[1056,1071,1073],{"class":1072},"spNyl","$schema",[1056,1075,1076],{"class":1062},"\"",[1056,1078,1079],{"class":1062},":",[1056,1081,1082],{"class":1062}," \"",[1056,1084,1086],{"class":1085},"sfazB","https:\u002F\u002Frevenexx.com\u002Fschemas\u002Fcockpit.schema.json",[1056,1088,1076],{"class":1062},[1056,1090,1091],{"class":1062},",\n",[1056,1093,1095,1097,1099,1101,1103],{"class":1058,"line":1094},3,[1056,1096,1069],{"class":1062},[1056,1098,1029],{"class":1072},[1056,1100,1076],{"class":1062},[1056,1102,1079],{"class":1062},[1056,1104,1105],{"class":1062}," [\n",[1056,1107,1109],{"class":1058,"line":1108},4,[1056,1110,1111],{"class":1062},"    {\n",[1056,1113,1115,1118,1122,1124,1126,1128,1131,1133],{"class":1058,"line":1114},5,[1056,1116,1117],{"class":1062},"      \"",[1056,1119,1121],{"class":1120},"sBMFI","id",[1056,1123,1076],{"class":1062},[1056,1125,1079],{"class":1062},[1056,1127,1082],{"class":1062},[1056,1129,1130],{"class":1085},"orders-nav",[1056,1132,1076],{"class":1062},[1056,1134,1091],{"class":1062},[1056,1136,1138,1140,1143,1145,1147,1149,1152,1154],{"class":1058,"line":1137},6,[1056,1139,1117],{"class":1062},[1056,1141,1142],{"class":1120},"label",[1056,1144,1076],{"class":1062},[1056,1146,1079],{"class":1062},[1056,1148,1082],{"class":1062},[1056,1150,1151],{"class":1085},"Orders",[1056,1153,1076],{"class":1062},[1056,1155,1091],{"class":1062},[1056,1157,1159,1161,1164,1166,1168,1170,1173,1175],{"class":1058,"line":1158},7,[1056,1160,1117],{"class":1062},[1056,1162,1163],{"class":1120},"icon",[1056,1165,1076],{"class":1062},[1056,1167,1079],{"class":1062},[1056,1169,1082],{"class":1062},[1056,1171,1172],{"class":1085},"shopping-cart",[1056,1174,1076],{"class":1062},[1056,1176,1091],{"class":1062},[1056,1178,1180,1182,1185,1187,1189,1191,1194],{"class":1058,"line":1179},8,[1056,1181,1117],{"class":1062},[1056,1183,1184],{"class":1120},"path",[1056,1186,1076],{"class":1062},[1056,1188,1079],{"class":1062},[1056,1190,1082],{"class":1062},[1056,1192,1193],{"class":1085},"\u002Forders",[1056,1195,1196],{"class":1062},"\"\n",[1056,1198,1200],{"class":1058,"line":1199},9,[1056,1201,1202],{"class":1062},"    }\n",[1056,1204,1206],{"class":1058,"line":1205},10,[1056,1207,1208],{"class":1062},"  ],\n",[1056,1210,1212,1214,1216,1218,1220],{"class":1058,"line":1211},11,[1056,1213,1069],{"class":1062},[1056,1215,1033],{"class":1072},[1056,1217,1076],{"class":1062},[1056,1219,1079],{"class":1062},[1056,1221,1105],{"class":1062},[1056,1223,1225],{"class":1058,"line":1224},12,[1056,1226,1111],{"class":1062},[1056,1228,1230,1232,1234,1236,1238,1240,1243,1245],{"class":1058,"line":1229},13,[1056,1231,1117],{"class":1062},[1056,1233,1121],{"class":1120},[1056,1235,1076],{"class":1062},[1056,1237,1079],{"class":1062},[1056,1239,1082],{"class":1062},[1056,1241,1242],{"class":1085},"orders-list",[1056,1244,1076],{"class":1062},[1056,1246,1091],{"class":1062},[1056,1248,1250,1252,1255,1257,1259,1261,1263,1265],{"class":1058,"line":1249},14,[1056,1251,1117],{"class":1062},[1056,1253,1254],{"class":1120},"route",[1056,1256,1076],{"class":1062},[1056,1258,1079],{"class":1062},[1056,1260,1082],{"class":1062},[1056,1262,1193],{"class":1085},[1056,1264,1076],{"class":1062},[1056,1266,1091],{"class":1062},[1056,1268,1270,1272,1274,1276,1278,1280,1282,1284],{"class":1058,"line":1269},15,[1056,1271,1117],{"class":1062},[1056,1273,1142],{"class":1120},[1056,1275,1076],{"class":1062},[1056,1277,1079],{"class":1062},[1056,1279,1082],{"class":1062},[1056,1281,1151],{"class":1085},[1056,1283,1076],{"class":1062},[1056,1285,1091],{"class":1062},[1056,1287,1289,1291,1294,1296,1298,1300,1303,1305],{"class":1058,"line":1288},16,[1056,1290,1117],{"class":1062},[1056,1292,1293],{"class":1120},"title",[1056,1295,1076],{"class":1062},[1056,1297,1079],{"class":1062},[1056,1299,1082],{"class":1062},[1056,1301,1302],{"class":1085},"Order Management",[1056,1304,1076],{"class":1062},[1056,1306,1091],{"class":1062},[1056,1308,1310,1312,1315,1317,1319,1321,1324],{"class":1058,"line":1309},17,[1056,1311,1117],{"class":1062},[1056,1313,1314],{"class":1120},"component",[1056,1316,1076],{"class":1062},[1056,1318,1079],{"class":1062},[1056,1320,1082],{"class":1062},[1056,1322,1323],{"class":1085},"OrdersList",[1056,1325,1196],{"class":1062},[1056,1327,1329],{"class":1058,"line":1328},18,[1056,1330,1331],{"class":1062},"    },\n",[1056,1333,1335],{"class":1058,"line":1334},19,[1056,1336,1111],{"class":1062},[1056,1338,1340,1342,1344,1346,1348,1350,1353,1355],{"class":1058,"line":1339},20,[1056,1341,1117],{"class":1062},[1056,1343,1121],{"class":1120},[1056,1345,1076],{"class":1062},[1056,1347,1079],{"class":1062},[1056,1349,1082],{"class":1062},[1056,1351,1352],{"class":1085},"orders-detail",[1056,1354,1076],{"class":1062},[1056,1356,1091],{"class":1062},[1056,1358,1360,1362,1364,1366,1368,1370,1373,1375],{"class":1058,"line":1359},21,[1056,1361,1117],{"class":1062},[1056,1363,1254],{"class":1120},[1056,1365,1076],{"class":1062},[1056,1367,1079],{"class":1062},[1056,1369,1082],{"class":1062},[1056,1371,1372],{"class":1085},"\u002Forders\u002F:id",[1056,1374,1076],{"class":1062},[1056,1376,1091],{"class":1062},[1056,1378,1380,1382,1384,1386,1388,1390,1393,1395],{"class":1058,"line":1379},22,[1056,1381,1117],{"class":1062},[1056,1383,1142],{"class":1120},[1056,1385,1076],{"class":1062},[1056,1387,1079],{"class":1062},[1056,1389,1082],{"class":1062},[1056,1391,1392],{"class":1085},"Order Detail",[1056,1394,1076],{"class":1062},[1056,1396,1091],{"class":1062},[1056,1398,1400,1402,1404,1406,1408,1410,1413],{"class":1058,"line":1399},23,[1056,1401,1117],{"class":1062},[1056,1403,1314],{"class":1120},[1056,1405,1076],{"class":1062},[1056,1407,1079],{"class":1062},[1056,1409,1082],{"class":1062},[1056,1411,1412],{"class":1085},"OrderDetail",[1056,1414,1196],{"class":1062},[1056,1416,1418],{"class":1058,"line":1417},24,[1056,1419,1202],{"class":1062},[1056,1421,1423],{"class":1058,"line":1422},25,[1056,1424,1208],{"class":1062},[1056,1426,1428,1430,1432,1434,1436],{"class":1058,"line":1427},26,[1056,1429,1069],{"class":1062},[1056,1431,1036],{"class":1072},[1056,1433,1076],{"class":1062},[1056,1435,1079],{"class":1062},[1056,1437,1105],{"class":1062},[1056,1439,1441],{"class":1058,"line":1440},27,[1056,1442,1111],{"class":1062},[1056,1444,1446,1448,1450,1452,1454,1456,1459,1461],{"class":1058,"line":1445},28,[1056,1447,1117],{"class":1062},[1056,1449,1121],{"class":1120},[1056,1451,1076],{"class":1062},[1056,1453,1079],{"class":1062},[1056,1455,1082],{"class":1062},[1056,1457,1458],{"class":1085},"orders-summary",[1056,1460,1076],{"class":1062},[1056,1462,1091],{"class":1062},[1056,1464,1466,1468,1470,1472,1474,1476,1479,1481],{"class":1058,"line":1465},29,[1056,1467,1117],{"class":1062},[1056,1469,1142],{"class":1120},[1056,1471,1076],{"class":1062},[1056,1473,1079],{"class":1062},[1056,1475,1082],{"class":1062},[1056,1477,1478],{"class":1085},"Order Summary",[1056,1480,1076],{"class":1062},[1056,1482,1091],{"class":1062},[1056,1484,1486,1488,1491,1493,1495,1497,1500,1502],{"class":1058,"line":1485},30,[1056,1487,1117],{"class":1062},[1056,1489,1490],{"class":1120},"description",[1056,1492,1076],{"class":1062},[1056,1494,1079],{"class":1062},[1056,1496,1082],{"class":1062},[1056,1498,1499],{"class":1085},"Today's order count and revenue",[1056,1501,1076],{"class":1062},[1056,1503,1091],{"class":1062},[1056,1505,1507,1509,1511,1513,1515,1517,1520],{"class":1058,"line":1506},31,[1056,1508,1117],{"class":1062},[1056,1510,1314],{"class":1120},[1056,1512,1076],{"class":1062},[1056,1514,1079],{"class":1062},[1056,1516,1082],{"class":1062},[1056,1518,1519],{"class":1085},"OrderSummaryWidget",[1056,1521,1196],{"class":1062},[1056,1523,1525],{"class":1058,"line":1524},32,[1056,1526,1202],{"class":1062},[1056,1528,1530],{"class":1058,"line":1529},33,[1056,1531,1208],{"class":1062},[1056,1533,1535,1537,1539,1541,1543],{"class":1058,"line":1534},34,[1056,1536,1069],{"class":1062},[1056,1538,1039],{"class":1072},[1056,1540,1076],{"class":1062},[1056,1542,1079],{"class":1062},[1056,1544,1105],{"class":1062},[1056,1546,1548],{"class":1058,"line":1547},35,[1056,1549,1111],{"class":1062},[1056,1551,1553,1555,1557,1559,1561,1563,1566,1568],{"class":1058,"line":1552},36,[1056,1554,1117],{"class":1062},[1056,1556,1121],{"class":1120},[1056,1558,1076],{"class":1062},[1056,1560,1079],{"class":1062},[1056,1562,1082],{"class":1062},[1056,1564,1565],{"class":1085},"sync-erp",[1056,1567,1076],{"class":1062},[1056,1569,1091],{"class":1062},[1056,1571,1573,1575,1577,1579,1581,1583,1586,1588],{"class":1058,"line":1572},37,[1056,1574,1117],{"class":1062},[1056,1576,1142],{"class":1120},[1056,1578,1076],{"class":1062},[1056,1580,1079],{"class":1062},[1056,1582,1082],{"class":1062},[1056,1584,1585],{"class":1085},"Sync to ERP",[1056,1587,1076],{"class":1062},[1056,1589,1091],{"class":1062},[1056,1591,1593,1595,1597,1599,1601,1603,1606,1608],{"class":1058,"line":1592},38,[1056,1594,1117],{"class":1062},[1056,1596,1490],{"class":1120},[1056,1598,1076],{"class":1062},[1056,1600,1079],{"class":1062},[1056,1602,1082],{"class":1062},[1056,1604,1605],{"class":1085},"Send this order to the ERP system",[1056,1607,1076],{"class":1062},[1056,1609,1091],{"class":1062},[1056,1611,1613,1615,1618,1620,1622,1624,1626,1628],{"class":1058,"line":1612},39,[1056,1614,1117],{"class":1062},[1056,1616,1617],{"class":1120},"target_view",[1056,1619,1076],{"class":1062},[1056,1621,1079],{"class":1062},[1056,1623,1082],{"class":1062},[1056,1625,1372],{"class":1085},[1056,1627,1076],{"class":1062},[1056,1629,1091],{"class":1062},[1056,1631,1633,1635,1637,1639,1641,1643,1646],{"class":1058,"line":1632},40,[1056,1634,1117],{"class":1062},[1056,1636,1314],{"class":1120},[1056,1638,1076],{"class":1062},[1056,1640,1079],{"class":1062},[1056,1642,1082],{"class":1062},[1056,1644,1645],{"class":1085},"SyncToERPButton",[1056,1647,1196],{"class":1062},[1056,1649,1651],{"class":1058,"line":1650},41,[1056,1652,1202],{"class":1062},[1056,1654,1656],{"class":1058,"line":1655},42,[1056,1657,1658],{"class":1062},"  ]\n",[1056,1660,1662],{"class":1058,"line":1661},43,[1056,1663,1664],{"class":1062},"}\n",[1042,1666,1668],{"id":1667},"extension-points","Extension Points",[990,1670,1671,1672,1674],{},"There are four kinds of contribution an app can make to Cockpit, and they differ by ",[1020,1673,1022],{}," they appear. Navigation items live in the sidebar, views own full pages, widgets sit on the dashboard, and action buttons are injected into pages that may belong to another app entirely. Most apps use the first two; widgets and action buttons are how you surface your app in places a customer is already looking.",[1676,1677,1679],"h3",{"id":1678},"navigation-sidebar-items","Navigation (Sidebar Items)",[990,1681,1682],{},"A navigation entry is the top-level way into your app — the line in Cockpit's sidebar a user clicks to reach it. At its simplest it's a label, an icon, and the path it links to:",[1047,1684,1686],{"className":1049,"code":1685,"language":1051,"meta":1052,"style":1052},"\"navigation\": [\n  {\n    \"id\": \"orders-nav\",\n    \"label\": \"Orders\",\n    \"icon\": \"shopping-cart\",\n    \"path\": \"\u002Forders\"\n  }\n]\n",[1006,1687,1688,1703,1708,1727,1745,1763,1779,1784],{"__ignoreMap":1052},[1056,1689,1690,1692,1694,1696,1700],{"class":1058,"line":1059},[1056,1691,1076],{"class":1062},[1056,1693,1029],{"class":1085},[1056,1695,1076],{"class":1062},[1056,1697,1699],{"class":1698},"sTEyZ",": ",[1056,1701,1702],{"class":1062},"[\n",[1056,1704,1705],{"class":1058,"line":1066},[1056,1706,1707],{"class":1062},"  {\n",[1056,1709,1710,1713,1715,1717,1719,1721,1723,1725],{"class":1058,"line":1094},[1056,1711,1712],{"class":1062},"    \"",[1056,1714,1121],{"class":1072},[1056,1716,1076],{"class":1062},[1056,1718,1079],{"class":1062},[1056,1720,1082],{"class":1062},[1056,1722,1130],{"class":1085},[1056,1724,1076],{"class":1062},[1056,1726,1091],{"class":1062},[1056,1728,1729,1731,1733,1735,1737,1739,1741,1743],{"class":1058,"line":1108},[1056,1730,1712],{"class":1062},[1056,1732,1142],{"class":1072},[1056,1734,1076],{"class":1062},[1056,1736,1079],{"class":1062},[1056,1738,1082],{"class":1062},[1056,1740,1151],{"class":1085},[1056,1742,1076],{"class":1062},[1056,1744,1091],{"class":1062},[1056,1746,1747,1749,1751,1753,1755,1757,1759,1761],{"class":1058,"line":1114},[1056,1748,1712],{"class":1062},[1056,1750,1163],{"class":1072},[1056,1752,1076],{"class":1062},[1056,1754,1079],{"class":1062},[1056,1756,1082],{"class":1062},[1056,1758,1172],{"class":1085},[1056,1760,1076],{"class":1062},[1056,1762,1091],{"class":1062},[1056,1764,1765,1767,1769,1771,1773,1775,1777],{"class":1058,"line":1137},[1056,1766,1712],{"class":1062},[1056,1768,1184],{"class":1072},[1056,1770,1076],{"class":1062},[1056,1772,1079],{"class":1062},[1056,1774,1082],{"class":1062},[1056,1776,1193],{"class":1085},[1056,1778,1196],{"class":1062},[1056,1780,1781],{"class":1058,"line":1158},[1056,1782,1783],{"class":1062},"  }\n",[1056,1785,1786],{"class":1058,"line":1179},[1056,1787,1788],{"class":1062},"]\n",[1790,1791,1792,1808],"table",{},[1793,1794,1795],"thead",{},[1796,1797,1798,1802,1805],"tr",{},[1799,1800,1801],"th",{},"Field",[1799,1803,1804],{},"Type",[1799,1806,1807],{},"Description",[1809,1810,1811,1824,1835,1855,1866,1878],"tbody",{},[1796,1812,1813,1818,1821],{},[1814,1815,1816],"td",{},[1006,1817,1121],{},[1814,1819,1820],{},"string",[1814,1822,1823],{},"Unique identifier for this nav item",[1796,1825,1826,1830,1832],{},[1814,1827,1828],{},[1006,1829,1142],{},[1814,1831,1820],{},[1814,1833,1834],{},"Display text in sidebar",[1796,1836,1837,1841,1843],{},[1814,1838,1839],{},[1006,1840,1163],{},[1814,1842,1820],{},[1814,1844,1845,1846,1030,1848,1030,1851,1854],{},"Icon name (Lucide icon, e.g., ",[1006,1847,1172],{},[1006,1849,1850],{},"user",[1006,1852,1853],{},"settings",")",[1796,1856,1857,1861,1863],{},[1814,1858,1859],{},[1006,1860,1184],{},[1814,1862,1820],{},[1814,1864,1865],{},"Route this nav item links to",[1796,1867,1868,1873,1875],{},[1814,1869,1870],{},[1006,1871,1872],{},"badge",[1814,1874,1820],{},[1814,1876,1877],{},"Optional badge text (e.g., \"3\", \"NEW\")",[1796,1879,1880,1885,1888],{},[1814,1881,1882],{},[1006,1883,1884],{},"order",[1814,1886,1887],{},"number",[1814,1889,1890],{},"Sort order (lower numbers appear first)",[990,1892,1893,1894,1896],{},"The optional ",[1006,1895,1872],{}," is worth knowing about: it puts a small count or label next to the item, which is how you'd surface something like an unread count without building any custom chrome.",[1047,1898,1900],{"className":1049,"code":1899,"language":1051,"meta":1052,"style":1052},"{\n  \"id\": \"notifications\",\n  \"label\": \"Messages\",\n  \"icon\": \"bell\",\n  \"path\": \"\u002Fmessages\",\n  \"badge\": \"5\"\n}\n",[1006,1901,1902,1906,1925,1944,1963,1982,1999],{"__ignoreMap":1052},[1056,1903,1904],{"class":1058,"line":1059},[1056,1905,1063],{"class":1062},[1056,1907,1908,1910,1912,1914,1916,1918,1921,1923],{"class":1058,"line":1066},[1056,1909,1069],{"class":1062},[1056,1911,1121],{"class":1072},[1056,1913,1076],{"class":1062},[1056,1915,1079],{"class":1062},[1056,1917,1082],{"class":1062},[1056,1919,1920],{"class":1085},"notifications",[1056,1922,1076],{"class":1062},[1056,1924,1091],{"class":1062},[1056,1926,1927,1929,1931,1933,1935,1937,1940,1942],{"class":1058,"line":1094},[1056,1928,1069],{"class":1062},[1056,1930,1142],{"class":1072},[1056,1932,1076],{"class":1062},[1056,1934,1079],{"class":1062},[1056,1936,1082],{"class":1062},[1056,1938,1939],{"class":1085},"Messages",[1056,1941,1076],{"class":1062},[1056,1943,1091],{"class":1062},[1056,1945,1946,1948,1950,1952,1954,1956,1959,1961],{"class":1058,"line":1108},[1056,1947,1069],{"class":1062},[1056,1949,1163],{"class":1072},[1056,1951,1076],{"class":1062},[1056,1953,1079],{"class":1062},[1056,1955,1082],{"class":1062},[1056,1957,1958],{"class":1085},"bell",[1056,1960,1076],{"class":1062},[1056,1962,1091],{"class":1062},[1056,1964,1965,1967,1969,1971,1973,1975,1978,1980],{"class":1058,"line":1114},[1056,1966,1069],{"class":1062},[1056,1968,1184],{"class":1072},[1056,1970,1076],{"class":1062},[1056,1972,1079],{"class":1062},[1056,1974,1082],{"class":1062},[1056,1976,1977],{"class":1085},"\u002Fmessages",[1056,1979,1076],{"class":1062},[1056,1981,1091],{"class":1062},[1056,1983,1984,1986,1988,1990,1992,1994,1997],{"class":1058,"line":1137},[1056,1985,1069],{"class":1062},[1056,1987,1872],{"class":1072},[1056,1989,1076],{"class":1062},[1056,1991,1079],{"class":1062},[1056,1993,1082],{"class":1062},[1056,1995,1996],{"class":1085},"5",[1056,1998,1196],{"class":1062},[1056,2000,2001],{"class":1058,"line":1158},[1056,2002,1664],{"class":1062},[1676,2004,2006],{"id":2005},"views-full-page-routes","Views (Full-Page Routes)",[990,2008,2009,2010,2013],{},"A view is a full page inside Cockpit, mapped to a route. This is where most of your app's actual UI lives — list pages, detail pages, anything that fills the main content area. Routes can carry parameters (",[1006,2011,2012],{},":id","), so a single view definition serves every order in the example below:",[1047,2015,2017],{"className":1049,"code":2016,"language":1051,"meta":1052,"style":1052},"\"views\": [\n  {\n    \"id\": \"orders-list\",\n    \"route\": \"\u002Forders\",\n    \"label\": \"Orders\",\n    \"title\": \"Order Management\",\n    \"component\": \"OrdersList\"\n  },\n  {\n    \"id\": \"orders-detail\",\n    \"route\": \"\u002Forders\u002F:id\",\n    \"label\": \"Order Detail\",\n    \"component\": \"OrderDetail\"\n  }\n]\n",[1006,2018,2019,2031,2035,2053,2071,2089,2107,2123,2128,2132,2150,2168,2186,2202,2206],{"__ignoreMap":1052},[1056,2020,2021,2023,2025,2027,2029],{"class":1058,"line":1059},[1056,2022,1076],{"class":1062},[1056,2024,1033],{"class":1085},[1056,2026,1076],{"class":1062},[1056,2028,1699],{"class":1698},[1056,2030,1702],{"class":1062},[1056,2032,2033],{"class":1058,"line":1066},[1056,2034,1707],{"class":1062},[1056,2036,2037,2039,2041,2043,2045,2047,2049,2051],{"class":1058,"line":1094},[1056,2038,1712],{"class":1062},[1056,2040,1121],{"class":1072},[1056,2042,1076],{"class":1062},[1056,2044,1079],{"class":1062},[1056,2046,1082],{"class":1062},[1056,2048,1242],{"class":1085},[1056,2050,1076],{"class":1062},[1056,2052,1091],{"class":1062},[1056,2054,2055,2057,2059,2061,2063,2065,2067,2069],{"class":1058,"line":1108},[1056,2056,1712],{"class":1062},[1056,2058,1254],{"class":1072},[1056,2060,1076],{"class":1062},[1056,2062,1079],{"class":1062},[1056,2064,1082],{"class":1062},[1056,2066,1193],{"class":1085},[1056,2068,1076],{"class":1062},[1056,2070,1091],{"class":1062},[1056,2072,2073,2075,2077,2079,2081,2083,2085,2087],{"class":1058,"line":1114},[1056,2074,1712],{"class":1062},[1056,2076,1142],{"class":1072},[1056,2078,1076],{"class":1062},[1056,2080,1079],{"class":1062},[1056,2082,1082],{"class":1062},[1056,2084,1151],{"class":1085},[1056,2086,1076],{"class":1062},[1056,2088,1091],{"class":1062},[1056,2090,2091,2093,2095,2097,2099,2101,2103,2105],{"class":1058,"line":1137},[1056,2092,1712],{"class":1062},[1056,2094,1293],{"class":1072},[1056,2096,1076],{"class":1062},[1056,2098,1079],{"class":1062},[1056,2100,1082],{"class":1062},[1056,2102,1302],{"class":1085},[1056,2104,1076],{"class":1062},[1056,2106,1091],{"class":1062},[1056,2108,2109,2111,2113,2115,2117,2119,2121],{"class":1058,"line":1158},[1056,2110,1712],{"class":1062},[1056,2112,1314],{"class":1072},[1056,2114,1076],{"class":1062},[1056,2116,1079],{"class":1062},[1056,2118,1082],{"class":1062},[1056,2120,1323],{"class":1085},[1056,2122,1196],{"class":1062},[1056,2124,2125],{"class":1058,"line":1179},[1056,2126,2127],{"class":1062},"  },\n",[1056,2129,2130],{"class":1058,"line":1199},[1056,2131,1707],{"class":1062},[1056,2133,2134,2136,2138,2140,2142,2144,2146,2148],{"class":1058,"line":1205},[1056,2135,1712],{"class":1062},[1056,2137,1121],{"class":1072},[1056,2139,1076],{"class":1062},[1056,2141,1079],{"class":1062},[1056,2143,1082],{"class":1062},[1056,2145,1352],{"class":1085},[1056,2147,1076],{"class":1062},[1056,2149,1091],{"class":1062},[1056,2151,2152,2154,2156,2158,2160,2162,2164,2166],{"class":1058,"line":1211},[1056,2153,1712],{"class":1062},[1056,2155,1254],{"class":1072},[1056,2157,1076],{"class":1062},[1056,2159,1079],{"class":1062},[1056,2161,1082],{"class":1062},[1056,2163,1372],{"class":1085},[1056,2165,1076],{"class":1062},[1056,2167,1091],{"class":1062},[1056,2169,2170,2172,2174,2176,2178,2180,2182,2184],{"class":1058,"line":1224},[1056,2171,1712],{"class":1062},[1056,2173,1142],{"class":1072},[1056,2175,1076],{"class":1062},[1056,2177,1079],{"class":1062},[1056,2179,1082],{"class":1062},[1056,2181,1392],{"class":1085},[1056,2183,1076],{"class":1062},[1056,2185,1091],{"class":1062},[1056,2187,2188,2190,2192,2194,2196,2198,2200],{"class":1058,"line":1229},[1056,2189,1712],{"class":1062},[1056,2191,1314],{"class":1072},[1056,2193,1076],{"class":1062},[1056,2195,1079],{"class":1062},[1056,2197,1082],{"class":1062},[1056,2199,1412],{"class":1085},[1056,2201,1196],{"class":1062},[1056,2203,2204],{"class":1058,"line":1249},[1056,2205,1783],{"class":1062},[1056,2207,2208],{"class":1058,"line":1269},[1056,2209,1788],{"class":1062},[1790,2211,2212,2222],{},[1793,2213,2214],{},[1796,2215,2216,2218,2220],{},[1799,2217,1801],{},[1799,2219,1804],{},[1799,2221,1807],{},[1809,2223,2224,2235,2248,2259,2270,2281],{},[1796,2225,2226,2230,2232],{},[1814,2227,2228],{},[1006,2229,1121],{},[1814,2231,1820],{},[1814,2233,2234],{},"Unique identifier",[1796,2236,2237,2241,2243],{},[1814,2238,2239],{},[1006,2240,1254],{},[1814,2242,1820],{},[1814,2244,2245,2246,1854],{},"URL route (supports params like ",[1006,2247,2012],{},[1796,2249,2250,2254,2256],{},[1814,2251,2252],{},[1006,2253,1142],{},[1814,2255,1820],{},[1814,2257,2258],{},"Breadcrumb label",[1796,2260,2261,2265,2267],{},[1814,2262,2263],{},[1006,2264,1293],{},[1814,2266,1820],{},[1814,2268,2269],{},"Page title (shown in browser tab and header)",[1796,2271,2272,2276,2278],{},[1814,2273,2274],{},[1006,2275,1314],{},[1814,2277,1820],{},[1814,2279,2280],{},"Vue component name (must exist in your app)",[1796,2282,2283,2288,2290],{},[1814,2284,2285],{},[1006,2286,2287],{},"parent",[1814,2289,1820],{},[1814,2291,2292],{},"Parent route (for breadcrumbs)",[990,2294,2295],{},[994,2296,2297],{},"Component Implementation:",[990,2299,2300,2301,2303],{},"Your app must export a Vue component matching the ",[1006,2302,1314],{}," name:",[1047,2305,2309],{"className":2306,"code":2307,"language":2308,"meta":1052,"style":1052},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F ordersApp.vue (or component library)\nexport { OrdersList, OrderDetail }\n\n\u002F\u002F OrdersList.vue\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003Ch1>Orders\u003C\u002Fh1>\n    \u003COrdersTable \u002F>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\n\u002F\u002F Component receives tenant context via props or API\nconst route = useRoute()\nconst tenantId = route.query.tenant_id\n\u003C\u002Fscript>\n","javascript",[1006,2310,2311,2317,2338,2344,2349,2361,2371,2391,2401,2410,2418,2422,2434,2439,2444,2449],{"__ignoreMap":1052},[1056,2312,2313],{"class":1058,"line":1059},[1056,2314,2316],{"class":2315},"sHwdD","\u002F\u002F ordersApp.vue (or component library)\n",[1056,2318,2319,2323,2326,2329,2332,2335],{"class":1058,"line":1066},[1056,2320,2322],{"class":2321},"s7zQu","export",[1056,2324,2325],{"class":1062}," {",[1056,2327,2328],{"class":1698}," OrdersList",[1056,2330,2331],{"class":1062},",",[1056,2333,2334],{"class":1698}," OrderDetail",[1056,2336,2337],{"class":1062}," }\n",[1056,2339,2340],{"class":1058,"line":1094},[1056,2341,2343],{"emptyLinePlaceholder":2342},true,"\n",[1056,2345,2346],{"class":1058,"line":1108},[1056,2347,2348],{"class":2315},"\u002F\u002F OrdersList.vue\n",[1056,2350,2351,2354,2358],{"class":1058,"line":1114},[1056,2352,2353],{"class":1062},"\u003C",[1056,2355,2357],{"class":2356},"swJcz","template",[1056,2359,2360],{"class":1062},">\n",[1056,2362,2363,2366,2369],{"class":1058,"line":1137},[1056,2364,2365],{"class":1062},"  \u003C",[1056,2367,2368],{"class":2356},"div",[1056,2370,2360],{"class":1062},[1056,2372,2373,2376,2379,2382,2384,2387,2389],{"class":1058,"line":1158},[1056,2374,2375],{"class":1062},"    \u003C",[1056,2377,2378],{"class":2356},"h1",[1056,2380,2381],{"class":1062},">",[1056,2383,1151],{"class":1698},[1056,2385,2386],{"class":1062},"\u003C\u002F",[1056,2388,2378],{"class":2356},[1056,2390,2360],{"class":1062},[1056,2392,2393,2395,2398],{"class":1058,"line":1179},[1056,2394,2375],{"class":1062},[1056,2396,2397],{"class":1120},"OrdersTable",[1056,2399,2400],{"class":1062}," \u002F>\n",[1056,2402,2403,2406,2408],{"class":1058,"line":1199},[1056,2404,2405],{"class":1062},"  \u003C\u002F",[1056,2407,2368],{"class":2356},[1056,2409,2360],{"class":1062},[1056,2411,2412,2414,2416],{"class":1058,"line":1205},[1056,2413,2386],{"class":1062},[1056,2415,2357],{"class":2356},[1056,2417,2360],{"class":1062},[1056,2419,2420],{"class":1058,"line":1211},[1056,2421,2343],{"emptyLinePlaceholder":2342},[1056,2423,2424,2426,2429,2432],{"class":1058,"line":1224},[1056,2425,2353],{"class":1062},[1056,2427,2428],{"class":2356},"script",[1056,2430,2431],{"class":1072}," setup",[1056,2433,2360],{"class":1062},[1056,2435,2436],{"class":1058,"line":1229},[1056,2437,2438],{"class":1698},"\u002F\u002F Component receives tenant context via props or API\n",[1056,2440,2441],{"class":1058,"line":1249},[1056,2442,2443],{"class":1698},"const route = useRoute()\n",[1056,2445,2446],{"class":1058,"line":1269},[1056,2447,2448],{"class":1698},"const tenantId = route.query.tenant_id\n",[1056,2450,2451,2453,2455],{"class":1058,"line":1288},[1056,2452,2386],{"class":1062},[1056,2454,2428],{"class":2356},[1056,2456,2360],{"class":1062},[1676,2458,2460],{"id":2459},"widgets-dashboard-cards","Widgets (Dashboard Cards)",[990,2462,2463,2464,2467,2468,2471],{},"A widget is a card a customer can place on their Cockpit dashboard — a compact, glanceable summary rather than a full page. Where a view is somewhere users navigate ",[1020,2465,2466],{},"to",", a widget brings a slice of your app to the home screen they already land on. The ",[1006,2469,2470],{},"size"," hints at how much room it takes in the dashboard grid:",[1047,2473,2475],{"className":1049,"code":2474,"language":1051,"meta":1052,"style":1052},"\"widgets\": [\n  {\n    \"id\": \"orders-summary\",\n    \"label\": \"Order Summary\",\n    \"description\": \"Today's order count and revenue\",\n    \"component\": \"OrderSummaryWidget\",\n    \"size\": \"medium\"\n  }\n]\n",[1006,2476,2477,2489,2493,2511,2529,2547,2565,2582,2586],{"__ignoreMap":1052},[1056,2478,2479,2481,2483,2485,2487],{"class":1058,"line":1059},[1056,2480,1076],{"class":1062},[1056,2482,1036],{"class":1085},[1056,2484,1076],{"class":1062},[1056,2486,1699],{"class":1698},[1056,2488,1702],{"class":1062},[1056,2490,2491],{"class":1058,"line":1066},[1056,2492,1707],{"class":1062},[1056,2494,2495,2497,2499,2501,2503,2505,2507,2509],{"class":1058,"line":1094},[1056,2496,1712],{"class":1062},[1056,2498,1121],{"class":1072},[1056,2500,1076],{"class":1062},[1056,2502,1079],{"class":1062},[1056,2504,1082],{"class":1062},[1056,2506,1458],{"class":1085},[1056,2508,1076],{"class":1062},[1056,2510,1091],{"class":1062},[1056,2512,2513,2515,2517,2519,2521,2523,2525,2527],{"class":1058,"line":1108},[1056,2514,1712],{"class":1062},[1056,2516,1142],{"class":1072},[1056,2518,1076],{"class":1062},[1056,2520,1079],{"class":1062},[1056,2522,1082],{"class":1062},[1056,2524,1478],{"class":1085},[1056,2526,1076],{"class":1062},[1056,2528,1091],{"class":1062},[1056,2530,2531,2533,2535,2537,2539,2541,2543,2545],{"class":1058,"line":1114},[1056,2532,1712],{"class":1062},[1056,2534,1490],{"class":1072},[1056,2536,1076],{"class":1062},[1056,2538,1079],{"class":1062},[1056,2540,1082],{"class":1062},[1056,2542,1499],{"class":1085},[1056,2544,1076],{"class":1062},[1056,2546,1091],{"class":1062},[1056,2548,2549,2551,2553,2555,2557,2559,2561,2563],{"class":1058,"line":1137},[1056,2550,1712],{"class":1062},[1056,2552,1314],{"class":1072},[1056,2554,1076],{"class":1062},[1056,2556,1079],{"class":1062},[1056,2558,1082],{"class":1062},[1056,2560,1519],{"class":1085},[1056,2562,1076],{"class":1062},[1056,2564,1091],{"class":1062},[1056,2566,2567,2569,2571,2573,2575,2577,2580],{"class":1058,"line":1158},[1056,2568,1712],{"class":1062},[1056,2570,2470],{"class":1072},[1056,2572,1076],{"class":1062},[1056,2574,1079],{"class":1062},[1056,2576,1082],{"class":1062},[1056,2578,2579],{"class":1085},"medium",[1056,2581,1196],{"class":1062},[1056,2583,2584],{"class":1058,"line":1179},[1056,2585,1783],{"class":1062},[1056,2587,2588],{"class":1058,"line":1199},[1056,2589,1788],{"class":1062},[1790,2591,2592,2602],{},[1793,2593,2594],{},[1796,2595,2596,2598,2600],{},[1799,2597,1801],{},[1799,2599,1804],{},[1799,2601,1807],{},[1809,2603,2604,2614,2625,2636,2647],{},[1796,2605,2606,2610,2612],{},[1814,2607,2608],{},[1006,2609,1121],{},[1814,2611,1820],{},[1814,2613,2234],{},[1796,2615,2616,2620,2622],{},[1814,2617,2618],{},[1006,2619,1142],{},[1814,2621,1820],{},[1814,2623,2624],{},"Display name",[1796,2626,2627,2631,2633],{},[1814,2628,2629],{},[1006,2630,1490],{},[1814,2632,1820],{},[1814,2634,2635],{},"Tooltip or help text",[1796,2637,2638,2642,2644],{},[1814,2639,2640],{},[1006,2641,1314],{},[1814,2643,1820],{},[1814,2645,2646],{},"Vue component name",[1796,2648,2649,2653,2655],{},[1814,2650,2651],{},[1006,2652,2470],{},[1814,2654,1820],{},[1814,2656,2657,1030,2660,1030,2662,2665],{},[1006,2658,2659],{},"small",[1006,2661,2579],{},[1006,2663,2664],{},"large"," (grid layout)",[990,2667,2668],{},"Customers can add widgets to their dashboard. Your widget receives tenant context and can query the generated data APIs or your app APIs.",[1676,2670,2672],{"id":2671},"action-buttons-injected-buttons","Action Buttons (Injected Buttons)",[990,2674,2675,2676,2678],{},"Action buttons are the most interesting of the four, because they let your app add a control to a page it doesn't own. You name a ",[1006,2677,1617],{}," — even one belonging to another app — and Cockpit injects your button there. This is how cross-app integration surfaces in the UI: a compliance app can drop a \"Mark hazmat-validated\" button onto the Orders detail page without the Orders app knowing it exists.",[1047,2680,2682],{"className":1049,"code":2681,"language":1051,"meta":1052,"style":1052},"\"action_buttons\": [\n  {\n    \"id\": \"sync-erp\",\n    \"label\": \"Sync to ERP\",\n    \"description\": \"Send this order to the ERP system\",\n    \"target_view\": \"\u002Forders\u002F:id\",\n    \"component\": \"SyncToERPButton\",\n    \"color\": \"primary\"\n  }\n]\n",[1006,2683,2684,2696,2700,2718,2736,2754,2772,2790,2808,2812],{"__ignoreMap":1052},[1056,2685,2686,2688,2690,2692,2694],{"class":1058,"line":1059},[1056,2687,1076],{"class":1062},[1056,2689,1039],{"class":1085},[1056,2691,1076],{"class":1062},[1056,2693,1699],{"class":1698},[1056,2695,1702],{"class":1062},[1056,2697,2698],{"class":1058,"line":1066},[1056,2699,1707],{"class":1062},[1056,2701,2702,2704,2706,2708,2710,2712,2714,2716],{"class":1058,"line":1094},[1056,2703,1712],{"class":1062},[1056,2705,1121],{"class":1072},[1056,2707,1076],{"class":1062},[1056,2709,1079],{"class":1062},[1056,2711,1082],{"class":1062},[1056,2713,1565],{"class":1085},[1056,2715,1076],{"class":1062},[1056,2717,1091],{"class":1062},[1056,2719,2720,2722,2724,2726,2728,2730,2732,2734],{"class":1058,"line":1108},[1056,2721,1712],{"class":1062},[1056,2723,1142],{"class":1072},[1056,2725,1076],{"class":1062},[1056,2727,1079],{"class":1062},[1056,2729,1082],{"class":1062},[1056,2731,1585],{"class":1085},[1056,2733,1076],{"class":1062},[1056,2735,1091],{"class":1062},[1056,2737,2738,2740,2742,2744,2746,2748,2750,2752],{"class":1058,"line":1114},[1056,2739,1712],{"class":1062},[1056,2741,1490],{"class":1072},[1056,2743,1076],{"class":1062},[1056,2745,1079],{"class":1062},[1056,2747,1082],{"class":1062},[1056,2749,1605],{"class":1085},[1056,2751,1076],{"class":1062},[1056,2753,1091],{"class":1062},[1056,2755,2756,2758,2760,2762,2764,2766,2768,2770],{"class":1058,"line":1137},[1056,2757,1712],{"class":1062},[1056,2759,1617],{"class":1072},[1056,2761,1076],{"class":1062},[1056,2763,1079],{"class":1062},[1056,2765,1082],{"class":1062},[1056,2767,1372],{"class":1085},[1056,2769,1076],{"class":1062},[1056,2771,1091],{"class":1062},[1056,2773,2774,2776,2778,2780,2782,2784,2786,2788],{"class":1058,"line":1158},[1056,2775,1712],{"class":1062},[1056,2777,1314],{"class":1072},[1056,2779,1076],{"class":1062},[1056,2781,1079],{"class":1062},[1056,2783,1082],{"class":1062},[1056,2785,1645],{"class":1085},[1056,2787,1076],{"class":1062},[1056,2789,1091],{"class":1062},[1056,2791,2792,2794,2797,2799,2801,2803,2806],{"class":1058,"line":1179},[1056,2793,1712],{"class":1062},[1056,2795,2796],{"class":1072},"color",[1056,2798,1076],{"class":1062},[1056,2800,1079],{"class":1062},[1056,2802,1082],{"class":1062},[1056,2804,2805],{"class":1085},"primary",[1056,2807,1196],{"class":1062},[1056,2809,2810],{"class":1058,"line":1199},[1056,2811,1783],{"class":1062},[1056,2813,2814],{"class":1058,"line":1205},[1056,2815,1788],{"class":1062},[1790,2817,2818,2828],{},[1793,2819,2820],{},[1796,2821,2822,2824,2826],{},[1799,2823,1801],{},[1799,2825,1804],{},[1799,2827,1807],{},[1809,2829,2830,2840,2851,2862,2875,2886,2908],{},[1796,2831,2832,2836,2838],{},[1814,2833,2834],{},[1006,2835,1121],{},[1814,2837,1820],{},[1814,2839,2234],{},[1796,2841,2842,2846,2848],{},[1814,2843,2844],{},[1006,2845,1142],{},[1814,2847,1820],{},[1814,2849,2850],{},"Button text",[1796,2852,2853,2857,2859],{},[1814,2854,2855],{},[1006,2856,1490],{},[1814,2858,1820],{},[1814,2860,2861],{},"Tooltip",[1796,2863,2864,2868,2870],{},[1814,2865,2866],{},[1006,2867,1617],{},[1814,2869,1820],{},[1814,2871,2872,2873,1854],{},"Route where this button appears (e.g., ",[1006,2874,1372],{},[1796,2876,2877,2881,2883],{},[1814,2878,2879],{},[1006,2880,1314],{},[1814,2882,1820],{},[1814,2884,2885],{},"Vue component (button component)",[1796,2887,2888,2892,2894],{},[1814,2889,2890],{},[1006,2891,2796],{},[1814,2893,1820],{},[1814,2895,2896,2897,1030,2899,1030,2902,1030,2905,1854],{},"Button color (",[1006,2898,2805],{},[1006,2900,2901],{},"secondary",[1006,2903,2904],{},"danger",[1006,2906,2907],{},"success",[1796,2909,2910,2914,2916],{},[1814,2911,2912],{},[1006,2913,1163],{},[1814,2915,1820],{},[1814,2917,2918],{},"Lucide icon name (optional)",[990,2920,2921],{},"When a Customer views an order detail page, Cockpit injects the \"Sync to ERP\" button. Your component handles the click:",[1047,2923,2925],{"className":2306,"code":2924,"language":2308,"meta":1052,"style":1052},"\u002F\u002F SyncToERPButton.vue\n\u003Ctemplate>\n  \u003Cbutton @click=\"syncToERP\" :disabled=\"syncing\">\n    {{ syncing ? 'Syncing...' : 'Sync to ERP' }}\n  \u003C\u002Fbutton>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nconst props = defineProps({\n  entityId: String,  \u002F\u002F e.g., order ID from route param\n  entityType: String \u002F\u002F e.g., 'orders'\n})\n\nconst syncing = ref(false)\nconst syncToERP = async () => {\n  syncing.value = true\n  await fetch('\u002Fapi\u002Fsync-erp', {\n    method: 'POST',\n    body: JSON.stringify({ order_id: props.entityId })\n  })\n  syncing.value = false\n}\n\u003C\u002Fscript>\n",[1006,2926,2927,2932,2940,2950,2979,2984,2989,2993,3003,3010,3020,3028,3036,3040,3045,3052,3070,3094,3110,3147,3154,3167,3171],{"__ignoreMap":1052},[1056,2928,2929],{"class":1058,"line":1059},[1056,2930,2931],{"class":2315},"\u002F\u002F SyncToERPButton.vue\n",[1056,2933,2934,2936,2938],{"class":1058,"line":1066},[1056,2935,2353],{"class":1062},[1056,2937,2357],{"class":2356},[1056,2939,2360],{"class":1062},[1056,2941,2942,2944,2947],{"class":1058,"line":1094},[1056,2943,2365],{"class":1062},[1056,2945,2946],{"class":2356},"button",[1056,2948,2949],{"class":1062}," @click=\"syncToERP\" :disabled=\"syncing\">\n",[1056,2951,2952,2955,2958,2961,2964,2966,2969,2972,2974,2976],{"class":1058,"line":1108},[1056,2953,2954],{"class":1062},"    {{",[1056,2956,2957],{"class":1698}," syncing ? ",[1056,2959,2960],{"class":1062},"'",[1056,2962,2963],{"class":2356},"Syncing...",[1056,2965,2960],{"class":1062},[1056,2967,2968],{"class":1062}," :",[1056,2970,2971],{"class":1062}," '",[1056,2973,1585],{"class":1085},[1056,2975,2960],{"class":1062},[1056,2977,2978],{"class":1062}," }}\n",[1056,2980,2981],{"class":1058,"line":1114},[1056,2982,2983],{"class":1062},"  \u003C\u002Fbutton>\n",[1056,2985,2986],{"class":1058,"line":1137},[1056,2987,2988],{"class":1062},"\u003C\u002Ftemplate>\n",[1056,2990,2991],{"class":1058,"line":1158},[1056,2992,2343],{"emptyLinePlaceholder":2342},[1056,2994,2995,2998,3001],{"class":1058,"line":1179},[1056,2996,2997],{"class":1062},"\u003Cscript ",[1056,2999,3000],{"class":1072},"setup",[1056,3002,2360],{"class":1062},[1056,3004,3005,3008],{"class":1058,"line":1199},[1056,3006,3007],{"class":1698},"const props = defineProps(",[1056,3009,1063],{"class":1062},[1056,3011,3012,3015,3017],{"class":1058,"line":1205},[1056,3013,3014],{"class":1698},"  entityId: String",[1056,3016,2331],{"class":1062},[1056,3018,3019],{"class":2315},"  \u002F\u002F e.g., order ID from route param\n",[1056,3021,3022,3025],{"class":1058,"line":1211},[1056,3023,3024],{"class":1698},"  entityType: String ",[1056,3026,3027],{"class":2315},"\u002F\u002F e.g., 'orders'\n",[1056,3029,3030,3033],{"class":1058,"line":1224},[1056,3031,3032],{"class":1062},"}",[1056,3034,3035],{"class":1698},")\n",[1056,3037,3038],{"class":1058,"line":1229},[1056,3039,2343],{"emptyLinePlaceholder":2342},[1056,3041,3042],{"class":1058,"line":1249},[1056,3043,3044],{"class":1698},"const syncing = ref(false)\n",[1056,3046,3047,3050],{"class":1058,"line":1269},[1056,3048,3049],{"class":1698},"const syncToERP = async () => ",[1056,3051,1063],{"class":1062},[1056,3053,3054,3057,3060,3063,3066],{"class":1058,"line":1288},[1056,3055,3056],{"class":1698},"  syncing",[1056,3058,3059],{"class":1062},".",[1056,3061,3062],{"class":1698},"value ",[1056,3064,3065],{"class":1062},"=",[1056,3067,3069],{"class":3068},"sfNiH"," true\n",[1056,3071,3072,3075,3079,3082,3084,3087,3089,3091],{"class":1058,"line":1309},[1056,3073,3074],{"class":2321},"  await",[1056,3076,3078],{"class":3077},"s2Zo4"," fetch",[1056,3080,3081],{"class":1698},"(",[1056,3083,2960],{"class":1062},[1056,3085,3086],{"class":1085},"\u002Fapi\u002Fsync-erp",[1056,3088,2960],{"class":1062},[1056,3090,2331],{"class":1062},[1056,3092,3093],{"class":1062}," {\n",[1056,3095,3096,3099,3101,3103,3106,3108],{"class":1058,"line":1328},[1056,3097,3098],{"class":2356},"    method",[1056,3100,1079],{"class":1062},[1056,3102,2971],{"class":1062},[1056,3104,3105],{"class":1085},"POST",[1056,3107,2960],{"class":1062},[1056,3109,1091],{"class":1062},[1056,3111,3112,3115,3117,3120,3122,3125,3127,3130,3133,3135,3138,3140,3143,3145],{"class":1058,"line":1334},[1056,3113,3114],{"class":2356},"    body",[1056,3116,1079],{"class":1062},[1056,3118,3119],{"class":1698}," JSON",[1056,3121,3059],{"class":1062},[1056,3123,3124],{"class":3077},"stringify",[1056,3126,3081],{"class":1698},[1056,3128,3129],{"class":1062},"{",[1056,3131,3132],{"class":2356}," order_id",[1056,3134,1079],{"class":1062},[1056,3136,3137],{"class":1698}," props",[1056,3139,3059],{"class":1062},[1056,3141,3142],{"class":1698},"entityId ",[1056,3144,3032],{"class":1062},[1056,3146,3035],{"class":1698},[1056,3148,3149,3152],{"class":1058,"line":1339},[1056,3150,3151],{"class":1062},"  }",[1056,3153,3035],{"class":1698},[1056,3155,3156,3158,3160,3162,3164],{"class":1058,"line":1359},[1056,3157,3056],{"class":1698},[1056,3159,3059],{"class":1062},[1056,3161,3062],{"class":1698},[1056,3163,3065],{"class":1062},[1056,3165,3166],{"class":3068}," false\n",[1056,3168,3169],{"class":1058,"line":1379},[1056,3170,1664],{"class":1062},[1056,3172,3173,3175,3177],{"class":1058,"line":1399},[1056,3174,2386],{"class":1062},[1056,3176,2428],{"class":2356},[1056,3178,2360],{"class":1062},[1042,3180,3182],{"id":3181},"icon-names-lucide","Icon Names (Lucide)",[990,3184,3185],{},"Common icons:",[3187,3188,3189,3198,3209,3217,3225,3237,3246,3255],"ul",{},[3190,3191,3192,1030,3194,3197],"li",{},[1006,3193,1172],{},[1006,3195,3196],{},"shopping-bag"," — Commerce",[3190,3199,3200,1030,3202,1030,3205,3208],{},[1006,3201,1850],{},[1006,3203,3204],{},"users",[1006,3206,3207],{},"user-circle"," — People",[3190,3210,3211,1030,3213,3216],{},[1006,3212,1853],{},[1006,3214,3215],{},"sliders"," — Configuration",[3190,3218,3219,1030,3221,3224],{},[1006,3220,1958],{},[1006,3222,3223],{},"mail"," — Notifications",[3190,3226,3227,1030,3230,1030,3233,3236],{},[1006,3228,3229],{},"bar-chart",[1006,3231,3232],{},"line-chart",[1006,3234,3235],{},"pie-chart"," — Analytics",[3190,3238,3239,1030,3242,3245],{},[1006,3240,3241],{},"link",[1006,3243,3244],{},"external-link"," — Integration",[3190,3247,3248,1030,3251,3254],{},[1006,3249,3250],{},"calendar",[1006,3252,3253],{},"clock"," — Time",[3190,3256,3257,1030,3260,1030,3263,3266],{},[1006,3258,3259],{},"check",[1006,3261,3262],{},"x",[1006,3264,3265],{},"alert"," — Status",[990,3268,3269,3270,3277],{},"See ",[3271,3272,3276],"a",{"href":3273,"rel":3274},"https:\u002F\u002Flucide.dev\u002F",[3275],"nofollow","Lucide Icons"," for the full list.",[1042,3279,3281],{"id":3280},"how-cockpit-renders","How Cockpit Renders",[990,3283,3284,3285,3287,3288,3290,3291,3293,3294,3296,3297,3299,3300,3302],{},"It's worth understanding the assembly step, because it explains why your contributions appear next to other apps' contributions. When Cockpit loads, it asks Console for the list of apps the tenant has installed, reads each one's ",[1006,3286,1008],{},", and merges all of their declarations into a single picture of the UI. From that merged picture it builds the sidebar from every app's ",[1006,3289,1029],{}," items, turns every ",[1006,3292,1033],{}," entry into a live route, makes every ",[1006,3295,1036],{}," entry available on the dashboard, and injects each ",[1006,3298,1039],{}," entry into whichever view it targets. Your app's pieces and a dozen other apps' pieces are composed into one coherent interface at runtime — which is exactly why you declare ",[1020,3301,1022],{}," things go rather than building the shell yourself.",[1042,3304,3306],{"id":3305},"scope-and-isolation","Scope and Isolation",[990,3308,3309,3310,3313],{},"That composition model also sets the boundaries you work within. Cockpit owns routing, so your app never renders its own ",[1006,3311,3312],{},"\u003Crouter-view>"," — it just declares routes and hands over components. Those components receive what they need as props or via the route, the current tenant and any entity ID included, so there's no global state to reach into and each view or widget stays self-contained. Styling comes from the Studio Design System (shadcn-vue), which Cockpit applies for you, so your components inherit the platform's look without you shipping a stylesheet. The net effect is that your UI feels native because it's genuinely running inside the same shell as everything else.",[1042,3315,3317],{"id":3316},"component-hints","Component Hints",[990,3319,3320],{},"When writing Vue components for Cockpit:",[1047,3322,3324],{"className":2306,"code":3323,"language":2308,"meta":1052,"style":1052},"\u002F\u002F OrdersList.vue — Receives no special props\n\u003Cscript setup>\nimport { useRoute } from 'vue-router'\nconst route = useRoute()\nconst tenantId = route.query.tenant_id \u002F\u002F Available from JWT\u002FCockpit context\n\u003C\u002Fscript>\n\n\u002F\u002F OrderSummaryWidget.vue — Lightweight dashboard widget\n\u003Cscript setup>\nimport { ref, onMounted } from 'vue'\nconst stats = ref(null)\nonMounted(async () => {\n  const res = await fetch('\u002Fapi\u002Forders\u002Fstats')\n  stats.value = await res.json()\n})\n\u003C\u002Fscript>\n\n\u002F\u002F SyncToERPButton.vue — Receives entity context via props\n\u003Cscript setup>\ndefineProps({\n  entityId: String,\n  entityType: String\n})\n\u003C\u002Fscript>\n",[1006,3325,3326,3331,3341,3356,3360,3365,3373,3377,3382,3392,3411,3416,3423,3446,3469,3475,3483,3487,3492,3502,3509,3515,3520,3526],{"__ignoreMap":1052},[1056,3327,3328],{"class":1058,"line":1059},[1056,3329,3330],{"class":2315},"\u002F\u002F OrdersList.vue — Receives no special props\n",[1056,3332,3333,3335,3337,3339],{"class":1058,"line":1066},[1056,3334,2353],{"class":1062},[1056,3336,2428],{"class":2356},[1056,3338,2431],{"class":1072},[1056,3340,2360],{"class":1062},[1056,3342,3343,3346,3348,3351,3353],{"class":1058,"line":1094},[1056,3344,3345],{"class":1698},"import ",[1056,3347,3129],{"class":1062},[1056,3349,3350],{"class":1698}," useRoute ",[1056,3352,3032],{"class":1062},[1056,3354,3355],{"class":1698}," from 'vue-router'\n",[1056,3357,3358],{"class":1058,"line":1108},[1056,3359,2443],{"class":1698},[1056,3361,3362],{"class":1058,"line":1114},[1056,3363,3364],{"class":1698},"const tenantId = route.query.tenant_id \u002F\u002F Available from JWT\u002FCockpit context\n",[1056,3366,3367,3369,3371],{"class":1058,"line":1137},[1056,3368,2386],{"class":1062},[1056,3370,2428],{"class":2356},[1056,3372,2360],{"class":1062},[1056,3374,3375],{"class":1058,"line":1158},[1056,3376,2343],{"emptyLinePlaceholder":2342},[1056,3378,3379],{"class":1058,"line":1179},[1056,3380,3381],{"class":2315},"\u002F\u002F OrderSummaryWidget.vue — Lightweight dashboard widget\n",[1056,3383,3384,3386,3388,3390],{"class":1058,"line":1199},[1056,3385,2353],{"class":1062},[1056,3387,2428],{"class":2356},[1056,3389,2431],{"class":1072},[1056,3391,2360],{"class":1062},[1056,3393,3394,3396,3398,3401,3403,3406,3408],{"class":1058,"line":1205},[1056,3395,3345],{"class":1698},[1056,3397,3129],{"class":1062},[1056,3399,3400],{"class":1698}," ref",[1056,3402,2331],{"class":1062},[1056,3404,3405],{"class":1698}," onMounted ",[1056,3407,3032],{"class":1062},[1056,3409,3410],{"class":1698}," from 'vue'\n",[1056,3412,3413],{"class":1058,"line":1211},[1056,3414,3415],{"class":1698},"const stats = ref(null)\n",[1056,3417,3418,3421],{"class":1058,"line":1224},[1056,3419,3420],{"class":1698},"onMounted(async () => ",[1056,3422,1063],{"class":1062},[1056,3424,3425,3428,3430,3433,3435,3437,3439,3442,3444],{"class":1058,"line":1229},[1056,3426,3427],{"class":1698},"  const res ",[1056,3429,3065],{"class":1062},[1056,3431,3432],{"class":2321}," await",[1056,3434,3078],{"class":3077},[1056,3436,3081],{"class":1698},[1056,3438,2960],{"class":1062},[1056,3440,3441],{"class":1085},"\u002Fapi\u002Forders\u002Fstats",[1056,3443,2960],{"class":1062},[1056,3445,3035],{"class":1698},[1056,3447,3448,3451,3453,3455,3457,3459,3462,3464,3466],{"class":1058,"line":1249},[1056,3449,3450],{"class":1698},"  stats",[1056,3452,3059],{"class":1062},[1056,3454,3062],{"class":1698},[1056,3456,3065],{"class":1062},[1056,3458,3432],{"class":2321},[1056,3460,3461],{"class":1698}," res",[1056,3463,3059],{"class":1062},[1056,3465,1051],{"class":3077},[1056,3467,3468],{"class":1698},"()\n",[1056,3470,3471,3473],{"class":1058,"line":1269},[1056,3472,3032],{"class":1062},[1056,3474,3035],{"class":1698},[1056,3476,3477,3479,3481],{"class":1058,"line":1288},[1056,3478,2386],{"class":1062},[1056,3480,2428],{"class":2356},[1056,3482,2360],{"class":1062},[1056,3484,3485],{"class":1058,"line":1309},[1056,3486,2343],{"emptyLinePlaceholder":2342},[1056,3488,3489],{"class":1058,"line":1328},[1056,3490,3491],{"class":2315},"\u002F\u002F SyncToERPButton.vue — Receives entity context via props\n",[1056,3493,3494,3496,3498,3500],{"class":1058,"line":1334},[1056,3495,2353],{"class":1062},[1056,3497,2428],{"class":2356},[1056,3499,2431],{"class":1072},[1056,3501,2360],{"class":1062},[1056,3503,3504,3507],{"class":1058,"line":1339},[1056,3505,3506],{"class":1698},"defineProps(",[1056,3508,1063],{"class":1062},[1056,3510,3511,3513],{"class":1058,"line":1359},[1056,3512,3014],{"class":1698},[1056,3514,1091],{"class":1062},[1056,3516,3517],{"class":1058,"line":1379},[1056,3518,3519],{"class":1698},"  entityType: String\n",[1056,3521,3522,3524],{"class":1058,"line":1399},[1056,3523,3032],{"class":1062},[1056,3525,3035],{"class":1698},[1056,3527,3528,3530,3532],{"class":1058,"line":1417},[1056,3529,2386],{"class":1062},[1056,3531,2428],{"class":2356},[1056,3533,2360],{"class":1062},[1042,3535,3537],{"id":3536},"best-practices","Best Practices",[990,3539,3540],{},"Because your UI shares the shell with every other installed app, the guiding principle is to be a good citizen of a space you don't own.",[990,3542,3543,3546,3547,3550],{},[994,3544,3545],{},"Keep the sidebar uncluttered."," Navigation items should be concise (two or three words) and few — add a top-level entry for the way ",[1020,3548,3549],{},"into"," your app, not for every page within it, and group related views under a single nav item. A tidy sidebar is a shared resource; every extra entry you add is one the customer has to scan past to reach someone else's.",[990,3552,3553,3556,3557,3559],{},[994,3554,3555],{},"Look and behave like the platform."," Stick to standard Lucide icons rather than custom artwork so your app reads as part of Cockpit, give action buttons help text via ",[1006,3558,1490],{}," so their purpose is clear, and always handle loading and error states — a half-rendered widget undermines the whole dashboard, not just your card.",[990,3561,3562,3565],{},[994,3563,3564],{},"Keep widgets light and context honest."," A dashboard widget is glanced at, not worked in, so keep it responsive and push any heavy computation to an API call rather than the render path. And never hard-code tenant context; take it from the route or props every time, so the same component serves every tenant correctly.",[1042,3567,3569],{"id":3568},"next-steps","Next Steps",[3187,3571,3572,3581,3590],{},[3190,3573,3574,3580],{},[994,3575,3576],{},[3271,3577,3579],{"href":3578},"\u002Fdocs\u002Fproducts\u002Fapps\u002Fconcept\u002F","Concept"," — Understand the declarative app model",[3190,3582,3583,3589],{},[994,3584,3585],{},[3271,3586,3588],{"href":3587},"\u002Fdocs\u002Fproducts\u002Fapps\u002Flifecycle\u002F","Lifecycle"," — App versioning and upgrades",[3190,3591,3592,3597],{},[994,3593,3594],{},[3271,3595,117],{"href":3596},"\u002Fdocs\u002Fproducts\u002Fapps\u002Fbilling-events\u002F"," — Marketplace billing and event publishing",[3599,3600,3601],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":1052,"searchDepth":1066,"depth":1066,"links":3603},[3604,3605,3611,3612,3613,3614,3615,3616],{"id":1044,"depth":1066,"text":1045},{"id":1667,"depth":1066,"text":1668,"children":3606},[3607,3608,3609,3610],{"id":1678,"depth":1094,"text":1679},{"id":2005,"depth":1094,"text":2006},{"id":2459,"depth":1094,"text":2460},{"id":2671,"depth":1094,"text":2672},{"id":3181,"depth":1066,"text":3182},{"id":3280,"depth":1066,"text":3281},{"id":3305,"depth":1066,"text":3306},{"id":3316,"depth":1066,"text":3317},{"id":3536,"depth":1066,"text":3537},{"id":3568,"depth":1066,"text":3569},"Define UI extension points with cockpit.json","md",null,{"status":3621},"published",{"title":123,"description":3617},{"loc":124},"MJXU98t1P4cbxH1G58HCQ-ixKEzsj9kAewMgUGouJcc",1785229260404]