[{"data":1,"prerenderedAt":1694},["ShallowReactive",2],{"navigation":3,"\u002Fapi\u002Fcomponents\u002Fcreating-components":358,"\u002Fapi\u002Fcomponents\u002Fcreating-components-surround":1689},[4,14,36,69,140,341],{"title":5,"path":6,"stem":7,"children":8},"Introduction","\u002Fgetting-started","1.getting-started\u002F1.index",[9,10],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":15,"path":16,"stem":17,"children":18,"page":35},"Guides","\u002Fguides","2.guides",[19,23,27,31],{"title":20,"path":21,"stem":22},"Your First Layout","\u002Fguides\u002Fyour-first-layout","2.guides\u002F1.your-first-layout",{"title":24,"path":25,"stem":26},"Your First Page Template","\u002Fguides\u002Fyour-first-page-template","2.guides\u002F2.your-first-page-template",{"title":28,"path":29,"stem":30},"Your First Component","\u002Fguides\u002Fyour-first-component","2.guides\u002F3.your-first-component",{"title":32,"path":33,"stem":34},"Alternative UI Variants","\u002Fguides\u002Falternative-ui-variants","2.guides\u002F4.alternative-ui-variants",false,{"title":37,"path":38,"stem":39,"children":40,"page":35},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[41,45,49,53,57,61,65],{"title":42,"path":43,"stem":44},"How It All Works","\u002Fcore-concepts\u002Farchitecture","3.core-concepts\u002F1.architecture",{"title":46,"path":47,"stem":48},"The Data Model","\u002Fcore-concepts\u002Fthe-data-model","3.core-concepts\u002F2.the-data-model",{"title":50,"path":51,"stem":52},"Layouts & Pages","\u002Fcore-concepts\u002Flayouts-and-pages","3.core-concepts\u002F3.layouts-and-pages",{"title":54,"path":55,"stem":56},"Dynamic Pages","\u002Fcore-concepts\u002Fdynamic-pages","3.core-concepts\u002F4.dynamic-pages",{"title":58,"path":59,"stem":60},"Components","\u002Fcore-concepts\u002Fcomponents","3.core-concepts\u002F5.components",{"title":62,"path":63,"stem":64},"Draft & Publish Workflow","\u002Fcore-concepts\u002Fdraft-and-publish","3.core-concepts\u002F6.draft-and-publish",{"title":66,"path":67,"stem":68},"The Admin Panel","\u002Fcore-concepts\u002Fadmin-panel","3.core-concepts\u002F7.admin-panel",{"title":70,"path":71,"stem":72,"children":73,"page":35},"Api","\u002Fapi","4.api",[74,78,116,120,124,128,132,136],{"title":75,"path":76,"stem":77},"Bundle Setup","\u002Fapi\u002Fbundle-setup","4.api\u002F1.bundle-setup",{"title":58,"path":79,"stem":80,"children":81,"page":35},"\u002Fapi\u002Fcomponents","4.api\u002F2.components",[82,86,103],{"title":83,"path":84,"stem":85},"Creating Components","\u002Fapi\u002Fcomponents\u002Fcreating-components","4.api\u002F2.components\u002F1.creating-components",{"title":87,"path":88,"stem":89,"children":90,"page":35},"Annotations","\u002Fapi\u002Fcomponents\u002Fannotations","4.api\u002F2.components\u002F2.annotations",[91,95,99],{"title":92,"path":93,"stem":94},"Publishable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fpublishable","4.api\u002F2.components\u002F2.annotations\u002F1.publishable",{"title":96,"path":97,"stem":98},"Uploadable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fuploadable","4.api\u002F2.components\u002F2.annotations\u002F2.uploadable",{"title":100,"path":101,"stem":102},"Timestamped","\u002Fapi\u002Fcomponents\u002Fannotations\u002Ftimestamped","4.api\u002F2.components\u002F2.annotations\u002F3.timestamped",{"title":104,"path":105,"stem":106,"children":107,"page":35},"Built Ins","\u002Fapi\u002Fcomponents\u002Fbuilt-ins","4.api\u002F2.components\u002F3.built-ins",[108,112],{"title":109,"path":110,"stem":111},"Collection Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fcollection-component","4.api\u002F2.components\u002F3.built-ins\u002F1.collection-component",{"title":113,"path":114,"stem":115},"Form Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fform-component","4.api\u002F2.components\u002F3.built-ins\u002F2.form-component",{"title":117,"path":118,"stem":119},"Dynamic & Nested Pages","\u002Fapi\u002Fdynamic-pages","4.api\u002F3.dynamic-pages",{"title":121,"path":122,"stem":123},"Users & Security","\u002Fapi\u002Fusers-and-security","4.api\u002F4.users-and-security",{"title":125,"path":126,"stem":127},"Data Fixtures","\u002Fapi\u002Fdata-fixtures","4.api\u002F5.data-fixtures",{"title":129,"path":130,"stem":131},"Configuration Reference","\u002Fapi\u002Fconfiguration","4.api\u002F6.configuration",{"title":133,"path":134,"stem":135},"Console Commands","\u002Fapi\u002Fconsole-commands","4.api\u002F7.console-commands",{"title":137,"path":138,"stem":139},"Debugging & Profiler","\u002Fapi\u002Fdebugging","4.api\u002F8.debugging",{"title":141,"path":142,"stem":143,"children":144,"page":35},"Nuxt Module","\u002Fnuxt-module","5.nuxt-module",[145,149,162,182,207,211,295,320,324],{"title":146,"path":147,"stem":148},"Module Setup","\u002Fnuxt-module\u002Fmodule-setup","5.nuxt-module\u002F1.module-setup",{"title":150,"path":151,"stem":152,"children":153,"page":35},"Configuration","\u002Fnuxt-module\u002Fconfiguration","5.nuxt-module\u002F2.configuration",[154,158],{"title":155,"path":156,"stem":157},"Nuxt Config","\u002Fnuxt-module\u002Fconfiguration\u002Fnuxt-config","5.nuxt-module\u002F2.configuration\u002F1.nuxt-config",{"title":159,"path":160,"stem":161},"Site Config & SEO","\u002Fnuxt-module\u002Fconfiguration\u002Fsite-config-and-seo","5.nuxt-module\u002F2.configuration\u002F2.site-config-and-seo",{"title":163,"path":164,"stem":165,"children":166,"page":35},"Building Your Ui","\u002Fnuxt-module\u002Fbuilding-your-ui","5.nuxt-module\u002F3.building-your-ui",[167,171,175,178],{"title":168,"path":169,"stem":170},"Layouts","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-layouts","5.nuxt-module\u002F3.building-your-ui\u002F1.creating-layouts",{"title":172,"path":173,"stem":174},"Page Templates","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-page-templates","5.nuxt-module\u002F3.building-your-ui\u002F2.creating-page-templates",{"title":83,"path":176,"stem":177},"\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-components","5.nuxt-module\u002F3.building-your-ui\u002F3.creating-components",{"title":179,"path":180,"stem":181},"CLI Generator","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcwa-cli","5.nuxt-module\u002F3.building-your-ui\u002F4.cwa-cli",{"title":183,"path":184,"stem":185,"children":186,"page":35},"Cwa Components","\u002Fnuxt-module\u002Fcwa-components","5.nuxt-module\u002F4.cwa-components",[187,191,195,199,203],{"title":188,"path":189,"stem":190},"\u003CCwaComponentGroup \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-component-group","5.nuxt-module\u002F4.cwa-components\u002F1.cwa-component-group",{"title":192,"path":193,"stem":194},"\u003CCwaPage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-page","5.nuxt-module\u002F4.cwa-components\u002F2.cwa-page",{"title":196,"path":197,"stem":198},"\u003CCwaLink \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-link","5.nuxt-module\u002F4.cwa-components\u002F3.cwa-link",{"title":200,"path":201,"stem":202},"\u003CCwaImage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-image","5.nuxt-module\u002F4.cwa-components\u002F4.cwa-image",{"title":204,"path":205,"stem":206},"\u003CCwaDefaultLayout \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-default-layout","5.nuxt-module\u002F4.cwa-components\u002F5.cwa-default-layout",{"title":208,"path":209,"stem":210},"The useCwa() API","\u002Fnuxt-module\u002Fcwa-api","5.nuxt-module\u002F5.cwa-api",{"title":212,"path":213,"stem":214,"children":215,"page":35},"Composables","\u002Fnuxt-module\u002Fcomposables","5.nuxt-module\u002F6.composables",[216,224,261,278],{"title":217,"path":218,"stem":219,"children":220,"page":35},"Layout","\u002Fnuxt-module\u002Fcomposables\u002Flayout","5.nuxt-module\u002F6.composables\u002F0.layout",[221],{"title":217,"path":222,"stem":223},"\u002Fnuxt-module\u002Fcomposables\u002Flayout\u002Fuse-cwa-layout","5.nuxt-module\u002F6.composables\u002F0.layout\u002F1.use-cwa-layout",{"title":225,"path":226,"stem":227,"children":228,"page":35},"Component","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent","5.nuxt-module\u002F6.composables\u002F1.component",[229,233,237,241,245,249,253,257],{"title":230,"path":231,"stem":232},"Component (recommended)","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-component","5.nuxt-module\u002F6.composables\u002F1.component\u002F0.use-cwa-component",{"title":234,"path":235,"stem":236},"Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F1.use-cwa-resource",{"title":238,"path":239,"stem":240},"Collection Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-collection-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F2.use-cwa-collection-resource",{"title":242,"path":243,"stem":244},"Image Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-image-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F3.use-cwa-image-resource",{"title":246,"path":247,"stem":248},"Form","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form","5.nuxt-module\u002F6.composables\u002F1.component\u002F4.use-cwa-form",{"title":250,"path":251,"stem":252},"Form Input","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-input","5.nuxt-module\u002F6.composables\u002F1.component\u002F5.use-cwa-form-input",{"title":254,"path":255,"stem":256},"Form Repeated","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-repeated","5.nuxt-module\u002F6.composables\u002F1.component\u002F6.use-cwa-form-repeated",{"title":258,"path":259,"stem":260},"Form Collection","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-collection","5.nuxt-module\u002F6.composables\u002F1.component\u002F7.use-cwa-form-collection",{"title":262,"path":263,"stem":264,"children":265,"page":35},"Admin Manager","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager","5.nuxt-module\u002F6.composables\u002F2.admin-manager",[266,270,274],{"title":267,"path":268,"stem":269},"Manager Tab","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-manager-tab","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F1.use-cwa-resource-manager-tab",{"title":271,"path":272,"stem":273},"Resource Model","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-model","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F2.use-cwa-resource-model",{"title":275,"path":276,"stem":277},"Resource Upload","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-upload","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F3.use-cwa-resource-upload",{"title":279,"path":280,"stem":281,"children":282,"page":35},"Utilities","\u002Fnuxt-module\u002Fcomposables\u002Futilities","5.nuxt-module\u002F6.composables\u002F3.utilities",[283,287,291],{"title":284,"path":285,"stem":286},"Resource Endpoint","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-endpoint","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F1.use-cwa-resource-endpoint",{"title":288,"path":289,"stem":290},"Query Model","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-query-bound-model","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F2.use-query-bound-model",{"title":292,"path":293,"stem":294},"Resource Route","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-route","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F3.use-cwa-resource-route",{"title":296,"path":297,"stem":298,"children":299,"page":35},"Component Helpers","\u002Fnuxt-module\u002Fcomponent-helpers","5.nuxt-module\u002F7.component-helpers",[300,304,308,312,316],{"title":301,"path":302,"stem":303},"Images & Media","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fimages-and-uploads","5.nuxt-module\u002F7.component-helpers\u002F1.images-and-uploads",{"title":305,"path":306,"stem":307},"Collections & Pagination","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fcollections-and-pagination","5.nuxt-module\u002F7.component-helpers\u002F2.collections-and-pagination",{"title":309,"path":310,"stem":311},"HTML Content","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fhtml-content","5.nuxt-module\u002F7.component-helpers\u002F3.html-content",{"title":313,"path":314,"stem":315},"Real-Time Updates","\u002Fnuxt-module\u002Fcomponent-helpers\u002Freal-time-updates","5.nuxt-module\u002F7.component-helpers\u002F4.real-time-updates",{"title":317,"path":318,"stem":319},"Forms","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fforms","5.nuxt-module\u002F7.component-helpers\u002F5.forms",{"title":321,"path":322,"stem":323},"Authentication","\u002Fnuxt-module\u002Fauthentication","5.nuxt-module\u002F8.authentication",{"title":325,"path":326,"stem":327,"children":328,"page":35},"Cwa Layer","\u002Fnuxt-module\u002Fcwa-layer","5.nuxt-module\u002F9.cwa-layer",[329,333,337],{"title":330,"path":331,"stem":332},"Overview","\u002Fnuxt-module\u002Fcwa-layer\u002Foverview","5.nuxt-module\u002F9.cwa-layer\u002F1.overview",{"title":334,"path":335,"stem":336},"Auth Pages","\u002Fnuxt-module\u002Fcwa-layer\u002Fauth-pages","5.nuxt-module\u002F9.cwa-layer\u002F2.auth-pages",{"title":338,"path":339,"stem":340},"Admin Panel","\u002Fnuxt-module\u002Fcwa-layer\u002Fadmin-panel","5.nuxt-module\u002F9.cwa-layer\u002F3.admin-panel",{"title":342,"path":343,"stem":344,"children":345,"page":35},"Deployment","\u002Fdeployment","6.deployment",[346,350,354],{"title":347,"path":348,"stem":349},"Docker","\u002Fdeployment\u002Fdocker","6.deployment\u002F1.docker",{"title":351,"path":352,"stem":353},"Kubernetes & Helm","\u002Fdeployment\u002Fkubernetes","6.deployment\u002F2.kubernetes",{"title":355,"path":356,"stem":357},"CI\u002FCD","\u002Fdeployment\u002Fci-cd","6.deployment\u002F3.ci-cd",{"id":359,"title":83,"badge":360,"body":363,"description":1683,"extension":1684,"links":1685,"meta":1686,"navigation":548,"path":84,"seo":1687,"stem":85,"__hash__":1688},"docs\u002F4.api\u002F2.components\u002F1.creating-components.md",{"label":361,"color":362},"Draft","amber",{"type":364,"value":365,"toc":1673},"minimark",[366,375,380,383,488,495,499,835,845,849,871,881,885,891,898,905,909,912,979,989,993,1000,1368,1372,1379,1603,1608,1612,1619,1662,1669],[367,368,369,370,374],"p",{},"A CWA component is a PHP entity that extends ",[371,372,373],"code",{},"AbstractComponent",". It defines the data model for one type of content block — a title, an image, an article body. The front-end Nuxt module resolves these by class name and renders the matching Vue component.",[376,377,379],"h2",{"id":378},"what-abstractcomponent-gives-you","What AbstractComponent Gives You",[367,381,382],{},"You get these for free. Don't redefine them:",[384,385,386,402],"table",{},[387,388,389],"thead",{},[390,391,392,396,399],"tr",{},[393,394,395],"th",{},"Property",[393,397,398],{},"Type",[393,400,401],{},"Purpose",[403,404,405,421,444,459,474],"tbody",{},[390,406,407,413,418],{},[408,409,410],"td",{},[371,411,412],{},"id",[408,414,415],{},[371,416,417],{},"UuidInterface",[408,419,420],{},"Auto-generated UUID identifier",[390,422,423,428,433],{},[408,424,425],{},[371,426,427],{},"uiComponent",[408,429,430],{},[371,431,432],{},"string",[408,434,435,436,439,440,443],{},"The Vue component name to render (",[371,437,438],{},"Title",", ",[371,441,442],{},"Image",", etc.)",[390,445,446,451,456],{},[408,447,448],{},[371,449,450],{},"uiClassNames",[408,452,453],{},[371,454,455],{},"string|null",[408,457,458],{},"CSS class name(s) chosen by the admin in the CMS",[390,460,461,466,471],{},[408,462,463],{},[371,464,465],{},"componentGroups",[408,467,468],{},[371,469,470],{},"Collection",[408,472,473],{},"Which component groups contain this instance",[390,475,476,481,485],{},[408,477,478],{},[371,479,480],{},"componentPositions",[408,482,483],{},[371,484,470],{},[408,486,487],{},"Ordered positions within those groups",[367,489,490,491,494],{},"The ",[371,492,493],{},"_metadata"," envelope in every API response carries rendering hints, media objects (for uploadable components), and publish state.",[376,496,498],{"id":497},"step-1-create-the-entity","Step 1: Create the Entity",[500,501,506],"pre",{"className":502,"code":503,"language":504,"meta":505,"style":505},"language-php shiki shiki-themes github-light github-dark material-theme-palenight","\u002F\u002F src\u002FEntity\u002FComponent\u002FTitle.php\nnamespace App\\Entity\\Component;\n\nuse ApiPlatform\\Metadata\\ApiResource;\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Silverback\\ApiComponentsBundle\\Entity\\Core\\AbstractComponent;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n#[ORM\\Entity]\n#[ApiResource(mercure: true)]\nclass Title extends AbstractComponent\n{\n    #[ORM\\Column(type: 'text', nullable: true)]\n    #[Assert\\NotBlank(groups: ['Title:published'])]\n    public ?string $title = null;\n}\n","php","",[371,507,508,517,543,550,573,599,627,656,661,677,701,717,723,768,803,829],{"__ignoreMap":505},[509,510,513],"span",{"class":511,"line":512},"line",1,[509,514,516],{"class":515},"sTBSN","\u002F\u002F src\u002FEntity\u002FComponent\u002FTitle.php\n",[509,518,520,524,528,532,535,537,539],{"class":511,"line":519},2,[509,521,523],{"class":522},"stmX-","namespace",[509,525,527],{"class":526},"sRCss"," App",[509,529,531],{"class":530},"sn4go","\\",[509,533,534],{"class":526},"Entity",[509,536,531],{"class":530},[509,538,225],{"class":526},[509,540,542],{"class":541},"sOvfz",";\n",[509,544,546],{"class":511,"line":545},3,[509,547,549],{"emptyLinePlaceholder":548},true,"\n",[509,551,553,556,560,563,566,568,571],{"class":511,"line":552},4,[509,554,555],{"class":522},"use",[509,557,559],{"class":558},"sc2zw"," ApiPlatform",[509,561,531],{"class":562},"sBtbT",[509,564,565],{"class":558},"Metadata",[509,567,531],{"class":562},[509,569,570],{"class":558},"ApiResource",[509,572,542],{"class":541},[509,574,576,578,581,583,586,588,591,594,597],{"class":511,"line":575},5,[509,577,555],{"class":522},[509,579,580],{"class":558}," Doctrine",[509,582,531],{"class":562},[509,584,585],{"class":558},"ORM",[509,587,531],{"class":562},[509,589,590],{"class":558},"Mapping",[509,592,593],{"class":522}," as",[509,595,596],{"class":526}," ORM",[509,598,542],{"class":541},[509,600,602,604,607,609,612,614,616,618,621,623,625],{"class":511,"line":601},6,[509,603,555],{"class":522},[509,605,606],{"class":558}," Silverback",[509,608,531],{"class":562},[509,610,611],{"class":558},"ApiComponentsBundle",[509,613,531],{"class":562},[509,615,534],{"class":558},[509,617,531],{"class":562},[509,619,620],{"class":558},"Core",[509,622,531],{"class":562},[509,624,373],{"class":558},[509,626,542],{"class":541},[509,628,630,632,635,637,639,641,644,646,649,651,654],{"class":511,"line":629},7,[509,631,555],{"class":522},[509,633,634],{"class":558}," Symfony",[509,636,531],{"class":562},[509,638,225],{"class":558},[509,640,531],{"class":562},[509,642,643],{"class":558},"Validator",[509,645,531],{"class":562},[509,647,648],{"class":558},"Constraints",[509,650,593],{"class":522},[509,652,653],{"class":526}," Assert",[509,655,542],{"class":541},[509,657,659],{"class":511,"line":658},8,[509,660,549],{"emptyLinePlaceholder":548},[509,662,664,668,670,672,674],{"class":511,"line":663},9,[509,665,667],{"class":666},"sPB8G","#[",[509,669,585],{"class":558},[509,671,531],{"class":562},[509,673,534],{"class":558},[509,675,676],{"class":666},"]\n",[509,678,680,682,684,687,690,693,696,699],{"class":511,"line":679},10,[509,681,667],{"class":666},[509,683,570],{"class":558},[509,685,686],{"class":541},"(",[509,688,689],{"class":526},"mercure",[509,691,692],{"class":541},":",[509,694,695],{"class":562}," true",[509,697,698],{"class":541},")",[509,700,676],{"class":666},[509,702,704,708,711,714],{"class":511,"line":703},11,[509,705,707],{"class":706},"swB56","class",[509,709,710],{"class":526}," Title",[509,712,713],{"class":706}," extends",[509,715,716],{"class":526}," AbstractComponent\n",[509,718,720],{"class":511,"line":719},12,[509,721,722],{"class":541},"{\n",[509,724,726,729,731,733,736,738,741,743,747,751,754,757,760,762,764,766],{"class":511,"line":725},13,[509,727,728],{"class":666},"    #[",[509,730,585],{"class":558},[509,732,531],{"class":562},[509,734,735],{"class":558},"Column",[509,737,686],{"class":541},[509,739,740],{"class":526},"type",[509,742,692],{"class":541},[509,744,746],{"class":745},"seSrl"," '",[509,748,750],{"class":749},"sLL54","text",[509,752,753],{"class":745},"'",[509,755,756],{"class":541},",",[509,758,759],{"class":526}," nullable",[509,761,692],{"class":541},[509,763,695],{"class":562},[509,765,698],{"class":541},[509,767,676],{"class":666},[509,769,771,773,776,778,781,783,786,788,791,793,796,798,801],{"class":511,"line":770},14,[509,772,728],{"class":666},[509,774,775],{"class":558},"Assert",[509,777,531],{"class":562},[509,779,780],{"class":558},"NotBlank",[509,782,686],{"class":541},[509,784,785],{"class":526},"groups",[509,787,692],{"class":541},[509,789,790],{"class":541}," [",[509,792,753],{"class":745},[509,794,795],{"class":749},"Title:published",[509,797,753],{"class":745},[509,799,800],{"class":541},"])",[509,802,676],{"class":666},[509,804,806,809,813,815,818,821,824,827],{"class":511,"line":805},15,[509,807,808],{"class":706},"    public",[509,810,812],{"class":811},"sVlFx"," ?",[509,814,432],{"class":522},[509,816,817],{"class":541}," $",[509,819,820],{"class":666},"title ",[509,822,823],{"class":811},"=",[509,825,826],{"class":562}," null",[509,828,542],{"class":541},[509,830,832],{"class":511,"line":831},16,[509,833,834],{"class":541},"}\n",[367,836,837,840,841,844],{},[371,838,839],{},"mercure: true"," on ",[371,842,843],{},"#[ApiResource]"," means every change is broadcast over the Mercure hub in real time — open browser sessions update without a page refresh.",[376,846,848],{"id":847},"step-2-run-migrations","Step 2: Run Migrations",[500,850,854],{"className":851,"code":852,"language":853,"meta":505,"style":505},"language-bash shiki shiki-themes github-light github-dark material-theme-palenight","bin\u002Fconsole doctrine:migrations:diff\nbin\u002Fconsole doctrine:migrations:migrate\n","bash",[371,855,856,864],{"__ignoreMap":505},[509,857,858,861],{"class":511,"line":512},[509,859,860],{"class":526},"bin\u002Fconsole",[509,862,863],{"class":749}," doctrine:migrations:diff\n",[509,865,866,868],{"class":511,"line":519},[509,867,860],{"class":526},[509,869,870],{"class":749}," doctrine:migrations:migrate\n",[367,872,873,874,877,878,880],{},"The diff produces a migration that creates a joined table for your component (CWA uses ",[371,875,876],{},"JOINED"," inheritance on ",[371,879,373],{},"). Always review before running.",[376,882,884],{"id":883},"url-prefix-convention","URL Prefix Convention",[367,886,887,888,692],{},"The bundle automatically prefixes all component endpoints with ",[371,889,890],{},"\u002Fcomponent\u002F",[500,892,896],{"className":893,"code":895,"language":750},[894],"language-text","GET    \u002Fcomponent\u002Ftitles          # collection\nPOST   \u002Fcomponent\u002Ftitles          # create\nGET    \u002Fcomponent\u002Ftitles\u002F{id}     # single item\nPATCH  \u002Fcomponent\u002Ftitles\u002F{id}     # update\nDELETE \u002Fcomponent\u002Ftitles\u002F{id}     # delete\n",[371,897,895],{"__ignoreMap":505},[367,899,900,901,904],{},"This prefix is applied by the bundle's metadata factory — no manual ",[371,902,903],{},"routePrefix"," needed unless you want to change it.",[376,906,908],{"id":907},"the-class-name-vue-component-convention","The Class Name → Vue Component Convention",[367,910,911],{},"The PHP class name determines which Vue component renders it:",[384,913,914,930],{},[387,915,916],{},[390,917,918,921,927],{},[393,919,920],{},"PHP class",[393,922,923,924],{},"API ",[371,925,926],{},"@type",[393,928,929],{},"Vue component file",[403,931,932,947,963],{},[390,933,934,938,942],{},[408,935,936],{},[371,937,438],{},[408,939,940],{},[371,941,438],{},[408,943,944],{},[371,945,946],{},"app\u002Fcwa\u002Fcomponents\u002FTitle\u002FTitle.vue",[390,948,949,954,958],{},[408,950,951],{},[371,952,953],{},"HeroImage",[408,955,956],{},[371,957,953],{},[408,959,960],{},[371,961,962],{},"app\u002Fcwa\u002Fcomponents\u002FHeroImage\u002FHeroImage.vue",[390,964,965,970,974],{},[408,966,967],{},[371,968,969],{},"BlogCard",[408,971,972],{},[371,973,969],{},[408,975,976],{},[371,977,978],{},"app\u002Fcwa\u002Fcomponents\u002FBlogCard\u002FBlogCard.vue",[367,980,981,982,985,986,988],{},"The Nuxt module resolves ",[371,983,984],{},"CwaComponentTitle"," from the ",[371,987,926],{}," in the API response. If a matching Vue component doesn't exist, the CMS shows a placeholder in edit mode.",[376,990,992],{"id":991},"a-complete-example","A Complete Example",[367,994,995,996,999],{},"Here is a component with publish workflow, timestamps, and validation — equivalent to ",[371,997,998],{},"Title.php"," in the playground:",[500,1001,1003],{"className":502,"code":1002,"language":504,"meta":505,"style":505},"namespace App\\Entity\\Component;\n\nuse ApiPlatform\\Metadata\\ApiResource;\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Silverback\\ApiComponentsBundle\\Annotation as Silverback;\nuse Silverback\\ApiComponentsBundle\\Entity\\Core\\AbstractComponent;\nuse Silverback\\ApiComponentsBundle\\Entity\\Utility\\PublishableTrait;\nuse Silverback\\ApiComponentsBundle\\Entity\\Utility\\TimestampedTrait;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n#[Silverback\\Publishable]\n#[Silverback\\Timestamped]\n#[ORM\\Entity]\n#[ApiResource(mercure: true)]\nclass Title extends AbstractComponent\n{\n    use PublishableTrait;\n    use TimestampedTrait;\n\n    #[ORM\\Column(type: 'text', nullable: true)]\n    #[Assert\\NotBlank(groups: ['Title:published'])]\n    public ?string $title = null;\n}\n",[371,1004,1005,1021,1025,1041,1061,1082,1106,1132,1157,1181,1185,1198,1210,1222,1240,1250,1254,1265,1275,1280,1315,1344,1363],{"__ignoreMap":505},[509,1006,1007,1009,1011,1013,1015,1017,1019],{"class":511,"line":512},[509,1008,523],{"class":522},[509,1010,527],{"class":526},[509,1012,531],{"class":530},[509,1014,534],{"class":526},[509,1016,531],{"class":530},[509,1018,225],{"class":526},[509,1020,542],{"class":541},[509,1022,1023],{"class":511,"line":519},[509,1024,549],{"emptyLinePlaceholder":548},[509,1026,1027,1029,1031,1033,1035,1037,1039],{"class":511,"line":545},[509,1028,555],{"class":522},[509,1030,559],{"class":558},[509,1032,531],{"class":562},[509,1034,565],{"class":558},[509,1036,531],{"class":562},[509,1038,570],{"class":558},[509,1040,542],{"class":541},[509,1042,1043,1045,1047,1049,1051,1053,1055,1057,1059],{"class":511,"line":552},[509,1044,555],{"class":522},[509,1046,580],{"class":558},[509,1048,531],{"class":562},[509,1050,585],{"class":558},[509,1052,531],{"class":562},[509,1054,590],{"class":558},[509,1056,593],{"class":522},[509,1058,596],{"class":526},[509,1060,542],{"class":541},[509,1062,1063,1065,1067,1069,1071,1073,1076,1078,1080],{"class":511,"line":575},[509,1064,555],{"class":522},[509,1066,606],{"class":558},[509,1068,531],{"class":562},[509,1070,611],{"class":558},[509,1072,531],{"class":562},[509,1074,1075],{"class":558},"Annotation",[509,1077,593],{"class":522},[509,1079,606],{"class":526},[509,1081,542],{"class":541},[509,1083,1084,1086,1088,1090,1092,1094,1096,1098,1100,1102,1104],{"class":511,"line":601},[509,1085,555],{"class":522},[509,1087,606],{"class":558},[509,1089,531],{"class":562},[509,1091,611],{"class":558},[509,1093,531],{"class":562},[509,1095,534],{"class":558},[509,1097,531],{"class":562},[509,1099,620],{"class":558},[509,1101,531],{"class":562},[509,1103,373],{"class":558},[509,1105,542],{"class":541},[509,1107,1108,1110,1112,1114,1116,1118,1120,1122,1125,1127,1130],{"class":511,"line":629},[509,1109,555],{"class":522},[509,1111,606],{"class":558},[509,1113,531],{"class":562},[509,1115,611],{"class":558},[509,1117,531],{"class":562},[509,1119,534],{"class":558},[509,1121,531],{"class":562},[509,1123,1124],{"class":558},"Utility",[509,1126,531],{"class":562},[509,1128,1129],{"class":558},"PublishableTrait",[509,1131,542],{"class":541},[509,1133,1134,1136,1138,1140,1142,1144,1146,1148,1150,1152,1155],{"class":511,"line":658},[509,1135,555],{"class":522},[509,1137,606],{"class":558},[509,1139,531],{"class":562},[509,1141,611],{"class":558},[509,1143,531],{"class":562},[509,1145,534],{"class":558},[509,1147,531],{"class":562},[509,1149,1124],{"class":558},[509,1151,531],{"class":562},[509,1153,1154],{"class":558},"TimestampedTrait",[509,1156,542],{"class":541},[509,1158,1159,1161,1163,1165,1167,1169,1171,1173,1175,1177,1179],{"class":511,"line":663},[509,1160,555],{"class":522},[509,1162,634],{"class":558},[509,1164,531],{"class":562},[509,1166,225],{"class":558},[509,1168,531],{"class":562},[509,1170,643],{"class":558},[509,1172,531],{"class":562},[509,1174,648],{"class":558},[509,1176,593],{"class":522},[509,1178,653],{"class":526},[509,1180,542],{"class":541},[509,1182,1183],{"class":511,"line":679},[509,1184,549],{"emptyLinePlaceholder":548},[509,1186,1187,1189,1192,1194,1196],{"class":511,"line":703},[509,1188,667],{"class":666},[509,1190,1191],{"class":558},"Silverback",[509,1193,531],{"class":562},[509,1195,92],{"class":558},[509,1197,676],{"class":666},[509,1199,1200,1202,1204,1206,1208],{"class":511,"line":719},[509,1201,667],{"class":666},[509,1203,1191],{"class":558},[509,1205,531],{"class":562},[509,1207,100],{"class":558},[509,1209,676],{"class":666},[509,1211,1212,1214,1216,1218,1220],{"class":511,"line":725},[509,1213,667],{"class":666},[509,1215,585],{"class":558},[509,1217,531],{"class":562},[509,1219,534],{"class":558},[509,1221,676],{"class":666},[509,1223,1224,1226,1228,1230,1232,1234,1236,1238],{"class":511,"line":770},[509,1225,667],{"class":666},[509,1227,570],{"class":558},[509,1229,686],{"class":541},[509,1231,689],{"class":526},[509,1233,692],{"class":541},[509,1235,695],{"class":562},[509,1237,698],{"class":541},[509,1239,676],{"class":666},[509,1241,1242,1244,1246,1248],{"class":511,"line":805},[509,1243,707],{"class":706},[509,1245,710],{"class":526},[509,1247,713],{"class":706},[509,1249,716],{"class":526},[509,1251,1252],{"class":511,"line":831},[509,1253,722],{"class":541},[509,1255,1257,1260,1263],{"class":511,"line":1256},17,[509,1258,1259],{"class":522},"    use",[509,1261,1262],{"class":558}," PublishableTrait",[509,1264,542],{"class":541},[509,1266,1268,1270,1273],{"class":511,"line":1267},18,[509,1269,1259],{"class":522},[509,1271,1272],{"class":558}," TimestampedTrait",[509,1274,542],{"class":541},[509,1276,1278],{"class":511,"line":1277},19,[509,1279,549],{"emptyLinePlaceholder":548},[509,1281,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313],{"class":511,"line":1282},20,[509,1284,728],{"class":666},[509,1286,585],{"class":558},[509,1288,531],{"class":562},[509,1290,735],{"class":558},[509,1292,686],{"class":541},[509,1294,740],{"class":526},[509,1296,692],{"class":541},[509,1298,746],{"class":745},[509,1300,750],{"class":749},[509,1302,753],{"class":745},[509,1304,756],{"class":541},[509,1306,759],{"class":526},[509,1308,692],{"class":541},[509,1310,695],{"class":562},[509,1312,698],{"class":541},[509,1314,676],{"class":666},[509,1316,1318,1320,1322,1324,1326,1328,1330,1332,1334,1336,1338,1340,1342],{"class":511,"line":1317},21,[509,1319,728],{"class":666},[509,1321,775],{"class":558},[509,1323,531],{"class":562},[509,1325,780],{"class":558},[509,1327,686],{"class":541},[509,1329,785],{"class":526},[509,1331,692],{"class":541},[509,1333,790],{"class":541},[509,1335,753],{"class":745},[509,1337,795],{"class":749},[509,1339,753],{"class":745},[509,1341,800],{"class":541},[509,1343,676],{"class":666},[509,1345,1347,1349,1351,1353,1355,1357,1359,1361],{"class":511,"line":1346},22,[509,1348,808],{"class":706},[509,1350,812],{"class":811},[509,1352,432],{"class":522},[509,1354,817],{"class":541},[509,1356,820],{"class":666},[509,1358,823],{"class":811},[509,1360,826],{"class":562},[509,1362,542],{"class":541},[509,1364,1366],{"class":511,"line":1365},23,[509,1367,834],{"class":541},[376,1369,1371],{"id":1370},"what-the-api-returns","What the API Returns",[367,1373,1374,1375,1378],{},"A GET to ",[371,1376,1377],{},"\u002Fcomponent\u002Ftitles\u002F{id}"," returns something like:",[500,1380,1384],{"className":1381,"code":1382,"language":1383,"meta":505,"style":505},"language-json shiki shiki-themes github-light github-dark material-theme-palenight","{\n    \"@context\": \"\u002Fcontexts\u002FTitle\",\n    \"@id\": \"\u002Fcomponent\u002Ftitles\u002F018e-...\",\n    \"@type\": \"Title\",\n    \"title\": \"Welcome to CWA\",\n    \"uiComponent\": \"Title\",\n    \"uiClassNames\": \"centered\",\n    \"publishedAt\": \"2024-01-15T10:30:00+00:00\",\n    \"_metadata\": {\n        \"publishable\": {\n            \"published\": true,\n            \"draftResource\": null\n        }\n    }\n}\n","json",[371,1385,1386,1390,1415,1435,1453,1473,1491,1510,1530,1543,1558,1575,1589,1594,1599],{"__ignoreMap":505},[509,1387,1388],{"class":511,"line":512},[509,1389,722],{"class":541},[509,1391,1392,1395,1399,1402,1404,1407,1410,1412],{"class":511,"line":519},[509,1393,1394],{"class":562},"    \"",[509,1396,1398],{"class":1397},"sphPO","@context",[509,1400,1401],{"class":562},"\"",[509,1403,692],{"class":541},[509,1405,1406],{"class":745}," \"",[509,1408,1409],{"class":749},"\u002Fcontexts\u002FTitle",[509,1411,1401],{"class":745},[509,1413,1414],{"class":541},",\n",[509,1416,1417,1419,1422,1424,1426,1428,1431,1433],{"class":511,"line":545},[509,1418,1394],{"class":562},[509,1420,1421],{"class":1397},"@id",[509,1423,1401],{"class":562},[509,1425,692],{"class":541},[509,1427,1406],{"class":745},[509,1429,1430],{"class":749},"\u002Fcomponent\u002Ftitles\u002F018e-...",[509,1432,1401],{"class":745},[509,1434,1414],{"class":541},[509,1436,1437,1439,1441,1443,1445,1447,1449,1451],{"class":511,"line":552},[509,1438,1394],{"class":562},[509,1440,926],{"class":1397},[509,1442,1401],{"class":562},[509,1444,692],{"class":541},[509,1446,1406],{"class":745},[509,1448,438],{"class":749},[509,1450,1401],{"class":745},[509,1452,1414],{"class":541},[509,1454,1455,1457,1460,1462,1464,1466,1469,1471],{"class":511,"line":575},[509,1456,1394],{"class":562},[509,1458,1459],{"class":1397},"title",[509,1461,1401],{"class":562},[509,1463,692],{"class":541},[509,1465,1406],{"class":745},[509,1467,1468],{"class":749},"Welcome to CWA",[509,1470,1401],{"class":745},[509,1472,1414],{"class":541},[509,1474,1475,1477,1479,1481,1483,1485,1487,1489],{"class":511,"line":601},[509,1476,1394],{"class":562},[509,1478,427],{"class":1397},[509,1480,1401],{"class":562},[509,1482,692],{"class":541},[509,1484,1406],{"class":745},[509,1486,438],{"class":749},[509,1488,1401],{"class":745},[509,1490,1414],{"class":541},[509,1492,1493,1495,1497,1499,1501,1503,1506,1508],{"class":511,"line":629},[509,1494,1394],{"class":562},[509,1496,450],{"class":1397},[509,1498,1401],{"class":562},[509,1500,692],{"class":541},[509,1502,1406],{"class":745},[509,1504,1505],{"class":749},"centered",[509,1507,1401],{"class":745},[509,1509,1414],{"class":541},[509,1511,1512,1514,1517,1519,1521,1523,1526,1528],{"class":511,"line":658},[509,1513,1394],{"class":562},[509,1515,1516],{"class":1397},"publishedAt",[509,1518,1401],{"class":562},[509,1520,692],{"class":541},[509,1522,1406],{"class":745},[509,1524,1525],{"class":749},"2024-01-15T10:30:00+00:00",[509,1527,1401],{"class":745},[509,1529,1414],{"class":541},[509,1531,1532,1534,1536,1538,1540],{"class":511,"line":663},[509,1533,1394],{"class":562},[509,1535,493],{"class":1397},[509,1537,1401],{"class":562},[509,1539,692],{"class":541},[509,1541,1542],{"class":541}," {\n",[509,1544,1545,1548,1552,1554,1556],{"class":511,"line":679},[509,1546,1547],{"class":562},"        \"",[509,1549,1551],{"class":1550},"sbW4m","publishable",[509,1553,1401],{"class":562},[509,1555,692],{"class":541},[509,1557,1542],{"class":541},[509,1559,1560,1563,1567,1569,1571,1573],{"class":511,"line":703},[509,1561,1562],{"class":562},"            \"",[509,1564,1566],{"class":1565},"scSvc","published",[509,1568,1401],{"class":562},[509,1570,692],{"class":541},[509,1572,695],{"class":562},[509,1574,1414],{"class":541},[509,1576,1577,1579,1582,1584,1586],{"class":511,"line":719},[509,1578,1562],{"class":562},[509,1580,1581],{"class":1565},"draftResource",[509,1583,1401],{"class":562},[509,1585,692],{"class":541},[509,1587,1588],{"class":562}," null\n",[509,1590,1591],{"class":511,"line":725},[509,1592,1593],{"class":541},"        }\n",[509,1595,1596],{"class":511,"line":770},[509,1597,1598],{"class":541},"    }\n",[509,1600,1601],{"class":511,"line":805},[509,1602,834],{"class":541},[367,1604,490,1605,1607],{},[371,1606,493],{}," key is your component's runtime state envelope. It is never stored directly — the bundle computes it during serialization.",[376,1609,1611],{"id":1610},"restricting-positions","Restricting Positions",[367,1613,1614,1615,1618],{},"By default, a component can be placed anywhere. Override ",[371,1616,1617],{},"isPositionRestricted()"," to lock it to specific groups:",[500,1620,1622],{"className":502,"code":1621,"language":504,"meta":505,"style":505},"public function isPositionRestricted(): bool\n{\n    return true;\n}\n",[371,1623,1624,1644,1648,1658],{"__ignoreMap":505},[509,1625,1626,1629,1632,1636,1639,1641],{"class":511,"line":512},[509,1627,1628],{"class":706},"public",[509,1630,1631],{"class":706}," function",[509,1633,1635],{"class":1634},"sKpYG"," isPositionRestricted",[509,1637,1638],{"class":541},"()",[509,1640,692],{"class":811},[509,1642,1643],{"class":522}," bool\n",[509,1645,1646],{"class":511,"line":519},[509,1647,722],{"class":541},[509,1649,1650,1654,1656],{"class":511,"line":545},[509,1651,1653],{"class":1652},"sm4w6","    return",[509,1655,695],{"class":562},[509,1657,542],{"class":541},[509,1659,1660],{"class":511,"line":552},[509,1661,834],{"class":541},[367,1663,1664,1665,1668],{},"When ",[371,1666,1667],{},"true",", the admin UI prevents dragging this component out of its designated group.",[1670,1671,1672],"style",{},"html pre.shiki code .sTBSN, html code.shiki .sTBSN{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .stmX-, html code.shiki .stmX-{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F78C6C}html pre.shiki code .sRCss, html code.shiki .sRCss{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#FFCB6B}html pre.shiki code .sn4go, html code.shiki .sn4go{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#89DDFF}html pre.shiki code .sOvfz, html code.shiki .sOvfz{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#89DDFF}html pre.shiki code .sc2zw, html code.shiki .sc2zw{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#BABED8}html pre.shiki code .sBtbT, html code.shiki .sBtbT{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#89DDFF}html pre.shiki code .sPB8G, html code.shiki .sPB8G{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#BABED8}html pre.shiki code .swB56, html code.shiki .swB56{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#C792EA}html pre.shiki code .seSrl, html code.shiki .seSrl{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#89DDFF}html pre.shiki code .sLL54, html code.shiki .sLL54{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#C3E88D}html pre.shiki code .sVlFx, html code.shiki .sVlFx{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#89DDFF}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 .sphPO, html code.shiki .sphPO{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#C792EA}html pre.shiki code .sbW4m, html code.shiki .sbW4m{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#FFCB6B}html pre.shiki code .scSvc, html code.shiki .scSvc{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#F78C6C}html pre.shiki code .sKpYG, html code.shiki .sKpYG{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#82AAFF}html pre.shiki code .sm4w6, html code.shiki .sm4w6{--shiki-light:#D73A49;--shiki-light-font-style:inherit;--shiki-default:#F97583;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":505,"searchDepth":519,"depth":519,"links":1674},[1675,1676,1677,1678,1679,1680,1681,1682],{"id":378,"depth":519,"text":379},{"id":497,"depth":519,"text":498},{"id":847,"depth":519,"text":848},{"id":883,"depth":519,"text":884},{"id":907,"depth":519,"text":908},{"id":991,"depth":519,"text":992},{"id":1370,"depth":519,"text":1371},{"id":1610,"depth":519,"text":1611},"How to define a custom content resource by extending AbstractComponent, adding API Platform metadata, and running migrations.","md",null,{},{"title":83,"description":1683},"PAzsiAffIC2QWt7SKKU5B8c33HmL80jo6kS2i4aGR8A",[1690,1692],{"title":75,"path":76,"stem":77,"description":1691,"children":-1},"Installing and configuring the Silverback API Components Bundle in a Symfony application.",{"title":92,"path":93,"stem":94,"description":1693,"children":-1},"Add a draft\u002Fpublish workflow to any component so admins can edit content privately before making it live.",1782512899755]