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