[{"data":1,"prerenderedAt":2208},["ShallowReactive",2],{"navigation":3,"\u002Fapi\u002Fcomponents\u002Fannotations\u002Fuploadable":358,"\u002Fapi\u002Fcomponents\u002Fannotations\u002Fuploadable-surround":2203},[4,14,36,69,140,341],{"title":5,"path":6,"stem":7,"children":8},"Introduction","\u002Fgetting-started","1.getting-started\u002F1.index",[9,10],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":15,"path":16,"stem":17,"children":18,"page":35},"Guides","\u002Fguides","2.guides",[19,23,27,31],{"title":20,"path":21,"stem":22},"Your First Layout","\u002Fguides\u002Fyour-first-layout","2.guides\u002F1.your-first-layout",{"title":24,"path":25,"stem":26},"Your First Page Template","\u002Fguides\u002Fyour-first-page-template","2.guides\u002F2.your-first-page-template",{"title":28,"path":29,"stem":30},"Your First Component","\u002Fguides\u002Fyour-first-component","2.guides\u002F3.your-first-component",{"title":32,"path":33,"stem":34},"Alternative UI Variants","\u002Fguides\u002Falternative-ui-variants","2.guides\u002F4.alternative-ui-variants",false,{"title":37,"path":38,"stem":39,"children":40,"page":35},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[41,45,49,53,57,61,65],{"title":42,"path":43,"stem":44},"How It All Works","\u002Fcore-concepts\u002Farchitecture","3.core-concepts\u002F1.architecture",{"title":46,"path":47,"stem":48},"The Data Model","\u002Fcore-concepts\u002Fthe-data-model","3.core-concepts\u002F2.the-data-model",{"title":50,"path":51,"stem":52},"Layouts & Pages","\u002Fcore-concepts\u002Flayouts-and-pages","3.core-concepts\u002F3.layouts-and-pages",{"title":54,"path":55,"stem":56},"Dynamic Pages","\u002Fcore-concepts\u002Fdynamic-pages","3.core-concepts\u002F4.dynamic-pages",{"title":58,"path":59,"stem":60},"Components","\u002Fcore-concepts\u002Fcomponents","3.core-concepts\u002F5.components",{"title":62,"path":63,"stem":64},"Draft & Publish Workflow","\u002Fcore-concepts\u002Fdraft-and-publish","3.core-concepts\u002F6.draft-and-publish",{"title":66,"path":67,"stem":68},"The Admin Panel","\u002Fcore-concepts\u002Fadmin-panel","3.core-concepts\u002F7.admin-panel",{"title":70,"path":71,"stem":72,"children":73,"page":35},"Api","\u002Fapi","4.api",[74,78,116,120,124,128,132,136],{"title":75,"path":76,"stem":77},"Bundle Setup","\u002Fapi\u002Fbundle-setup","4.api\u002F1.bundle-setup",{"title":58,"path":79,"stem":80,"children":81,"page":35},"\u002Fapi\u002Fcomponents","4.api\u002F2.components",[82,86,103],{"title":83,"path":84,"stem":85},"Creating Components","\u002Fapi\u002Fcomponents\u002Fcreating-components","4.api\u002F2.components\u002F1.creating-components",{"title":87,"path":88,"stem":89,"children":90,"page":35},"Annotations","\u002Fapi\u002Fcomponents\u002Fannotations","4.api\u002F2.components\u002F2.annotations",[91,95,99],{"title":92,"path":93,"stem":94},"Publishable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fpublishable","4.api\u002F2.components\u002F2.annotations\u002F1.publishable",{"title":96,"path":97,"stem":98},"Uploadable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fuploadable","4.api\u002F2.components\u002F2.annotations\u002F2.uploadable",{"title":100,"path":101,"stem":102},"Timestamped","\u002Fapi\u002Fcomponents\u002Fannotations\u002Ftimestamped","4.api\u002F2.components\u002F2.annotations\u002F3.timestamped",{"title":104,"path":105,"stem":106,"children":107,"page":35},"Built Ins","\u002Fapi\u002Fcomponents\u002Fbuilt-ins","4.api\u002F2.components\u002F3.built-ins",[108,112],{"title":109,"path":110,"stem":111},"Collection Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fcollection-component","4.api\u002F2.components\u002F3.built-ins\u002F1.collection-component",{"title":113,"path":114,"stem":115},"Form Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fform-component","4.api\u002F2.components\u002F3.built-ins\u002F2.form-component",{"title":117,"path":118,"stem":119},"Dynamic & Nested Pages","\u002Fapi\u002Fdynamic-pages","4.api\u002F3.dynamic-pages",{"title":121,"path":122,"stem":123},"Users & Security","\u002Fapi\u002Fusers-and-security","4.api\u002F4.users-and-security",{"title":125,"path":126,"stem":127},"Data Fixtures","\u002Fapi\u002Fdata-fixtures","4.api\u002F5.data-fixtures",{"title":129,"path":130,"stem":131},"Configuration Reference","\u002Fapi\u002Fconfiguration","4.api\u002F6.configuration",{"title":133,"path":134,"stem":135},"Console Commands","\u002Fapi\u002Fconsole-commands","4.api\u002F7.console-commands",{"title":137,"path":138,"stem":139},"Debugging & Profiler","\u002Fapi\u002Fdebugging","4.api\u002F8.debugging",{"title":141,"path":142,"stem":143,"children":144,"page":35},"Nuxt Module","\u002Fnuxt-module","5.nuxt-module",[145,149,162,182,207,211,295,320,324],{"title":146,"path":147,"stem":148},"Module Setup","\u002Fnuxt-module\u002Fmodule-setup","5.nuxt-module\u002F1.module-setup",{"title":150,"path":151,"stem":152,"children":153,"page":35},"Configuration","\u002Fnuxt-module\u002Fconfiguration","5.nuxt-module\u002F2.configuration",[154,158],{"title":155,"path":156,"stem":157},"Nuxt Config","\u002Fnuxt-module\u002Fconfiguration\u002Fnuxt-config","5.nuxt-module\u002F2.configuration\u002F1.nuxt-config",{"title":159,"path":160,"stem":161},"Site Config & SEO","\u002Fnuxt-module\u002Fconfiguration\u002Fsite-config-and-seo","5.nuxt-module\u002F2.configuration\u002F2.site-config-and-seo",{"title":163,"path":164,"stem":165,"children":166,"page":35},"Building Your Ui","\u002Fnuxt-module\u002Fbuilding-your-ui","5.nuxt-module\u002F3.building-your-ui",[167,171,175,178],{"title":168,"path":169,"stem":170},"Layouts","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-layouts","5.nuxt-module\u002F3.building-your-ui\u002F1.creating-layouts",{"title":172,"path":173,"stem":174},"Page Templates","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-page-templates","5.nuxt-module\u002F3.building-your-ui\u002F2.creating-page-templates",{"title":83,"path":176,"stem":177},"\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-components","5.nuxt-module\u002F3.building-your-ui\u002F3.creating-components",{"title":179,"path":180,"stem":181},"CLI Generator","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcwa-cli","5.nuxt-module\u002F3.building-your-ui\u002F4.cwa-cli",{"title":183,"path":184,"stem":185,"children":186,"page":35},"Cwa Components","\u002Fnuxt-module\u002Fcwa-components","5.nuxt-module\u002F4.cwa-components",[187,191,195,199,203],{"title":188,"path":189,"stem":190},"\u003CCwaComponentGroup \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-component-group","5.nuxt-module\u002F4.cwa-components\u002F1.cwa-component-group",{"title":192,"path":193,"stem":194},"\u003CCwaPage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-page","5.nuxt-module\u002F4.cwa-components\u002F2.cwa-page",{"title":196,"path":197,"stem":198},"\u003CCwaLink \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-link","5.nuxt-module\u002F4.cwa-components\u002F3.cwa-link",{"title":200,"path":201,"stem":202},"\u003CCwaImage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-image","5.nuxt-module\u002F4.cwa-components\u002F4.cwa-image",{"title":204,"path":205,"stem":206},"\u003CCwaDefaultLayout \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-default-layout","5.nuxt-module\u002F4.cwa-components\u002F5.cwa-default-layout",{"title":208,"path":209,"stem":210},"The useCwa() API","\u002Fnuxt-module\u002Fcwa-api","5.nuxt-module\u002F5.cwa-api",{"title":212,"path":213,"stem":214,"children":215,"page":35},"Composables","\u002Fnuxt-module\u002Fcomposables","5.nuxt-module\u002F6.composables",[216,224,261,278],{"title":217,"path":218,"stem":219,"children":220,"page":35},"Layout","\u002Fnuxt-module\u002Fcomposables\u002Flayout","5.nuxt-module\u002F6.composables\u002F0.layout",[221],{"title":217,"path":222,"stem":223},"\u002Fnuxt-module\u002Fcomposables\u002Flayout\u002Fuse-cwa-layout","5.nuxt-module\u002F6.composables\u002F0.layout\u002F1.use-cwa-layout",{"title":225,"path":226,"stem":227,"children":228,"page":35},"Component","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent","5.nuxt-module\u002F6.composables\u002F1.component",[229,233,237,241,245,249,253,257],{"title":230,"path":231,"stem":232},"Component (recommended)","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-component","5.nuxt-module\u002F6.composables\u002F1.component\u002F0.use-cwa-component",{"title":234,"path":235,"stem":236},"Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F1.use-cwa-resource",{"title":238,"path":239,"stem":240},"Collection Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-collection-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F2.use-cwa-collection-resource",{"title":242,"path":243,"stem":244},"Image Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-image-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F3.use-cwa-image-resource",{"title":246,"path":247,"stem":248},"Form","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form","5.nuxt-module\u002F6.composables\u002F1.component\u002F4.use-cwa-form",{"title":250,"path":251,"stem":252},"Form Input","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-input","5.nuxt-module\u002F6.composables\u002F1.component\u002F5.use-cwa-form-input",{"title":254,"path":255,"stem":256},"Form Repeated","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-repeated","5.nuxt-module\u002F6.composables\u002F1.component\u002F6.use-cwa-form-repeated",{"title":258,"path":259,"stem":260},"Form Collection","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-collection","5.nuxt-module\u002F6.composables\u002F1.component\u002F7.use-cwa-form-collection",{"title":262,"path":263,"stem":264,"children":265,"page":35},"Admin Manager","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager","5.nuxt-module\u002F6.composables\u002F2.admin-manager",[266,270,274],{"title":267,"path":268,"stem":269},"Manager Tab","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-manager-tab","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F1.use-cwa-resource-manager-tab",{"title":271,"path":272,"stem":273},"Resource Model","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-model","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F2.use-cwa-resource-model",{"title":275,"path":276,"stem":277},"Resource Upload","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-upload","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F3.use-cwa-resource-upload",{"title":279,"path":280,"stem":281,"children":282,"page":35},"Utilities","\u002Fnuxt-module\u002Fcomposables\u002Futilities","5.nuxt-module\u002F6.composables\u002F3.utilities",[283,287,291],{"title":284,"path":285,"stem":286},"Resource Endpoint","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-endpoint","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F1.use-cwa-resource-endpoint",{"title":288,"path":289,"stem":290},"Query Model","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-query-bound-model","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F2.use-query-bound-model",{"title":292,"path":293,"stem":294},"Resource Route","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-route","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F3.use-cwa-resource-route",{"title":296,"path":297,"stem":298,"children":299,"page":35},"Component Helpers","\u002Fnuxt-module\u002Fcomponent-helpers","5.nuxt-module\u002F7.component-helpers",[300,304,308,312,316],{"title":301,"path":302,"stem":303},"Images & Media","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fimages-and-uploads","5.nuxt-module\u002F7.component-helpers\u002F1.images-and-uploads",{"title":305,"path":306,"stem":307},"Collections & Pagination","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fcollections-and-pagination","5.nuxt-module\u002F7.component-helpers\u002F2.collections-and-pagination",{"title":309,"path":310,"stem":311},"HTML Content","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fhtml-content","5.nuxt-module\u002F7.component-helpers\u002F3.html-content",{"title":313,"path":314,"stem":315},"Real-Time Updates","\u002Fnuxt-module\u002Fcomponent-helpers\u002Freal-time-updates","5.nuxt-module\u002F7.component-helpers\u002F4.real-time-updates",{"title":317,"path":318,"stem":319},"Forms","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fforms","5.nuxt-module\u002F7.component-helpers\u002F5.forms",{"title":321,"path":322,"stem":323},"Authentication","\u002Fnuxt-module\u002Fauthentication","5.nuxt-module\u002F8.authentication",{"title":325,"path":326,"stem":327,"children":328,"page":35},"Cwa Layer","\u002Fnuxt-module\u002Fcwa-layer","5.nuxt-module\u002F9.cwa-layer",[329,333,337],{"title":330,"path":331,"stem":332},"Overview","\u002Fnuxt-module\u002Fcwa-layer\u002Foverview","5.nuxt-module\u002F9.cwa-layer\u002F1.overview",{"title":334,"path":335,"stem":336},"Auth Pages","\u002Fnuxt-module\u002Fcwa-layer\u002Fauth-pages","5.nuxt-module\u002F9.cwa-layer\u002F2.auth-pages",{"title":338,"path":339,"stem":340},"Admin Panel","\u002Fnuxt-module\u002Fcwa-layer\u002Fadmin-panel","5.nuxt-module\u002F9.cwa-layer\u002F3.admin-panel",{"title":342,"path":343,"stem":344,"children":345,"page":35},"Deployment","\u002Fdeployment","6.deployment",[346,350,354],{"title":347,"path":348,"stem":349},"Docker","\u002Fdeployment\u002Fdocker","6.deployment\u002F1.docker",{"title":351,"path":352,"stem":353},"Kubernetes & Helm","\u002Fdeployment\u002Fkubernetes","6.deployment\u002F2.kubernetes",{"title":355,"path":356,"stem":357},"CI\u002FCD","\u002Fdeployment\u002Fci-cd","6.deployment\u002F3.ci-cd",{"id":359,"title":96,"badge":360,"body":363,"description":2197,"extension":2198,"links":2199,"meta":2200,"navigation":423,"path":97,"seo":2201,"stem":98,"__hash__":2202},"docs\u002F4.api\u002F2.components\u002F2.annotations\u002F2.uploadable.md",{"label":361,"color":362},"Draft","amber",{"type":364,"value":365,"toc":2182},"minimark",[366,378,383,386,462,465,558,569,573,960,964,1066,1073,1137,1272,1276,1282,1334,1339,1347,1354,1361,1607,1613,1617,1620,1623,1637,1785,1788,1905,1912,1916,1922,2080,2089,2093,2099,2143,2146,2150,2178],[367,368,369,373,374,377],"p",{},[370,371,372],"code",{},"#[Silverback\\Uploadable]"," with ",[370,375,376],{},"#[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.).",[379,380,382],"h2",{"id":381},"flysystem-setup","Flysystem Setup",[367,384,385],{},"First, install a Flysystem adapter:",[387,388,393],"pre",{"className":389,"code":390,"language":391,"meta":392,"style":392},"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","",[370,394,395,404,418,425,431,441,446,452],{"__ignoreMap":392},[396,397,400],"span",{"class":398,"line":399},"line",1,[396,401,403],{"class":402},"sTBSN","# Local filesystem\n",[396,405,407,411,415],{"class":398,"line":406},2,[396,408,410],{"class":409},"sRCss","composer",[396,412,414],{"class":413},"sLL54"," require",[396,416,417],{"class":413}," league\u002Fflysystem-local\n",[396,419,421],{"class":398,"line":420},3,[396,422,424],{"emptyLinePlaceholder":423},true,"\n",[396,426,428],{"class":398,"line":427},4,[396,429,430],{"class":402},"# Google Cloud Storage\n",[396,432,434,436,438],{"class":398,"line":433},5,[396,435,410],{"class":409},[396,437,414],{"class":413},[396,439,440],{"class":413}," league\u002Fflysystem-google-cloud-storage\n",[396,442,444],{"class":398,"line":443},6,[396,445,424],{"emptyLinePlaceholder":423},[396,447,449],{"class":398,"line":448},7,[396,450,451],{"class":402},"# S3-compatible\n",[396,453,455,457,459],{"class":398,"line":454},8,[396,456,410],{"class":409},[396,458,414],{"class":413},[396,460,461],{"class":413}," league\u002Fflysystem-aws-s3-v3\n",[367,463,464],{},"Register the adapter as a service with the CWA tag:",[387,466,470],{"className":467,"code":468,"language":469,"meta":392,"style":392},"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",[370,471,472,477,487,494,501,516,523],{"__ignoreMap":392},[396,473,474],{"class":398,"line":399},[396,475,476],{"class":402},"# config\u002Fservices.yaml\n",[396,478,479,483],{"class":398,"line":406},[396,480,482],{"class":481},"s-h7I","services",[396,484,486],{"class":485},"sOvfz",":\n",[396,488,489,492],{"class":398,"line":420},[396,490,491],{"class":481},"    League\\Flysystem\\Local\\LocalFilesystemAdapter",[396,493,486],{"class":485},[396,495,496,499],{"class":398,"line":427},[396,497,498],{"class":481},"        arguments",[396,500,486],{"class":485},[396,502,503,506,510,513],{"class":398,"line":433},[396,504,505],{"class":485},"            -",[396,507,509],{"class":508},"seSrl"," '",[396,511,512],{"class":413},"%kernel.project_dir%\u002Fvar\u002Fstorage\u002Fdefault",[396,514,515],{"class":508},"'\n",[396,517,518,521],{"class":398,"line":443},[396,519,520],{"class":481},"        tags",[396,522,486],{"class":485},[396,524,525,527,530,533,536,539,542,545,547,549,552,555],{"class":398,"line":448},[396,526,505],{"class":485},[396,528,529],{"class":485}," {",[396,531,532],{"class":481}," name",[396,534,535],{"class":485},":",[396,537,538],{"class":413}," silverback.api_components.filesystem_provider",[396,540,541],{"class":485},",",[396,543,544],{"class":481}," alias",[396,546,535],{"class":485},[396,548,509],{"class":508},[396,550,551],{"class":413},"local",[396,553,554],{"class":508},"'",[396,556,557],{"class":485}," }\n",[367,559,560,561,564,565,568],{},"The ",[370,562,563],{},"alias"," becomes the adapter name you use in ",[370,566,567],{},"#[UploadableField]",".",[379,570,572],{"id":571},"add-to-your-entity","Add to Your Entity",[387,574,578],{"className":575,"code":576,"language":577,"meta":392,"style":392},"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",[370,579,580,610,637,663,690,717,721,737,749,763,787,803,809,820,830,835,897,927,954],{"__ignoreMap":392},[396,581,582,586,590,594,597,599,602,605,607],{"class":398,"line":399},[396,583,585],{"class":584},"stmX-","use",[396,587,589],{"class":588},"sc2zw"," Silverback",[396,591,593],{"class":592},"sBtbT","\\",[396,595,596],{"class":588},"ApiComponentsBundle",[396,598,593],{"class":592},[396,600,601],{"class":588},"Annotation",[396,603,604],{"class":584}," as",[396,606,589],{"class":409},[396,608,609],{"class":485},";\n",[396,611,612,614,616,618,620,622,625,627,630,632,635],{"class":398,"line":406},[396,613,585],{"class":584},[396,615,589],{"class":588},[396,617,593],{"class":592},[396,619,596],{"class":588},[396,621,593],{"class":592},[396,623,624],{"class":588},"Entity",[396,626,593],{"class":592},[396,628,629],{"class":588},"Core",[396,631,593],{"class":592},[396,633,634],{"class":588},"AbstractComponent",[396,636,609],{"class":485},[396,638,639,641,643,645,647,649,651,653,656,658,661],{"class":398,"line":420},[396,640,585],{"class":584},[396,642,589],{"class":588},[396,644,593],{"class":592},[396,646,596],{"class":588},[396,648,593],{"class":592},[396,650,624],{"class":588},[396,652,593],{"class":592},[396,654,655],{"class":588},"Utility",[396,657,593],{"class":592},[396,659,660],{"class":588},"UploadableTrait",[396,662,609],{"class":485},[396,664,665,667,670,672,674,676,679,681,684,686,688],{"class":398,"line":427},[396,666,585],{"class":584},[396,668,669],{"class":588}," Symfony",[396,671,593],{"class":592},[396,673,225],{"class":588},[396,675,593],{"class":592},[396,677,678],{"class":588},"HttpFoundation",[396,680,593],{"class":592},[396,682,683],{"class":588},"File",[396,685,593],{"class":592},[396,687,683],{"class":588},[396,689,609],{"class":485},[396,691,692,694,696,698,700,702,705,707,710,712,715],{"class":398,"line":433},[396,693,585],{"class":584},[396,695,669],{"class":588},[396,697,593],{"class":592},[396,699,225],{"class":588},[396,701,593],{"class":592},[396,703,704],{"class":588},"Validator",[396,706,593],{"class":592},[396,708,709],{"class":588},"Constraints",[396,711,604],{"class":584},[396,713,714],{"class":409}," Assert",[396,716,609],{"class":485},[396,718,719],{"class":398,"line":443},[396,720,424],{"emptyLinePlaceholder":423},[396,722,723,727,730,732,734],{"class":398,"line":448},[396,724,726],{"class":725},"sPB8G","#[",[396,728,729],{"class":588},"Silverback",[396,731,593],{"class":592},[396,733,92],{"class":588},[396,735,736],{"class":725},"]\n",[396,738,739,741,743,745,747],{"class":398,"line":454},[396,740,726],{"class":725},[396,742,729],{"class":588},[396,744,593],{"class":592},[396,746,96],{"class":588},[396,748,736],{"class":725},[396,750,752,754,757,759,761],{"class":398,"line":751},9,[396,753,726],{"class":725},[396,755,756],{"class":588},"ORM",[396,758,593],{"class":592},[396,760,624],{"class":588},[396,762,736],{"class":725},[396,764,766,768,771,774,777,779,782,785],{"class":398,"line":765},10,[396,767,726],{"class":725},[396,769,770],{"class":588},"ApiResource",[396,772,773],{"class":485},"(",[396,775,776],{"class":409},"mercure",[396,778,535],{"class":485},[396,780,781],{"class":592}," true",[396,783,784],{"class":485},")",[396,786,736],{"class":725},[396,788,790,794,797,800],{"class":398,"line":789},11,[396,791,793],{"class":792},"swB56","class",[396,795,796],{"class":409}," Image",[396,798,799],{"class":792}," extends",[396,801,802],{"class":409}," AbstractComponent\n",[396,804,806],{"class":398,"line":805},12,[396,807,808],{"class":485},"{\n",[396,810,812,815,818],{"class":398,"line":811},13,[396,813,814],{"class":584},"    use",[396,816,817],{"class":588}," PublishableTrait",[396,819,609],{"class":485},[396,821,823,825,828],{"class":398,"line":822},14,[396,824,814],{"class":584},[396,826,827],{"class":588}," UploadableTrait",[396,829,609],{"class":485},[396,831,833],{"class":398,"line":832},15,[396,834,424],{"emptyLinePlaceholder":423},[396,836,838,841,843,845,848,850,853,855,857,859,861,863,866,868,870,873,875,877,880,882,885,887,890,892,895],{"class":398,"line":837},16,[396,839,840],{"class":725},"    #[",[396,842,729],{"class":588},[396,844,593],{"class":592},[396,846,847],{"class":588},"UploadableField",[396,849,773],{"class":485},[396,851,852],{"class":409},"adapter",[396,854,535],{"class":485},[396,856,509],{"class":508},[396,858,551],{"class":413},[396,860,554],{"class":508},[396,862,541],{"class":485},[396,864,865],{"class":409}," urlGenerator",[396,867,535],{"class":485},[396,869,509],{"class":508},[396,871,872],{"class":413},"public",[396,874,554],{"class":508},[396,876,541],{"class":485},[396,878,879],{"class":409}," imagineFilters",[396,881,535],{"class":485},[396,883,884],{"class":485}," [",[396,886,554],{"class":508},[396,888,889],{"class":413},"thumbnail",[396,891,554],{"class":508},[396,893,894],{"class":485},"])",[396,896,736],{"class":725},[396,898,900,902,905,907,909,911,914,916,918,921,923,925],{"class":398,"line":899},17,[396,901,840],{"class":725},[396,903,904],{"class":588},"Assert",[396,906,593],{"class":592},[396,908,683],{"class":588},[396,910,773],{"class":485},[396,912,913],{"class":409},"maxSize",[396,915,535],{"class":485},[396,917,509],{"class":508},[396,919,920],{"class":413},"5M",[396,922,554],{"class":508},[396,924,784],{"class":485},[396,926,736],{"class":725},[396,928,930,933,937,940,943,946,949,952],{"class":398,"line":929},18,[396,931,932],{"class":792},"    public",[396,934,936],{"class":935},"sVlFx"," ?",[396,938,683],{"class":939},"sbW4m",[396,941,942],{"class":485}," $",[396,944,945],{"class":725},"file ",[396,947,948],{"class":935},"=",[396,950,951],{"class":592}," null",[396,953,609],{"class":485},[396,955,957],{"class":398,"line":956},19,[396,958,959],{"class":485},"}\n",[379,961,963],{"id":962},"uploadablefield-parameters","UploadableField Parameters",[965,966,967,983],"table",{},[968,969,970],"thead",{},[971,972,973,977,980],"tr",{},[974,975,976],"th",{},"Parameter",[974,978,979],{},"Default",[974,981,982],{},"Description",[984,985,986,1003,1018,1033,1051],"tbody",{},[971,987,988,993,996],{},[989,990,991],"td",{},[370,992,852],{},[989,994,995],{},"—",[989,997,998,1002],{},[999,1000,1001],"strong",{},"Required."," The Flysystem adapter alias",[971,1004,1005,1010,1015],{},[989,1006,1007],{},[370,1008,1009],{},"urlGenerator",[989,1011,1012],{},[370,1013,1014],{},"'api'",[989,1016,1017],{},"How to generate the file URL — see below",[971,1019,1020,1025,1030],{},[989,1021,1022],{},[370,1023,1024],{},"property",[989,1026,1027],{},[370,1028,1029],{},"'filename'",[989,1031,1032],{},"The property name on the media object that stores the filename",[971,1034,1035,1040,1045],{},[989,1036,1037],{},[370,1038,1039],{},"prefix",[989,1041,1042],{},[370,1043,1044],{},"null",[989,1046,1047,1048,784],{},"Optional path prefix inside the storage (e.g. ",[370,1049,1050],{},"'images\u002F'",[971,1052,1053,1058,1063],{},[989,1054,1055],{},[370,1056,1057],{},"imagineFilters",[989,1059,1060],{},[370,1061,1062],{},"[]",[989,1064,1065],{},"LiipImagine filter names to apply at upload time",[1067,1068,1070,1072],"h3",{"id":1069},"urlgenerator-values",[370,1071,1009],{}," values",[1074,1075,1076,1088,1115],"ul",{},[1077,1078,1079,1083,1084,1087],"li",{},[999,1080,1081],{},[370,1082,1014],{}," (default) — the file URL is served through a Symfony download route (",[370,1085,1086],{},"\u002F_\u002Fmedia_objects\u002F{id}\u002Fdownload","). Works with any adapter regardless of whether it supports direct URL generation.",[1077,1089,1090,1095,1096,1099,1100,1103,1104,1107,1108,1111,1112,1114],{},[999,1091,1092],{},[370,1093,1094],{},"'public'"," — calls Flysystem's ",[370,1097,1098],{},"publicUrl()"," method to return a direct CDN or storage URL. Requires the adapter to implement Flysystem's ",[370,1101,1102],{},"PublicUrlGenerator"," interface (e.g. ",[370,1105,1106],{},"league\u002Fflysystem-aws-s3-v3",", ",[370,1109,1110],{},"league\u002Fflysystem-google-cloud-storage","). Falls back to ",[370,1113,1014],{}," if the adapter does not support it.",[1077,1116,1117,1095,1122,1125,1126,1129,1130,1133,1134,1136],{},[999,1118,1119],{},[370,1120,1121],{},"'temporary'",[370,1123,1124],{},"temporaryUrl()"," method to return a pre-signed URL with an expiry (default: ",[370,1127,1128],{},"+3 days","). Requires the adapter to implement Flysystem's ",[370,1131,1132],{},"TemporaryUrlGenerator"," interface. Falls back to ",[370,1135,1014],{}," if not supported. The primary use case is S3 pre-signed URLs for private\u002Faccess-controlled files.",[387,1138,1140],{"className":575,"code":1139,"language":577,"meta":392,"style":392},"\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",[370,1141,1142,1147,1187,1205,1209,1214,1253],{"__ignoreMap":392},[396,1143,1144],{"class":398,"line":399},[396,1145,1146],{"class":402},"\u002F\u002F S3 pre-signed URL — valid for 3 days, falls back to API route if adapter doesn't support it\n",[396,1148,1149,1151,1153,1155,1157,1159,1161,1163,1165,1168,1170,1172,1174,1176,1178,1181,1183,1185],{"class":398,"line":406},[396,1150,726],{"class":725},[396,1152,729],{"class":588},[396,1154,593],{"class":592},[396,1156,847],{"class":588},[396,1158,773],{"class":485},[396,1160,852],{"class":409},[396,1162,535],{"class":485},[396,1164,509],{"class":508},[396,1166,1167],{"class":413},"s3",[396,1169,554],{"class":508},[396,1171,541],{"class":485},[396,1173,865],{"class":409},[396,1175,535],{"class":485},[396,1177,509],{"class":508},[396,1179,1180],{"class":413},"temporary",[396,1182,554],{"class":508},[396,1184,784],{"class":485},[396,1186,736],{"class":725},[396,1188,1189,1191,1193,1195,1197,1199,1201,1203],{"class":398,"line":420},[396,1190,872],{"class":792},[396,1192,936],{"class":935},[396,1194,683],{"class":939},[396,1196,942],{"class":485},[396,1198,945],{"class":725},[396,1200,948],{"class":935},[396,1202,951],{"class":592},[396,1204,609],{"class":485},[396,1206,1207],{"class":398,"line":427},[396,1208,424],{"emptyLinePlaceholder":423},[396,1210,1211],{"class":398,"line":433},[396,1212,1213],{"class":402},"\u002F\u002F CDN public URL — direct S3\u002FGCS link\n",[396,1215,1216,1218,1220,1222,1224,1226,1228,1230,1232,1235,1237,1239,1241,1243,1245,1247,1249,1251],{"class":398,"line":443},[396,1217,726],{"class":725},[396,1219,729],{"class":588},[396,1221,593],{"class":592},[396,1223,847],{"class":588},[396,1225,773],{"class":485},[396,1227,852],{"class":409},[396,1229,535],{"class":485},[396,1231,509],{"class":508},[396,1233,1234],{"class":413},"gcs",[396,1236,554],{"class":508},[396,1238,541],{"class":485},[396,1240,865],{"class":409},[396,1242,535],{"class":485},[396,1244,509],{"class":508},[396,1246,872],{"class":413},[396,1248,554],{"class":508},[396,1250,784],{"class":485},[396,1252,736],{"class":725},[396,1254,1255,1257,1259,1261,1263,1266,1268,1270],{"class":398,"line":448},[396,1256,872],{"class":792},[396,1258,936],{"class":935},[396,1260,683],{"class":939},[396,1262,942],{"class":485},[396,1264,1265],{"class":725},"image ",[396,1267,948],{"class":935},[396,1269,951],{"class":592},[396,1271,609],{"class":485},[379,1273,1275],{"id":1274},"uploading-a-file","Uploading a File",[367,1277,1278,1281],{},[999,1279,1280],{},"Option 1 — Base64 in the JSON body"," (preferred for REST clients):",[387,1283,1287],{"className":1284,"code":1285,"language":1286,"meta":392,"style":392},"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",[370,1288,1289,1294,1299,1303,1307,1330],{"__ignoreMap":392},[396,1290,1291],{"class":398,"line":399},[396,1292,1293],{"class":725},"POST \u002Fcomponent\u002Fimages\n",[396,1295,1296],{"class":398,"line":406},[396,1297,1298],{"class":725},"Content-Type: application\u002Fjson\n",[396,1300,1301],{"class":398,"line":420},[396,1302,424],{"emptyLinePlaceholder":423},[396,1304,1305],{"class":398,"line":427},[396,1306,808],{"class":485},[396,1308,1309,1312,1316,1319,1321,1324,1327],{"class":398,"line":433},[396,1310,1311],{"class":592},"    \"",[396,1313,1315],{"class":1314},"sphPO","file",[396,1317,1318],{"class":592},"\"",[396,1320,535],{"class":485},[396,1322,1323],{"class":508}," \"",[396,1325,1326],{"class":413},"data:image\u002Fjpeg;base64,\u002F9j\u002F4AAQSkZJRgAB...",[396,1328,1329],{"class":508},"\"\n",[396,1331,1332],{"class":398,"line":443},[396,1333,959],{"class":485},[367,1335,1336,535],{},[999,1337,1338],{},"Option 2 — Multipart form upload",[387,1340,1345],{"className":1341,"code":1343,"language":1344},[1342],"language-text","POST \u002Fcomponent\u002Fimages\u002F{id}\u002Fupload\nContent-Type: multipart\u002Fform-data\n\nfile=\u003Cbinary>\n","text",[370,1346,1343],{"__ignoreMap":392},[379,1348,560,1350,1353],{"id":1349},"the-_metadata-response",[370,1351,1352],{},"_metadata"," Response",[367,1355,1356,1357,1360],{},"After upload, the resource includes a ",[370,1358,1359],{},"_metadata.mediaObjects"," map:",[387,1362,1364],{"className":1284,"code":1363,"language":1286,"meta":392,"style":392},"{\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",[370,1365,1366,1370,1391,1404,1418,1432,1454,1470,1490,1506,1522,1534,1555,1570,1583,1588,1593,1598,1603],{"__ignoreMap":392},[396,1367,1368],{"class":398,"line":399},[396,1369,808],{"class":485},[396,1371,1372,1374,1377,1379,1381,1383,1386,1388],{"class":398,"line":406},[396,1373,1311],{"class":592},[396,1375,1376],{"class":1314},"@id",[396,1378,1318],{"class":592},[396,1380,535],{"class":485},[396,1382,1323],{"class":508},[396,1384,1385],{"class":413},"\u002Fcomponent\u002Fimages\u002F018e-...",[396,1387,1318],{"class":508},[396,1389,1390],{"class":485},",\n",[396,1392,1393,1395,1397,1399,1401],{"class":398,"line":420},[396,1394,1311],{"class":592},[396,1396,1352],{"class":1314},[396,1398,1318],{"class":592},[396,1400,535],{"class":485},[396,1402,1403],{"class":485}," {\n",[396,1405,1406,1409,1412,1414,1416],{"class":398,"line":427},[396,1407,1408],{"class":592},"        \"",[396,1410,1411],{"class":939},"mediaObjects",[396,1413,1318],{"class":592},[396,1415,535],{"class":485},[396,1417,1403],{"class":485},[396,1419,1420,1423,1426,1428,1430],{"class":398,"line":433},[396,1421,1422],{"class":592},"            \"",[396,1424,1315],{"class":1425},"scSvc",[396,1427,1318],{"class":592},[396,1429,535],{"class":485},[396,1431,1403],{"class":485},[396,1433,1434,1437,1441,1443,1445,1447,1450,1452],{"class":398,"line":443},[396,1435,1436],{"class":592},"                \"",[396,1438,1440],{"class":1439},"sadgS","contentUrl",[396,1442,1318],{"class":592},[396,1444,535],{"class":485},[396,1446,1323],{"class":508},[396,1448,1449],{"class":413},"https:\u002F\u002Fcdn.example.com\u002Fimages\u002F018e-....jpg",[396,1451,1318],{"class":508},[396,1453,1390],{"class":485},[396,1455,1456,1458,1461,1463,1465,1468],{"class":398,"line":448},[396,1457,1436],{"class":592},[396,1459,1460],{"class":1439},"fileSize",[396,1462,1318],{"class":592},[396,1464,535],{"class":485},[396,1466,1467],{"class":1425}," 245120",[396,1469,1390],{"class":485},[396,1471,1472,1474,1477,1479,1481,1483,1486,1488],{"class":398,"line":454},[396,1473,1436],{"class":592},[396,1475,1476],{"class":1439},"mimeType",[396,1478,1318],{"class":592},[396,1480,535],{"class":485},[396,1482,1323],{"class":508},[396,1484,1485],{"class":413},"image\u002Fjpeg",[396,1487,1318],{"class":508},[396,1489,1390],{"class":485},[396,1491,1492,1494,1497,1499,1501,1504],{"class":398,"line":751},[396,1493,1436],{"class":592},[396,1495,1496],{"class":1439},"width",[396,1498,1318],{"class":592},[396,1500,535],{"class":485},[396,1502,1503],{"class":1425}," 1920",[396,1505,1390],{"class":485},[396,1507,1508,1510,1513,1515,1517,1520],{"class":398,"line":765},[396,1509,1436],{"class":592},[396,1511,1512],{"class":1439},"height",[396,1514,1318],{"class":592},[396,1516,535],{"class":485},[396,1518,1519],{"class":1425}," 1080",[396,1521,1390],{"class":485},[396,1523,1524,1526,1528,1530,1532],{"class":398,"line":789},[396,1525,1436],{"class":592},[396,1527,889],{"class":1439},[396,1529,1318],{"class":592},[396,1531,535],{"class":485},[396,1533,1403],{"class":485},[396,1535,1536,1539,1542,1544,1546,1548,1551,1553],{"class":398,"line":805},[396,1537,1538],{"class":592},"                    \"",[396,1540,1440],{"class":1541},"sErdZ",[396,1543,1318],{"class":592},[396,1545,535],{"class":485},[396,1547,1323],{"class":508},[396,1549,1550],{"class":413},"https:\u002F\u002Fcdn.example.com\u002Fimages\u002F018e-...thumbnail.jpg",[396,1552,1318],{"class":508},[396,1554,1390],{"class":485},[396,1556,1557,1559,1561,1563,1565,1568],{"class":398,"line":811},[396,1558,1538],{"class":592},[396,1560,1496],{"class":1541},[396,1562,1318],{"class":592},[396,1564,535],{"class":485},[396,1566,1567],{"class":1425}," 300",[396,1569,1390],{"class":485},[396,1571,1572,1574,1576,1578,1580],{"class":398,"line":822},[396,1573,1538],{"class":592},[396,1575,1512],{"class":1541},[396,1577,1318],{"class":592},[396,1579,535],{"class":485},[396,1581,1582],{"class":1425}," 200\n",[396,1584,1585],{"class":398,"line":832},[396,1586,1587],{"class":485},"                }\n",[396,1589,1590],{"class":398,"line":837},[396,1591,1592],{"class":485},"            }\n",[396,1594,1595],{"class":398,"line":899},[396,1596,1597],{"class":485},"        }\n",[396,1599,1600],{"class":398,"line":929},[396,1601,1602],{"class":485},"    }\n",[396,1604,1605],{"class":398,"line":956},[396,1606,959],{"class":485},[367,1608,1609,1610,1612],{},"Each entry under the field name (",[370,1611,1315],{},") contains the original upload plus any Imagine variants as nested objects.",[379,1614,1616],{"id":1615},"liipimaginebundle-integration","LiipImagineBundle Integration",[367,1618,1619],{},"LiipImagine generates image variants automatically at upload time.",[367,1621,1622],{},"Install the bundle and configure it to use CWA's Flysystem data loader:",[387,1624,1626],{"className":389,"code":1625,"language":391,"meta":392,"style":392},"composer require liip\u002Fimagine-bundle\n",[370,1627,1628],{"__ignoreMap":392},[396,1629,1630,1632,1634],{"class":398,"line":399},[396,1631,410],{"class":409},[396,1633,414],{"class":413},[396,1635,1636],{"class":413}," liip\u002Fimagine-bundle\n",[387,1638,1640],{"className":467,"code":1639,"language":469,"meta":392,"style":392},"# 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",[370,1641,1642,1647,1654,1664,1671,1678,1688,1695,1731,1738,1747,1753],{"__ignoreMap":392},[396,1643,1644],{"class":398,"line":399},[396,1645,1646],{"class":402},"# config\u002Fpackages\u002Fliip_imagine.yaml\n",[396,1648,1649,1652],{"class":398,"line":406},[396,1650,1651],{"class":481},"liip_imagine",[396,1653,486],{"class":485},[396,1655,1656,1659,1661],{"class":398,"line":420},[396,1657,1658],{"class":481},"    data_loader",[396,1660,535],{"class":485},[396,1662,1663],{"class":413}," silverback.api_components.liip_imagine.binary.loader\n",[396,1665,1666,1669],{"class":398,"line":427},[396,1667,1668],{"class":481},"    filter_sets",[396,1670,486],{"class":485},[396,1672,1673,1676],{"class":398,"line":433},[396,1674,1675],{"class":481},"        thumbnail",[396,1677,486],{"class":485},[396,1679,1680,1683,1685],{"class":398,"line":443},[396,1681,1682],{"class":481},"            quality",[396,1684,535],{"class":485},[396,1686,1687],{"class":1425}," 80\n",[396,1689,1690,1693],{"class":398,"line":448},[396,1691,1692],{"class":481},"            filters",[396,1694,486],{"class":485},[396,1696,1697,1700,1702,1704,1707,1709,1711,1714,1716,1718,1721,1724,1726,1729],{"class":398,"line":454},[396,1698,1699],{"class":481},"                thumbnail",[396,1701,535],{"class":485},[396,1703,529],{"class":485},[396,1705,1706],{"class":481}," size",[396,1708,535],{"class":485},[396,1710,884],{"class":485},[396,1712,1713],{"class":1425},"300",[396,1715,541],{"class":485},[396,1717,1567],{"class":1425},[396,1719,1720],{"class":485},"],",[396,1722,1723],{"class":481}," mode",[396,1725,535],{"class":485},[396,1727,1728],{"class":413}," outbound",[396,1730,557],{"class":485},[396,1732,1733,1736],{"class":398,"line":751},[396,1734,1735],{"class":481},"        hero",[396,1737,486],{"class":485},[396,1739,1740,1742,1744],{"class":398,"line":765},[396,1741,1682],{"class":481},[396,1743,535],{"class":485},[396,1745,1746],{"class":1425}," 90\n",[396,1748,1749,1751],{"class":398,"line":789},[396,1750,1692],{"class":481},[396,1752,486],{"class":485},[396,1754,1755,1757,1759,1761,1763,1765,1767,1770,1772,1775,1777,1779,1781,1783],{"class":398,"line":805},[396,1756,1699],{"class":481},[396,1758,535],{"class":485},[396,1760,529],{"class":485},[396,1762,1706],{"class":481},[396,1764,535],{"class":485},[396,1766,884],{"class":485},[396,1768,1769],{"class":1425},"1200",[396,1771,541],{"class":485},[396,1773,1774],{"class":1425}," 630",[396,1776,1720],{"class":485},[396,1778,1723],{"class":481},[396,1780,535],{"class":485},[396,1782,1728],{"class":413},[396,1784,557],{"class":485},[367,1786,1787],{},"Configure the cache resolver to write back through Flysystem:",[387,1789,1791],{"className":467,"code":1790,"language":469,"meta":392,"style":392},"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",[370,1792,1793,1799,1806,1816,1822,1836,1850,1856,1885,1889,1895],{"__ignoreMap":392},[396,1794,1795,1797],{"class":398,"line":399},[396,1796,482],{"class":481},[396,1798,486],{"class":485},[396,1800,1801,1804],{"class":398,"line":406},[396,1802,1803],{"class":481},"    app.imagine.cache.resolver.local",[396,1805,486],{"class":485},[396,1807,1808,1811,1813],{"class":398,"line":420},[396,1809,1810],{"class":481},"        class",[396,1812,535],{"class":485},[396,1814,1815],{"class":413}," Silverback\\ApiComponentsBundle\\Imagine\\FlysystemCacheResolver\n",[396,1817,1818,1820],{"class":398,"line":427},[396,1819,498],{"class":481},[396,1821,486],{"class":485},[396,1823,1824,1827,1829,1831,1834],{"class":398,"line":433},[396,1825,1826],{"class":481},"            $filesystem",[396,1828,535],{"class":485},[396,1830,509],{"class":508},[396,1832,1833],{"class":413},"@api_components.filesystem.local",[396,1835,515],{"class":508},[396,1837,1838,1841,1843,1845,1848],{"class":398,"line":443},[396,1839,1840],{"class":481},"            $rootUrl",[396,1842,535],{"class":485},[396,1844,509],{"class":508},[396,1846,1847],{"class":413},"https:\u002F\u002Fcdn.example.com",[396,1849,515],{"class":508},[396,1851,1852,1854],{"class":398,"line":448},[396,1853,520],{"class":481},[396,1855,486],{"class":485},[396,1857,1858,1860,1862,1864,1866,1868,1871,1873,1875,1878,1880,1883],{"class":398,"line":454},[396,1859,505],{"class":485},[396,1861,529],{"class":485},[396,1863,532],{"class":481},[396,1865,535],{"class":485},[396,1867,509],{"class":508},[396,1869,1870],{"class":413},"liip_imagine.cache.resolver",[396,1872,554],{"class":508},[396,1874,541],{"class":485},[396,1876,1877],{"class":481}," resolver",[396,1879,535],{"class":485},[396,1881,1882],{"class":413}," local",[396,1884,557],{"class":485},[396,1886,1887],{"class":398,"line":751},[396,1888,424],{"emptyLinePlaceholder":423},[396,1890,1891,1893],{"class":398,"line":765},[396,1892,1651],{"class":481},[396,1894,486],{"class":485},[396,1896,1897,1900,1902],{"class":398,"line":789},[396,1898,1899],{"class":481},"    cache",[396,1901,535],{"class":485},[396,1903,1904],{"class":413}," local\n",[367,1906,1907,1908,1911],{},"The service ",[370,1909,1910],{},"api_components.filesystem.{alias}"," is created automatically for each registered adapter.",[379,1913,1915],{"id":1914},"dynamic-filter-selection","Dynamic Filter Selection",[367,1917,1918,1919,535],{},"For cases where the required filters depend on runtime data (request context, entity state), implement ",[370,1920,1921],{},"ImagineFiltersInterface",[387,1923,1925],{"className":575,"code":1924,"language":577,"meta":392,"style":392},"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",[370,1926,1927,1948,1969,1973,1990,1994,2032,2037,2072,2076],{"__ignoreMap":392},[396,1928,1929,1931,1933,1935,1937,1939,1942,1944,1946],{"class":398,"line":399},[396,1930,585],{"class":584},[396,1932,589],{"class":588},[396,1934,593],{"class":592},[396,1936,596],{"class":588},[396,1938,593],{"class":592},[396,1940,1941],{"class":588},"Imagine",[396,1943,593],{"class":592},[396,1945,1921],{"class":588},[396,1947,609],{"class":485},[396,1949,1950,1952,1954,1956,1958,1960,1962,1964,1967],{"class":398,"line":406},[396,1951,585],{"class":584},[396,1953,669],{"class":588},[396,1955,593],{"class":592},[396,1957,225],{"class":588},[396,1959,593],{"class":592},[396,1961,678],{"class":588},[396,1963,593],{"class":592},[396,1965,1966],{"class":588},"Request",[396,1968,609],{"class":485},[396,1970,1971],{"class":398,"line":420},[396,1972,424],{"emptyLinePlaceholder":423},[396,1974,1975,1977,1979,1981,1984,1987],{"class":398,"line":427},[396,1976,793],{"class":792},[396,1978,796],{"class":409},[396,1980,799],{"class":792},[396,1982,1983],{"class":409}," AbstractComponent",[396,1985,1986],{"class":792}," implements",[396,1988,1989],{"class":409}," ImagineFiltersInterface\n",[396,1991,1992],{"class":398,"line":433},[396,1993,808],{"class":485},[396,1995,1996,1998,2001,2005,2007,2010,2012,2014,2016,2018,2020,2022,2025,2027,2029],{"class":398,"line":443},[396,1997,932],{"class":792},[396,1999,2000],{"class":792}," function",[396,2002,2004],{"class":2003},"sKpYG"," getImagineFilters",[396,2006,773],{"class":485},[396,2008,2009],{"class":584},"string",[396,2011,942],{"class":485},[396,2013,1024],{"class":725},[396,2015,541],{"class":485},[396,2017,936],{"class":935},[396,2019,1966],{"class":939},[396,2021,942],{"class":485},[396,2023,2024],{"class":725},"request",[396,2026,784],{"class":485},[396,2028,535],{"class":935},[396,2030,2031],{"class":584}," array\n",[396,2033,2034],{"class":398,"line":448},[396,2035,2036],{"class":485},"    {\n",[396,2038,2039,2043,2045,2047,2049,2051,2053,2055,2058,2060,2062,2064,2067,2069],{"class":398,"line":454},[396,2040,2042],{"class":2041},"sm4w6","        return",[396,2044,884],{"class":485},[396,2046,554],{"class":508},[396,2048,889],{"class":413},[396,2050,554],{"class":508},[396,2052,541],{"class":485},[396,2054,509],{"class":508},[396,2056,2057],{"class":413},"hero",[396,2059,554],{"class":508},[396,2061,541],{"class":485},[396,2063,509],{"class":508},[396,2065,2066],{"class":413},"square",[396,2068,554],{"class":508},[396,2070,2071],{"class":485},"];\n",[396,2073,2074],{"class":398,"line":751},[396,2075,1602],{"class":485},[396,2077,2078],{"class":398,"line":765},[396,2079,959],{"class":485},[367,2081,2082,2085,2086,2088],{},[370,2083,2084],{},"$request"," is ",[370,2087,1044],{}," when called during upload processing outside a web request (e.g. in a fixture).",[379,2090,2092],{"id":2091},"deleting-a-file","Deleting a File",[367,2094,2095,2096,2098],{},"Send ",[370,2097,1044],{}," for the field property in a PATCH:",[387,2100,2102],{"className":1284,"code":2101,"language":1286,"meta":392,"style":392},"PATCH \u002Fcomponent\u002Fimages\u002F{id}\nContent-Type: application\u002Fmerge-patch+json\n\n{ \"file\": null }\n",[370,2103,2104,2118,2123,2127],{"__ignoreMap":392},[396,2105,2106,2109,2112,2116],{"class":398,"line":399},[396,2107,2108],{"class":725},"PATCH \u002Fcomponent\u002Fimages\u002F",[396,2110,2111],{"class":485},"{",[396,2113,2115],{"class":2114},"s0uA6","id",[396,2117,959],{"class":485},[396,2119,2120],{"class":398,"line":406},[396,2121,2122],{"class":725},"Content-Type: application\u002Fmerge-patch+json\n",[396,2124,2125],{"class":398,"line":420},[396,2126,424],{"emptyLinePlaceholder":423},[396,2128,2129,2131,2133,2135,2137,2139,2141],{"class":398,"line":427},[396,2130,2111],{"class":485},[396,2132,1323],{"class":592},[396,2134,1315],{"class":1314},[396,2136,1318],{"class":592},[396,2138,535],{"class":485},[396,2140,951],{"class":592},[396,2142,557],{"class":485},[367,2144,2145],{},"The bundle removes the file from storage and clears the media object data.",[379,2147,2149],{"id":2148},"on-the-front-end","On the Front-End",[367,2151,2152,2153,2156,2157,2160,2161,1107,2163,1107,2166,2169,2170,2173,2174,2177],{},"Use ",[370,2154,2155],{},"useCwaComponent"," with the ",[370,2158,2159],{},"withImage()"," plugin in your Vue component. It adds ",[370,2162,1440],{},[370,2164,2165],{},"displayMedia",[370,2167,2168],{},"loaded",", and ",[370,2171,2172],{},"handleLoad"," — see ",[2175,2176,301],"a",{"href":302}," for the full reference.",[2179,2180,2181],"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":392,"searchDepth":406,"depth":406,"links":2183},[2184,2185,2186,2190,2191,2193,2194,2195,2196],{"id":381,"depth":406,"text":382},{"id":571,"depth":406,"text":572},{"id":962,"depth":406,"text":963,"children":2187},[2188],{"id":1069,"depth":420,"text":2189},"urlGenerator values",{"id":1274,"depth":406,"text":1275},{"id":1349,"depth":406,"text":2192},"The _metadata Response",{"id":1615,"depth":406,"text":1616},{"id":1914,"depth":406,"text":1915},{"id":2091,"depth":406,"text":2092},{"id":2148,"depth":406,"text":2149},"Add file upload support to any component with Flysystem adapters and optional Imagine image processing.","md",null,{},{"title":96,"description":2197},"IUggkJFVjLHpBsFLN4PTw621RzyHfQcJK8q6PCGr0DY",[2204,2206],{"title":92,"path":93,"stem":94,"description":2205,"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":2207,"children":-1},"Automatically record created and modified timestamps on any component or page data entity.",1782512903052]