[{"data":1,"prerenderedAt":2192},["ShallowReactive",2],{"navigation":3,"\u002Fapi\u002Fcomponents\u002Fannotations\u002Fuploadable":342,"\u002Fapi\u002Fcomponents\u002Fannotations\u002Fuploadable-surround":2187},[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":96,"badge":344,"body":347,"description":2181,"extension":2182,"links":2183,"meta":2184,"navigation":407,"path":97,"seo":2185,"stem":98,"__hash__":2186},"docs\u002F4.api\u002F2.components\u002F2.annotations\u002F2.uploadable.md",{"label":345,"color":346},"Draft","amber",{"type":348,"value":349,"toc":2166},"minimark",[350,362,367,370,446,449,542,553,557,944,948,1050,1057,1121,1256,1260,1266,1318,1323,1331,1338,1345,1591,1597,1601,1604,1607,1621,1769,1772,1889,1896,1900,1906,2064,2073,2077,2083,2127,2130,2134,2162],[351,352,353,357,358,361],"p",{},[354,355,356],"code",{},"#[Silverback\\Uploadable]"," with ",[354,359,360],{},"#[Silverback\\UploadableField]"," turns a component into a file host. Files are stored via Flysystem, served via a public URL, and optionally processed through LiipImagineBundle to generate multiple image variants (thumbnail, hero, square, etc.).",[363,364,366],"h2",{"id":365},"flysystem-setup","Flysystem Setup",[351,368,369],{},"First, install a Flysystem adapter:",[371,372,377],"pre",{"className":373,"code":374,"language":375,"meta":376,"style":376},"language-bash shiki shiki-themes github-light github-dark material-theme-palenight","# Local filesystem\ncomposer require league\u002Fflysystem-local\n\n# Google Cloud Storage\ncomposer require league\u002Fflysystem-google-cloud-storage\n\n# S3-compatible\ncomposer require league\u002Fflysystem-aws-s3-v3\n","bash","",[354,378,379,388,402,409,415,425,430,436],{"__ignoreMap":376},[380,381,384],"span",{"class":382,"line":383},"line",1,[380,385,387],{"class":386},"sTBSN","# Local filesystem\n",[380,389,391,395,399],{"class":382,"line":390},2,[380,392,394],{"class":393},"sRCss","composer",[380,396,398],{"class":397},"sLL54"," require",[380,400,401],{"class":397}," league\u002Fflysystem-local\n",[380,403,405],{"class":382,"line":404},3,[380,406,408],{"emptyLinePlaceholder":407},true,"\n",[380,410,412],{"class":382,"line":411},4,[380,413,414],{"class":386},"# Google Cloud Storage\n",[380,416,418,420,422],{"class":382,"line":417},5,[380,419,394],{"class":393},[380,421,398],{"class":397},[380,423,424],{"class":397}," league\u002Fflysystem-google-cloud-storage\n",[380,426,428],{"class":382,"line":427},6,[380,429,408],{"emptyLinePlaceholder":407},[380,431,433],{"class":382,"line":432},7,[380,434,435],{"class":386},"# S3-compatible\n",[380,437,439,441,443],{"class":382,"line":438},8,[380,440,394],{"class":393},[380,442,398],{"class":397},[380,444,445],{"class":397}," league\u002Fflysystem-aws-s3-v3\n",[351,447,448],{},"Register the adapter as a service with the CWA tag:",[371,450,454],{"className":451,"code":452,"language":453,"meta":376,"style":376},"language-yaml shiki shiki-themes github-light github-dark material-theme-palenight","# config\u002Fservices.yaml\nservices:\n    League\\Flysystem\\Local\\LocalFilesystemAdapter:\n        arguments:\n            - '%kernel.project_dir%\u002Fvar\u002Fstorage\u002Fdefault'\n        tags:\n            - { name: silverback.api_components.filesystem_provider, alias: 'local' }\n","yaml",[354,455,456,461,471,478,485,500,507],{"__ignoreMap":376},[380,457,458],{"class":382,"line":383},[380,459,460],{"class":386},"# config\u002Fservices.yaml\n",[380,462,463,467],{"class":382,"line":390},[380,464,466],{"class":465},"s-h7I","services",[380,468,470],{"class":469},"sOvfz",":\n",[380,472,473,476],{"class":382,"line":404},[380,474,475],{"class":465},"    League\\Flysystem\\Local\\LocalFilesystemAdapter",[380,477,470],{"class":469},[380,479,480,483],{"class":382,"line":411},[380,481,482],{"class":465},"        arguments",[380,484,470],{"class":469},[380,486,487,490,494,497],{"class":382,"line":417},[380,488,489],{"class":469},"            -",[380,491,493],{"class":492},"seSrl"," '",[380,495,496],{"class":397},"%kernel.project_dir%\u002Fvar\u002Fstorage\u002Fdefault",[380,498,499],{"class":492},"'\n",[380,501,502,505],{"class":382,"line":427},[380,503,504],{"class":465},"        tags",[380,506,470],{"class":469},[380,508,509,511,514,517,520,523,526,529,531,533,536,539],{"class":382,"line":432},[380,510,489],{"class":469},[380,512,513],{"class":469}," {",[380,515,516],{"class":465}," name",[380,518,519],{"class":469},":",[380,521,522],{"class":397}," silverback.api_components.filesystem_provider",[380,524,525],{"class":469},",",[380,527,528],{"class":465}," alias",[380,530,519],{"class":469},[380,532,493],{"class":492},[380,534,535],{"class":397},"local",[380,537,538],{"class":492},"'",[380,540,541],{"class":469}," }\n",[351,543,544,545,548,549,552],{},"The ",[354,546,547],{},"alias"," becomes the adapter name you use in ",[354,550,551],{},"#[UploadableField]",".",[363,554,556],{"id":555},"add-to-your-entity","Add to Your Entity",[371,558,562],{"className":559,"code":560,"language":561,"meta":376,"style":376},"language-php shiki shiki-themes github-light github-dark material-theme-palenight","use Silverback\\ApiComponentsBundle\\Annotation as Silverback;\nuse Silverback\\ApiComponentsBundle\\Entity\\Core\\AbstractComponent;\nuse Silverback\\ApiComponentsBundle\\Entity\\Utility\\UploadableTrait;\nuse Symfony\\Component\\HttpFoundation\\File\\File;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n#[Silverback\\Publishable]\n#[Silverback\\Uploadable]\n#[ORM\\Entity]\n#[ApiResource(mercure: true)]\nclass Image extends AbstractComponent\n{\n    use PublishableTrait;\n    use UploadableTrait;\n\n    #[Silverback\\UploadableField(adapter: 'local', urlGenerator: 'public', imagineFilters: ['thumbnail'])]\n    #[Assert\\File(maxSize: '5M')]\n    public ?File $file = null;\n}\n","php",[354,563,564,594,621,647,674,701,705,721,733,747,771,787,793,804,814,819,881,911,938],{"__ignoreMap":376},[380,565,566,570,574,578,581,583,586,589,591],{"class":382,"line":383},[380,567,569],{"class":568},"stmX-","use",[380,571,573],{"class":572},"sc2zw"," Silverback",[380,575,577],{"class":576},"sBtbT","\\",[380,579,580],{"class":572},"ApiComponentsBundle",[380,582,577],{"class":576},[380,584,585],{"class":572},"Annotation",[380,587,588],{"class":568}," as",[380,590,573],{"class":393},[380,592,593],{"class":469},";\n",[380,595,596,598,600,602,604,606,609,611,614,616,619],{"class":382,"line":390},[380,597,569],{"class":568},[380,599,573],{"class":572},[380,601,577],{"class":576},[380,603,580],{"class":572},[380,605,577],{"class":576},[380,607,608],{"class":572},"Entity",[380,610,577],{"class":576},[380,612,613],{"class":572},"Core",[380,615,577],{"class":576},[380,617,618],{"class":572},"AbstractComponent",[380,620,593],{"class":469},[380,622,623,625,627,629,631,633,635,637,640,642,645],{"class":382,"line":404},[380,624,569],{"class":568},[380,626,573],{"class":572},[380,628,577],{"class":576},[380,630,580],{"class":572},[380,632,577],{"class":576},[380,634,608],{"class":572},[380,636,577],{"class":576},[380,638,639],{"class":572},"Utility",[380,641,577],{"class":576},[380,643,644],{"class":572},"UploadableTrait",[380,646,593],{"class":469},[380,648,649,651,654,656,658,660,663,665,668,670,672],{"class":382,"line":411},[380,650,569],{"class":568},[380,652,653],{"class":572}," Symfony",[380,655,577],{"class":576},[380,657,213],{"class":572},[380,659,577],{"class":576},[380,661,662],{"class":572},"HttpFoundation",[380,664,577],{"class":576},[380,666,667],{"class":572},"File",[380,669,577],{"class":576},[380,671,667],{"class":572},[380,673,593],{"class":469},[380,675,676,678,680,682,684,686,689,691,694,696,699],{"class":382,"line":417},[380,677,569],{"class":568},[380,679,653],{"class":572},[380,681,577],{"class":576},[380,683,213],{"class":572},[380,685,577],{"class":576},[380,687,688],{"class":572},"Validator",[380,690,577],{"class":576},[380,692,693],{"class":572},"Constraints",[380,695,588],{"class":568},[380,697,698],{"class":393}," Assert",[380,700,593],{"class":469},[380,702,703],{"class":382,"line":427},[380,704,408],{"emptyLinePlaceholder":407},[380,706,707,711,714,716,718],{"class":382,"line":432},[380,708,710],{"class":709},"sPB8G","#[",[380,712,713],{"class":572},"Silverback",[380,715,577],{"class":576},[380,717,92],{"class":572},[380,719,720],{"class":709},"]\n",[380,722,723,725,727,729,731],{"class":382,"line":438},[380,724,710],{"class":709},[380,726,713],{"class":572},[380,728,577],{"class":576},[380,730,96],{"class":572},[380,732,720],{"class":709},[380,734,736,738,741,743,745],{"class":382,"line":735},9,[380,737,710],{"class":709},[380,739,740],{"class":572},"ORM",[380,742,577],{"class":576},[380,744,608],{"class":572},[380,746,720],{"class":709},[380,748,750,752,755,758,761,763,766,769],{"class":382,"line":749},10,[380,751,710],{"class":709},[380,753,754],{"class":572},"ApiResource",[380,756,757],{"class":469},"(",[380,759,760],{"class":393},"mercure",[380,762,519],{"class":469},[380,764,765],{"class":576}," true",[380,767,768],{"class":469},")",[380,770,720],{"class":709},[380,772,774,778,781,784],{"class":382,"line":773},11,[380,775,777],{"class":776},"swB56","class",[380,779,780],{"class":393}," Image",[380,782,783],{"class":776}," extends",[380,785,786],{"class":393}," AbstractComponent\n",[380,788,790],{"class":382,"line":789},12,[380,791,792],{"class":469},"{\n",[380,794,796,799,802],{"class":382,"line":795},13,[380,797,798],{"class":568},"    use",[380,800,801],{"class":572}," PublishableTrait",[380,803,593],{"class":469},[380,805,807,809,812],{"class":382,"line":806},14,[380,808,798],{"class":568},[380,810,811],{"class":572}," UploadableTrait",[380,813,593],{"class":469},[380,815,817],{"class":382,"line":816},15,[380,818,408],{"emptyLinePlaceholder":407},[380,820,822,825,827,829,832,834,837,839,841,843,845,847,850,852,854,857,859,861,864,866,869,871,874,876,879],{"class":382,"line":821},16,[380,823,824],{"class":709},"    #[",[380,826,713],{"class":572},[380,828,577],{"class":576},[380,830,831],{"class":572},"UploadableField",[380,833,757],{"class":469},[380,835,836],{"class":393},"adapter",[380,838,519],{"class":469},[380,840,493],{"class":492},[380,842,535],{"class":397},[380,844,538],{"class":492},[380,846,525],{"class":469},[380,848,849],{"class":393}," urlGenerator",[380,851,519],{"class":469},[380,853,493],{"class":492},[380,855,856],{"class":397},"public",[380,858,538],{"class":492},[380,860,525],{"class":469},[380,862,863],{"class":393}," imagineFilters",[380,865,519],{"class":469},[380,867,868],{"class":469}," [",[380,870,538],{"class":492},[380,872,873],{"class":397},"thumbnail",[380,875,538],{"class":492},[380,877,878],{"class":469},"])",[380,880,720],{"class":709},[380,882,884,886,889,891,893,895,898,900,902,905,907,909],{"class":382,"line":883},17,[380,885,824],{"class":709},[380,887,888],{"class":572},"Assert",[380,890,577],{"class":576},[380,892,667],{"class":572},[380,894,757],{"class":469},[380,896,897],{"class":393},"maxSize",[380,899,519],{"class":469},[380,901,493],{"class":492},[380,903,904],{"class":397},"5M",[380,906,538],{"class":492},[380,908,768],{"class":469},[380,910,720],{"class":709},[380,912,914,917,921,924,927,930,933,936],{"class":382,"line":913},18,[380,915,916],{"class":776},"    public",[380,918,920],{"class":919},"sVlFx"," ?",[380,922,667],{"class":923},"sbW4m",[380,925,926],{"class":469}," $",[380,928,929],{"class":709},"file ",[380,931,932],{"class":919},"=",[380,934,935],{"class":576}," null",[380,937,593],{"class":469},[380,939,941],{"class":382,"line":940},19,[380,942,943],{"class":469},"}\n",[363,945,947],{"id":946},"uploadablefield-parameters","UploadableField Parameters",[949,950,951,967],"table",{},[952,953,954],"thead",{},[955,956,957,961,964],"tr",{},[958,959,960],"th",{},"Parameter",[958,962,963],{},"Default",[958,965,966],{},"Description",[968,969,970,987,1002,1017,1035],"tbody",{},[955,971,972,977,980],{},[973,974,975],"td",{},[354,976,836],{},[973,978,979],{},"—",[973,981,982,986],{},[983,984,985],"strong",{},"Required."," The Flysystem adapter alias",[955,988,989,994,999],{},[973,990,991],{},[354,992,993],{},"urlGenerator",[973,995,996],{},[354,997,998],{},"'api'",[973,1000,1001],{},"How to generate the file URL — see below",[955,1003,1004,1009,1014],{},[973,1005,1006],{},[354,1007,1008],{},"property",[973,1010,1011],{},[354,1012,1013],{},"'filename'",[973,1015,1016],{},"The property name on the media object that stores the filename",[955,1018,1019,1024,1029],{},[973,1020,1021],{},[354,1022,1023],{},"prefix",[973,1025,1026],{},[354,1027,1028],{},"null",[973,1030,1031,1032,768],{},"Optional path prefix inside the storage (e.g. ",[354,1033,1034],{},"'images\u002F'",[955,1036,1037,1042,1047],{},[973,1038,1039],{},[354,1040,1041],{},"imagineFilters",[973,1043,1044],{},[354,1045,1046],{},"[]",[973,1048,1049],{},"LiipImagine filter names to apply at upload time",[1051,1052,1054,1056],"h3",{"id":1053},"urlgenerator-values",[354,1055,993],{}," values",[1058,1059,1060,1072,1099],"ul",{},[1061,1062,1063,1067,1068,1071],"li",{},[983,1064,1065],{},[354,1066,998],{}," (default) — the file URL is served through a Symfony download route (",[354,1069,1070],{},"\u002F_\u002Fmedia_objects\u002F{id}\u002Fdownload","). Works with any adapter regardless of whether it supports direct URL generation.",[1061,1073,1074,1079,1080,1083,1084,1087,1088,1091,1092,1095,1096,1098],{},[983,1075,1076],{},[354,1077,1078],{},"'public'"," — calls Flysystem's ",[354,1081,1082],{},"publicUrl()"," method to return a direct CDN or storage URL. Requires the adapter to implement Flysystem's ",[354,1085,1086],{},"PublicUrlGenerator"," interface (e.g. ",[354,1089,1090],{},"league\u002Fflysystem-aws-s3-v3",", ",[354,1093,1094],{},"league\u002Fflysystem-google-cloud-storage","). Falls back to ",[354,1097,998],{}," if the adapter does not support it.",[1061,1100,1101,1079,1106,1109,1110,1113,1114,1117,1118,1120],{},[983,1102,1103],{},[354,1104,1105],{},"'temporary'",[354,1107,1108],{},"temporaryUrl()"," method to return a pre-signed URL with an expiry (default: ",[354,1111,1112],{},"+3 days","). Requires the adapter to implement Flysystem's ",[354,1115,1116],{},"TemporaryUrlGenerator"," interface. Falls back to ",[354,1119,998],{}," if not supported. The primary use case is S3 pre-signed URLs for private\u002Faccess-controlled files.",[371,1122,1124],{"className":559,"code":1123,"language":561,"meta":376,"style":376},"\u002F\u002F S3 pre-signed URL — valid for 3 days, falls back to API route if adapter doesn't support it\n#[Silverback\\UploadableField(adapter: 's3', urlGenerator: 'temporary')]\npublic ?File $file = null;\n\n\u002F\u002F CDN public URL — direct S3\u002FGCS link\n#[Silverback\\UploadableField(adapter: 'gcs', urlGenerator: 'public')]\npublic ?File $image = null;\n",[354,1125,1126,1131,1171,1189,1193,1198,1237],{"__ignoreMap":376},[380,1127,1128],{"class":382,"line":383},[380,1129,1130],{"class":386},"\u002F\u002F S3 pre-signed URL — valid for 3 days, falls back to API route if adapter doesn't support it\n",[380,1132,1133,1135,1137,1139,1141,1143,1145,1147,1149,1152,1154,1156,1158,1160,1162,1165,1167,1169],{"class":382,"line":390},[380,1134,710],{"class":709},[380,1136,713],{"class":572},[380,1138,577],{"class":576},[380,1140,831],{"class":572},[380,1142,757],{"class":469},[380,1144,836],{"class":393},[380,1146,519],{"class":469},[380,1148,493],{"class":492},[380,1150,1151],{"class":397},"s3",[380,1153,538],{"class":492},[380,1155,525],{"class":469},[380,1157,849],{"class":393},[380,1159,519],{"class":469},[380,1161,493],{"class":492},[380,1163,1164],{"class":397},"temporary",[380,1166,538],{"class":492},[380,1168,768],{"class":469},[380,1170,720],{"class":709},[380,1172,1173,1175,1177,1179,1181,1183,1185,1187],{"class":382,"line":404},[380,1174,856],{"class":776},[380,1176,920],{"class":919},[380,1178,667],{"class":923},[380,1180,926],{"class":469},[380,1182,929],{"class":709},[380,1184,932],{"class":919},[380,1186,935],{"class":576},[380,1188,593],{"class":469},[380,1190,1191],{"class":382,"line":411},[380,1192,408],{"emptyLinePlaceholder":407},[380,1194,1195],{"class":382,"line":417},[380,1196,1197],{"class":386},"\u002F\u002F CDN public URL — direct S3\u002FGCS link\n",[380,1199,1200,1202,1204,1206,1208,1210,1212,1214,1216,1219,1221,1223,1225,1227,1229,1231,1233,1235],{"class":382,"line":427},[380,1201,710],{"class":709},[380,1203,713],{"class":572},[380,1205,577],{"class":576},[380,1207,831],{"class":572},[380,1209,757],{"class":469},[380,1211,836],{"class":393},[380,1213,519],{"class":469},[380,1215,493],{"class":492},[380,1217,1218],{"class":397},"gcs",[380,1220,538],{"class":492},[380,1222,525],{"class":469},[380,1224,849],{"class":393},[380,1226,519],{"class":469},[380,1228,493],{"class":492},[380,1230,856],{"class":397},[380,1232,538],{"class":492},[380,1234,768],{"class":469},[380,1236,720],{"class":709},[380,1238,1239,1241,1243,1245,1247,1250,1252,1254],{"class":382,"line":432},[380,1240,856],{"class":776},[380,1242,920],{"class":919},[380,1244,667],{"class":923},[380,1246,926],{"class":469},[380,1248,1249],{"class":709},"image ",[380,1251,932],{"class":919},[380,1253,935],{"class":576},[380,1255,593],{"class":469},[363,1257,1259],{"id":1258},"uploading-a-file","Uploading a File",[351,1261,1262,1265],{},[983,1263,1264],{},"Option 1 — Base64 in the JSON body"," (preferred for REST clients):",[371,1267,1271],{"className":1268,"code":1269,"language":1270,"meta":376,"style":376},"language-json shiki shiki-themes github-light github-dark material-theme-palenight","POST \u002Fcomponent\u002Fimages\nContent-Type: application\u002Fjson\n\n{\n    \"file\": \"data:image\u002Fjpeg;base64,\u002F9j\u002F4AAQSkZJRgAB...\"\n}\n","json",[354,1272,1273,1278,1283,1287,1291,1314],{"__ignoreMap":376},[380,1274,1275],{"class":382,"line":383},[380,1276,1277],{"class":709},"POST \u002Fcomponent\u002Fimages\n",[380,1279,1280],{"class":382,"line":390},[380,1281,1282],{"class":709},"Content-Type: application\u002Fjson\n",[380,1284,1285],{"class":382,"line":404},[380,1286,408],{"emptyLinePlaceholder":407},[380,1288,1289],{"class":382,"line":411},[380,1290,792],{"class":469},[380,1292,1293,1296,1300,1303,1305,1308,1311],{"class":382,"line":417},[380,1294,1295],{"class":576},"    \"",[380,1297,1299],{"class":1298},"sphPO","file",[380,1301,1302],{"class":576},"\"",[380,1304,519],{"class":469},[380,1306,1307],{"class":492}," \"",[380,1309,1310],{"class":397},"data:image\u002Fjpeg;base64,\u002F9j\u002F4AAQSkZJRgAB...",[380,1312,1313],{"class":492},"\"\n",[380,1315,1316],{"class":382,"line":427},[380,1317,943],{"class":469},[351,1319,1320,519],{},[983,1321,1322],{},"Option 2 — Multipart form upload",[371,1324,1329],{"className":1325,"code":1327,"language":1328},[1326],"language-text","POST \u002Fcomponent\u002Fimages\u002F{id}\u002Fupload\nContent-Type: multipart\u002Fform-data\n\nfile=\u003Cbinary>\n","text",[354,1330,1327],{"__ignoreMap":376},[363,1332,544,1334,1337],{"id":1333},"the-_metadata-response",[354,1335,1336],{},"_metadata"," Response",[351,1339,1340,1341,1344],{},"After upload, the resource includes a ",[354,1342,1343],{},"_metadata.mediaObjects"," map:",[371,1346,1348],{"className":1268,"code":1347,"language":1270,"meta":376,"style":376},"{\n    \"@id\": \"\u002Fcomponent\u002Fimages\u002F018e-...\",\n    \"_metadata\": {\n        \"mediaObjects\": {\n            \"file\": {\n                \"contentUrl\": \"https:\u002F\u002Fcdn.example.com\u002Fimages\u002F018e-....jpg\",\n                \"fileSize\": 245120,\n                \"mimeType\": \"image\u002Fjpeg\",\n                \"width\": 1920,\n                \"height\": 1080,\n                \"thumbnail\": {\n                    \"contentUrl\": \"https:\u002F\u002Fcdn.example.com\u002Fimages\u002F018e-...thumbnail.jpg\",\n                    \"width\": 300,\n                    \"height\": 200\n                }\n            }\n        }\n    }\n}\n",[354,1349,1350,1354,1375,1388,1402,1416,1438,1454,1474,1490,1506,1518,1539,1554,1567,1572,1577,1582,1587],{"__ignoreMap":376},[380,1351,1352],{"class":382,"line":383},[380,1353,792],{"class":469},[380,1355,1356,1358,1361,1363,1365,1367,1370,1372],{"class":382,"line":390},[380,1357,1295],{"class":576},[380,1359,1360],{"class":1298},"@id",[380,1362,1302],{"class":576},[380,1364,519],{"class":469},[380,1366,1307],{"class":492},[380,1368,1369],{"class":397},"\u002Fcomponent\u002Fimages\u002F018e-...",[380,1371,1302],{"class":492},[380,1373,1374],{"class":469},",\n",[380,1376,1377,1379,1381,1383,1385],{"class":382,"line":404},[380,1378,1295],{"class":576},[380,1380,1336],{"class":1298},[380,1382,1302],{"class":576},[380,1384,519],{"class":469},[380,1386,1387],{"class":469}," {\n",[380,1389,1390,1393,1396,1398,1400],{"class":382,"line":411},[380,1391,1392],{"class":576},"        \"",[380,1394,1395],{"class":923},"mediaObjects",[380,1397,1302],{"class":576},[380,1399,519],{"class":469},[380,1401,1387],{"class":469},[380,1403,1404,1407,1410,1412,1414],{"class":382,"line":417},[380,1405,1406],{"class":576},"            \"",[380,1408,1299],{"class":1409},"scSvc",[380,1411,1302],{"class":576},[380,1413,519],{"class":469},[380,1415,1387],{"class":469},[380,1417,1418,1421,1425,1427,1429,1431,1434,1436],{"class":382,"line":427},[380,1419,1420],{"class":576},"                \"",[380,1422,1424],{"class":1423},"sadgS","contentUrl",[380,1426,1302],{"class":576},[380,1428,519],{"class":469},[380,1430,1307],{"class":492},[380,1432,1433],{"class":397},"https:\u002F\u002Fcdn.example.com\u002Fimages\u002F018e-....jpg",[380,1435,1302],{"class":492},[380,1437,1374],{"class":469},[380,1439,1440,1442,1445,1447,1449,1452],{"class":382,"line":432},[380,1441,1420],{"class":576},[380,1443,1444],{"class":1423},"fileSize",[380,1446,1302],{"class":576},[380,1448,519],{"class":469},[380,1450,1451],{"class":1409}," 245120",[380,1453,1374],{"class":469},[380,1455,1456,1458,1461,1463,1465,1467,1470,1472],{"class":382,"line":438},[380,1457,1420],{"class":576},[380,1459,1460],{"class":1423},"mimeType",[380,1462,1302],{"class":576},[380,1464,519],{"class":469},[380,1466,1307],{"class":492},[380,1468,1469],{"class":397},"image\u002Fjpeg",[380,1471,1302],{"class":492},[380,1473,1374],{"class":469},[380,1475,1476,1478,1481,1483,1485,1488],{"class":382,"line":735},[380,1477,1420],{"class":576},[380,1479,1480],{"class":1423},"width",[380,1482,1302],{"class":576},[380,1484,519],{"class":469},[380,1486,1487],{"class":1409}," 1920",[380,1489,1374],{"class":469},[380,1491,1492,1494,1497,1499,1501,1504],{"class":382,"line":749},[380,1493,1420],{"class":576},[380,1495,1496],{"class":1423},"height",[380,1498,1302],{"class":576},[380,1500,519],{"class":469},[380,1502,1503],{"class":1409}," 1080",[380,1505,1374],{"class":469},[380,1507,1508,1510,1512,1514,1516],{"class":382,"line":773},[380,1509,1420],{"class":576},[380,1511,873],{"class":1423},[380,1513,1302],{"class":576},[380,1515,519],{"class":469},[380,1517,1387],{"class":469},[380,1519,1520,1523,1526,1528,1530,1532,1535,1537],{"class":382,"line":789},[380,1521,1522],{"class":576},"                    \"",[380,1524,1424],{"class":1525},"sErdZ",[380,1527,1302],{"class":576},[380,1529,519],{"class":469},[380,1531,1307],{"class":492},[380,1533,1534],{"class":397},"https:\u002F\u002Fcdn.example.com\u002Fimages\u002F018e-...thumbnail.jpg",[380,1536,1302],{"class":492},[380,1538,1374],{"class":469},[380,1540,1541,1543,1545,1547,1549,1552],{"class":382,"line":795},[380,1542,1522],{"class":576},[380,1544,1480],{"class":1525},[380,1546,1302],{"class":576},[380,1548,519],{"class":469},[380,1550,1551],{"class":1409}," 300",[380,1553,1374],{"class":469},[380,1555,1556,1558,1560,1562,1564],{"class":382,"line":806},[380,1557,1522],{"class":576},[380,1559,1496],{"class":1525},[380,1561,1302],{"class":576},[380,1563,519],{"class":469},[380,1565,1566],{"class":1409}," 200\n",[380,1568,1569],{"class":382,"line":816},[380,1570,1571],{"class":469},"                }\n",[380,1573,1574],{"class":382,"line":821},[380,1575,1576],{"class":469},"            }\n",[380,1578,1579],{"class":382,"line":883},[380,1580,1581],{"class":469},"        }\n",[380,1583,1584],{"class":382,"line":913},[380,1585,1586],{"class":469},"    }\n",[380,1588,1589],{"class":382,"line":940},[380,1590,943],{"class":469},[351,1592,1593,1594,1596],{},"Each entry under the field name (",[354,1595,1299],{},") contains the original upload plus any Imagine variants as nested objects.",[363,1598,1600],{"id":1599},"liipimaginebundle-integration","LiipImagineBundle Integration",[351,1602,1603],{},"LiipImagine generates image variants automatically at upload time.",[351,1605,1606],{},"Install the bundle and configure it to use CWA's Flysystem data loader:",[371,1608,1610],{"className":373,"code":1609,"language":375,"meta":376,"style":376},"composer require liip\u002Fimagine-bundle\n",[354,1611,1612],{"__ignoreMap":376},[380,1613,1614,1616,1618],{"class":382,"line":383},[380,1615,394],{"class":393},[380,1617,398],{"class":397},[380,1619,1620],{"class":397}," liip\u002Fimagine-bundle\n",[371,1622,1624],{"className":451,"code":1623,"language":453,"meta":376,"style":376},"# config\u002Fpackages\u002Fliip_imagine.yaml\nliip_imagine:\n    data_loader: silverback.api_components.liip_imagine.binary.loader\n    filter_sets:\n        thumbnail:\n            quality: 80\n            filters:\n                thumbnail: { size: [300, 300], mode: outbound }\n        hero:\n            quality: 90\n            filters:\n                thumbnail: { size: [1200, 630], mode: outbound }\n",[354,1625,1626,1631,1638,1648,1655,1662,1672,1679,1715,1722,1731,1737],{"__ignoreMap":376},[380,1627,1628],{"class":382,"line":383},[380,1629,1630],{"class":386},"# config\u002Fpackages\u002Fliip_imagine.yaml\n",[380,1632,1633,1636],{"class":382,"line":390},[380,1634,1635],{"class":465},"liip_imagine",[380,1637,470],{"class":469},[380,1639,1640,1643,1645],{"class":382,"line":404},[380,1641,1642],{"class":465},"    data_loader",[380,1644,519],{"class":469},[380,1646,1647],{"class":397}," silverback.api_components.liip_imagine.binary.loader\n",[380,1649,1650,1653],{"class":382,"line":411},[380,1651,1652],{"class":465},"    filter_sets",[380,1654,470],{"class":469},[380,1656,1657,1660],{"class":382,"line":417},[380,1658,1659],{"class":465},"        thumbnail",[380,1661,470],{"class":469},[380,1663,1664,1667,1669],{"class":382,"line":427},[380,1665,1666],{"class":465},"            quality",[380,1668,519],{"class":469},[380,1670,1671],{"class":1409}," 80\n",[380,1673,1674,1677],{"class":382,"line":432},[380,1675,1676],{"class":465},"            filters",[380,1678,470],{"class":469},[380,1680,1681,1684,1686,1688,1691,1693,1695,1698,1700,1702,1705,1708,1710,1713],{"class":382,"line":438},[380,1682,1683],{"class":465},"                thumbnail",[380,1685,519],{"class":469},[380,1687,513],{"class":469},[380,1689,1690],{"class":465}," size",[380,1692,519],{"class":469},[380,1694,868],{"class":469},[380,1696,1697],{"class":1409},"300",[380,1699,525],{"class":469},[380,1701,1551],{"class":1409},[380,1703,1704],{"class":469},"],",[380,1706,1707],{"class":465}," mode",[380,1709,519],{"class":469},[380,1711,1712],{"class":397}," outbound",[380,1714,541],{"class":469},[380,1716,1717,1720],{"class":382,"line":735},[380,1718,1719],{"class":465},"        hero",[380,1721,470],{"class":469},[380,1723,1724,1726,1728],{"class":382,"line":749},[380,1725,1666],{"class":465},[380,1727,519],{"class":469},[380,1729,1730],{"class":1409}," 90\n",[380,1732,1733,1735],{"class":382,"line":773},[380,1734,1676],{"class":465},[380,1736,470],{"class":469},[380,1738,1739,1741,1743,1745,1747,1749,1751,1754,1756,1759,1761,1763,1765,1767],{"class":382,"line":789},[380,1740,1683],{"class":465},[380,1742,519],{"class":469},[380,1744,513],{"class":469},[380,1746,1690],{"class":465},[380,1748,519],{"class":469},[380,1750,868],{"class":469},[380,1752,1753],{"class":1409},"1200",[380,1755,525],{"class":469},[380,1757,1758],{"class":1409}," 630",[380,1760,1704],{"class":469},[380,1762,1707],{"class":465},[380,1764,519],{"class":469},[380,1766,1712],{"class":397},[380,1768,541],{"class":469},[351,1770,1771],{},"Configure the cache resolver to write back through Flysystem:",[371,1773,1775],{"className":451,"code":1774,"language":453,"meta":376,"style":376},"services:\n    app.imagine.cache.resolver.local:\n        class: Silverback\\ApiComponentsBundle\\Imagine\\FlysystemCacheResolver\n        arguments:\n            $filesystem: '@api_components.filesystem.local'\n            $rootUrl: 'https:\u002F\u002Fcdn.example.com'\n        tags:\n            - { name: 'liip_imagine.cache.resolver', resolver: local }\n\nliip_imagine:\n    cache: local\n",[354,1776,1777,1783,1790,1800,1806,1820,1834,1840,1869,1873,1879],{"__ignoreMap":376},[380,1778,1779,1781],{"class":382,"line":383},[380,1780,466],{"class":465},[380,1782,470],{"class":469},[380,1784,1785,1788],{"class":382,"line":390},[380,1786,1787],{"class":465},"    app.imagine.cache.resolver.local",[380,1789,470],{"class":469},[380,1791,1792,1795,1797],{"class":382,"line":404},[380,1793,1794],{"class":465},"        class",[380,1796,519],{"class":469},[380,1798,1799],{"class":397}," Silverback\\ApiComponentsBundle\\Imagine\\FlysystemCacheResolver\n",[380,1801,1802,1804],{"class":382,"line":411},[380,1803,482],{"class":465},[380,1805,470],{"class":469},[380,1807,1808,1811,1813,1815,1818],{"class":382,"line":417},[380,1809,1810],{"class":465},"            $filesystem",[380,1812,519],{"class":469},[380,1814,493],{"class":492},[380,1816,1817],{"class":397},"@api_components.filesystem.local",[380,1819,499],{"class":492},[380,1821,1822,1825,1827,1829,1832],{"class":382,"line":427},[380,1823,1824],{"class":465},"            $rootUrl",[380,1826,519],{"class":469},[380,1828,493],{"class":492},[380,1830,1831],{"class":397},"https:\u002F\u002Fcdn.example.com",[380,1833,499],{"class":492},[380,1835,1836,1838],{"class":382,"line":432},[380,1837,504],{"class":465},[380,1839,470],{"class":469},[380,1841,1842,1844,1846,1848,1850,1852,1855,1857,1859,1862,1864,1867],{"class":382,"line":438},[380,1843,489],{"class":469},[380,1845,513],{"class":469},[380,1847,516],{"class":465},[380,1849,519],{"class":469},[380,1851,493],{"class":492},[380,1853,1854],{"class":397},"liip_imagine.cache.resolver",[380,1856,538],{"class":492},[380,1858,525],{"class":469},[380,1860,1861],{"class":465}," resolver",[380,1863,519],{"class":469},[380,1865,1866],{"class":397}," local",[380,1868,541],{"class":469},[380,1870,1871],{"class":382,"line":735},[380,1872,408],{"emptyLinePlaceholder":407},[380,1874,1875,1877],{"class":382,"line":749},[380,1876,1635],{"class":465},[380,1878,470],{"class":469},[380,1880,1881,1884,1886],{"class":382,"line":773},[380,1882,1883],{"class":465},"    cache",[380,1885,519],{"class":469},[380,1887,1888],{"class":397}," local\n",[351,1890,1891,1892,1895],{},"The service ",[354,1893,1894],{},"api_components.filesystem.{alias}"," is created automatically for each registered adapter.",[363,1897,1899],{"id":1898},"dynamic-filter-selection","Dynamic Filter Selection",[351,1901,1902,1903,519],{},"For cases where the required filters depend on runtime data (request context, entity state), implement ",[354,1904,1905],{},"ImagineFiltersInterface",[371,1907,1909],{"className":559,"code":1908,"language":561,"meta":376,"style":376},"use Silverback\\ApiComponentsBundle\\Imagine\\ImagineFiltersInterface;\nuse Symfony\\Component\\HttpFoundation\\Request;\n\nclass Image extends AbstractComponent implements ImagineFiltersInterface\n{\n    public function getImagineFilters(string $property, ?Request $request): array\n    {\n        return ['thumbnail', 'hero', 'square'];\n    }\n}\n",[354,1910,1911,1932,1953,1957,1974,1978,2016,2021,2056,2060],{"__ignoreMap":376},[380,1912,1913,1915,1917,1919,1921,1923,1926,1928,1930],{"class":382,"line":383},[380,1914,569],{"class":568},[380,1916,573],{"class":572},[380,1918,577],{"class":576},[380,1920,580],{"class":572},[380,1922,577],{"class":576},[380,1924,1925],{"class":572},"Imagine",[380,1927,577],{"class":576},[380,1929,1905],{"class":572},[380,1931,593],{"class":469},[380,1933,1934,1936,1938,1940,1942,1944,1946,1948,1951],{"class":382,"line":390},[380,1935,569],{"class":568},[380,1937,653],{"class":572},[380,1939,577],{"class":576},[380,1941,213],{"class":572},[380,1943,577],{"class":576},[380,1945,662],{"class":572},[380,1947,577],{"class":576},[380,1949,1950],{"class":572},"Request",[380,1952,593],{"class":469},[380,1954,1955],{"class":382,"line":404},[380,1956,408],{"emptyLinePlaceholder":407},[380,1958,1959,1961,1963,1965,1968,1971],{"class":382,"line":411},[380,1960,777],{"class":776},[380,1962,780],{"class":393},[380,1964,783],{"class":776},[380,1966,1967],{"class":393}," AbstractComponent",[380,1969,1970],{"class":776}," implements",[380,1972,1973],{"class":393}," ImagineFiltersInterface\n",[380,1975,1976],{"class":382,"line":417},[380,1977,792],{"class":469},[380,1979,1980,1982,1985,1989,1991,1994,1996,1998,2000,2002,2004,2006,2009,2011,2013],{"class":382,"line":427},[380,1981,916],{"class":776},[380,1983,1984],{"class":776}," function",[380,1986,1988],{"class":1987},"sKpYG"," getImagineFilters",[380,1990,757],{"class":469},[380,1992,1993],{"class":568},"string",[380,1995,926],{"class":469},[380,1997,1008],{"class":709},[380,1999,525],{"class":469},[380,2001,920],{"class":919},[380,2003,1950],{"class":923},[380,2005,926],{"class":469},[380,2007,2008],{"class":709},"request",[380,2010,768],{"class":469},[380,2012,519],{"class":919},[380,2014,2015],{"class":568}," array\n",[380,2017,2018],{"class":382,"line":432},[380,2019,2020],{"class":469},"    {\n",[380,2022,2023,2027,2029,2031,2033,2035,2037,2039,2042,2044,2046,2048,2051,2053],{"class":382,"line":438},[380,2024,2026],{"class":2025},"sm4w6","        return",[380,2028,868],{"class":469},[380,2030,538],{"class":492},[380,2032,873],{"class":397},[380,2034,538],{"class":492},[380,2036,525],{"class":469},[380,2038,493],{"class":492},[380,2040,2041],{"class":397},"hero",[380,2043,538],{"class":492},[380,2045,525],{"class":469},[380,2047,493],{"class":492},[380,2049,2050],{"class":397},"square",[380,2052,538],{"class":492},[380,2054,2055],{"class":469},"];\n",[380,2057,2058],{"class":382,"line":735},[380,2059,1586],{"class":469},[380,2061,2062],{"class":382,"line":749},[380,2063,943],{"class":469},[351,2065,2066,2069,2070,2072],{},[354,2067,2068],{},"$request"," is ",[354,2071,1028],{}," when called during upload processing outside a web request (e.g. in a fixture).",[363,2074,2076],{"id":2075},"deleting-a-file","Deleting a File",[351,2078,2079,2080,2082],{},"Send ",[354,2081,1028],{}," for the field property in a PATCH:",[371,2084,2086],{"className":1268,"code":2085,"language":1270,"meta":376,"style":376},"PATCH \u002Fcomponent\u002Fimages\u002F{id}\nContent-Type: application\u002Fmerge-patch+json\n\n{ \"file\": null }\n",[354,2087,2088,2102,2107,2111],{"__ignoreMap":376},[380,2089,2090,2093,2096,2100],{"class":382,"line":383},[380,2091,2092],{"class":709},"PATCH \u002Fcomponent\u002Fimages\u002F",[380,2094,2095],{"class":469},"{",[380,2097,2099],{"class":2098},"s0uA6","id",[380,2101,943],{"class":469},[380,2103,2104],{"class":382,"line":390},[380,2105,2106],{"class":709},"Content-Type: application\u002Fmerge-patch+json\n",[380,2108,2109],{"class":382,"line":404},[380,2110,408],{"emptyLinePlaceholder":407},[380,2112,2113,2115,2117,2119,2121,2123,2125],{"class":382,"line":411},[380,2114,2095],{"class":469},[380,2116,1307],{"class":576},[380,2118,1299],{"class":1298},[380,2120,1302],{"class":576},[380,2122,519],{"class":469},[380,2124,935],{"class":576},[380,2126,541],{"class":469},[351,2128,2129],{},"The bundle removes the file from storage and clears the media object data.",[363,2131,2133],{"id":2132},"on-the-front-end","On the Front-End",[351,2135,2136,2137,2140,2141,2144,2145,1091,2147,1091,2150,2153,2154,2157,2158,2161],{},"Use ",[354,2138,2139],{},"useCwaImageResource"," in your Vue component instead of ",[354,2142,2143],{},"useCwaResource",". It adds ",[354,2146,1424],{},[354,2148,2149],{},"displayMedia",[354,2151,2152],{},"loaded",", and ",[354,2155,2156],{},"handleLoad"," — see ",[2159,2160,285],"a",{"href":286}," for the full reference.",[2163,2164,2165],"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 .sRCss, html code.shiki .sRCss{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#FFCB6B}html pre.shiki code .sLL54, html code.shiki .sLL54{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#C3E88D}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 .s-h7I, html code.shiki .s-h7I{--shiki-light:#22863A;--shiki-default:#85E89D;--shiki-dark:#F07178}html pre.shiki code .sOvfz, html code.shiki .sOvfz{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#89DDFF}html pre.shiki code .seSrl, html code.shiki .seSrl{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#89DDFF}html pre.shiki code .stmX-, html code.shiki .stmX-{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F78C6C}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 .sVlFx, html code.shiki .sVlFx{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#89DDFF}html pre.shiki code .sbW4m, html code.shiki .sbW4m{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#FFCB6B}html pre.shiki code .sphPO, html code.shiki .sphPO{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#C792EA}html pre.shiki code .scSvc, html code.shiki .scSvc{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#F78C6C}html pre.shiki code .sadgS, html code.shiki .sadgS{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#F07178}html pre.shiki code .sErdZ, html code.shiki .sErdZ{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#916B53}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}html pre.shiki code .s0uA6, html code.shiki .s0uA6{--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:inherit}",{"title":376,"searchDepth":390,"depth":390,"links":2167},[2168,2169,2170,2174,2175,2177,2178,2179,2180],{"id":365,"depth":390,"text":366},{"id":555,"depth":390,"text":556},{"id":946,"depth":390,"text":947,"children":2171},[2172],{"id":1053,"depth":404,"text":2173},"urlGenerator values",{"id":1258,"depth":390,"text":1259},{"id":1333,"depth":390,"text":2176},"The _metadata Response",{"id":1599,"depth":390,"text":1600},{"id":1898,"depth":390,"text":1899},{"id":2075,"depth":390,"text":2076},{"id":2132,"depth":390,"text":2133},"Add file upload support to any component with Flysystem adapters and optional Imagine image processing.","md",null,{},{"title":96,"description":2181},"iqOi7ezU9FCD2e5LyJk1iJavq9ps3Ocah05Uauge4TM",[2188,2190],{"title":92,"path":93,"stem":94,"description":2189,"children":-1},"Add a draft\u002Fpublish workflow to any component so admins can edit content privately before making it live.",{"title":100,"path":101,"stem":102,"description":2191,"children":-1},"Automatically record created and modified timestamps on any component or page data entity.",1782241284218]