{"id":32655,"date":"2024-01-17T07:00:00","date_gmt":"2024-01-17T15:00:00","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=32655"},"modified":"2024-08-04T23:55:14","modified_gmt":"2024-08-05T06:55:14","slug":"dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte","title":{"rendered":"Dynamic CMS-Driven Galleries: Integrating Cloudinary and Sanity in Svelte"},"content":{"rendered":"\n<p>The paradigm shift in the digital landscape is moving from static to dynamic content, making CMS-driven photo galleries more essential. What makes this dynamic? It stems from personalization, automatic image resizing, and the ability to change text, colors, and more elements within an image programmatically \u2014 possibilities that many might not be aware of.<\/p>\n\n\n\n<p>This dynamism highlights the importance of integrating robust technologies like Cloudinary, <a href=\"https:\/\/www.sanity.io\/plugins\/sanity-plugin-cloudinary\">Sanity<\/a>, and <a href=\"https:\/\/svelte.cloudinary.dev\/\">Svelte<\/a>, key players that significantly impact modern web development.<\/p>\n\n\n\n<p>Cloudinary is a media management platform for image and video handling. Sanity, meanwhile, enables structured content architectures and real-time collaboration, while Svelte offers an innovative approach to building web-based user interfaces.<\/p>\n\n\n\n<p>Together, these technologies transform CMS-driven galleries into dynamic, responsive experiences. Merging Cloudinary&#8217;s media capabilities with Sanity&#8217;s content management in a Svelte application lets developers create truly immersive, CMS-driven galleries. Through this article, we explore this integration and a demo implementation.<\/p>\n\n\n\n<p>Jump right into the action with hands-on examples present in our <a href=\"https:\/\/github.com\/lelouchB\/cloudinary-sanity-example\">GitHub Repo<\/a>, or explore these techniques live <a href=\"https:\/\/cloudinary-sanity-example.vercel.app\/\">here<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exploring the Sanity Cloudinary Plugin<\/h2>\n\n\n\n<p>The <a href=\"https:\/\/www.sanity.io\/plugins\/sanity-plugin-cloudinary\">Sanity Cloudinary Plugin<\/a> provides easy access to Cloudinary&#8217;s images and videos within Sanity Studio. It consolidates the functionality of sanity-plugin-cloudinary and sanity-plugin-asset-source-cloudinary, offering secure API credential storage, easy configuration, and handy video player preview. Notably, it allows the creation and preview of transformations and incorporates Cloudinary&#8217;s media library, optimizing your media management efficiency within Sanity Studio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bridging Sanity Studio and Cloudinary Plugin<\/h2>\n\n\n\n<p>This blog post assumes you already have a sanity project setup. You can also set up a new Sanity project by running the following command in the terminal.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-string\">``<\/span><span class=\"hljs-string\">`\nnpm create sanity@latest\n`<\/span><span class=\"hljs-string\">``<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You can read more about installing and setting up a Sanity Studio project <a href=\"https:\/\/www.sanity.io\/docs\/installation\">here<\/a>.<\/p>\n\n\n\n<p>To get started with the Sanity plugin, run the following commands in your Sanity studio project to install <code>sanity-plugin-cloudinary<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-string\">``<\/span><span class=\"hljs-string\">`\nnpm i sanity-plugin-cloudinary\n`<\/span><span class=\"hljs-string\">``<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>sanity-plugin-cloudinary<\/code> comes with two exports:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>cloudinaryAssetSourcePlugin &#8211; serves Cloudinary images from the Sanity CDN<\/li>\n\n\n\n<li>cloudinarySchemaPlugin &#8211; serves Cloudinary images from the Cloudinary CDN<\/li>\n<\/ul>\n\n\n\n<p>In this example, we will use <code>cloudinarySchemaPlugin<\/code> to serve the images from Cloudinary CDN.<\/p>\n\n\n\n<p>Update the <code>sanity.config.js<\/code> file to include the plugin.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">```\nimport {defineConfig} from <span class=\"hljs-string\">'sanity'<\/span>\nimport {deskTool} from <span class=\"hljs-string\">'sanity\/desk'<\/span>\nimport {visionTool} from <span class=\"hljs-string\">'@sanity\/vision'<\/span>\nimport {schemaTypes} from <span class=\"hljs-string\">'.\/schemas'<\/span>\nimport {cloudinarySchemaPlugin} from <span class=\"hljs-string\">'sanity-plugin-cloudinary'<\/span>\n\nexport <span class=\"hljs-keyword\">default<\/span> defineConfig({\n  name: <span class=\"hljs-string\">'default'<\/span>,\n  title: <span class=\"hljs-string\">'studio'<\/span>,\n\n  projectId: YOUR-SANITY-PROJECT-ID,\n  dataset: YOUR-SANITY-DATASET<span class=\"hljs-string\">',\n\n  plugins: &#91;deskTool(), visionTool(), cloudinarySchemaPlugin()],\n\n  schema: {\n\ttypes: schemaTypes,\n  },\n})\n\n```<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Next, create a schema named <code>gallery<\/code> like this.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">```js\nimport {defineField, defineType} from <span class=\"hljs-string\">'sanity'<\/span>\n\nexport <span class=\"hljs-keyword\">default<\/span> defineType({\n  name: <span class=\"hljs-string\">'gallery'<\/span>,\n  title: <span class=\"hljs-string\">'Gallery'<\/span>,\n  type: <span class=\"hljs-string\">'document'<\/span>,\n  fields: &#91;\n\tdefineField({\n  \t    name: <span class=\"hljs-string\">'title'<\/span>,\n  \t    title: <span class=\"hljs-string\">'Title'<\/span>,\n  \t    type: <span class=\"hljs-string\">'string'<\/span>,\n\t}),\n\n\tdefineField({\n  \t    name: <span class=\"hljs-string\">'images'<\/span>,\n  \t    title: <span class=\"hljs-string\">'Images'<\/span>,\n  \t    type: <span class=\"hljs-string\">'array'<\/span>,\n  \t    of: &#91;{type: <span class=\"hljs-string\">'cloudinary.asset'<\/span>}],\n\t})\n  ],\n  preview: {\n\tselect: {\n  \t    title: <span class=\"hljs-string\">'title'<\/span>,\n\t},\n  },\n})\n\n```<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In the above schema, we defined a field named <code>images<\/code>, an <code>array<\/code> of type <code>cloudinary.asset<\/code>.<\/p>\n\n\n\n<p>In the Sanity Studio, this field allows you to select a singular Cloudinary asset or multiple assets in one go.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img width=\"1024\" height=\"658\" data-public-id=\"Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_1\/Dynamic-CMS-Driven-Galleries_1.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1024,h_658,c_scale\/f_auto,q_auto\/v1705515547\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_1\/Dynamic-CMS-Driven-Galleries_1.png?_i=AA\" alt=\"\" class=\"wp-post-32655 wp-image-32658\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1705515547\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515547\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_1\/Dynamic-CMS-Driven-Galleries_1.png?_i=AA 1168w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515547\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_1\/Dynamic-CMS-Driven-Galleries_1.png?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515547\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_1\/Dynamic-CMS-Driven-Galleries_1.png?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515547\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_1\/Dynamic-CMS-Driven-Galleries_1.png?_i=AA 1024w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>It opens the Cloudinary media library for selecting assets. You can also apply transformations while selecting the asset.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img width=\"1024\" height=\"611\" data-public-id=\"Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_2\/Dynamic-CMS-Driven-Galleries_2.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1024,h_611,c_scale\/f_auto,q_auto\/v1705515541\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_2\/Dynamic-CMS-Driven-Galleries_2.png?_i=AA\" alt=\"\" class=\"wp-post-32655 wp-image-32659\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1705515541\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515541\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_2\/Dynamic-CMS-Driven-Galleries_2.png?_i=AA 1531w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515541\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_2\/Dynamic-CMS-Driven-Galleries_2.png?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515541\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_2\/Dynamic-CMS-Driven-Galleries_2.png?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515541\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_2\/Dynamic-CMS-Driven-Galleries_2.png?_i=AA 1024w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Here\u2019s what an asset of the type <code>cloudinary.asset<\/code> looks like.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">```\n{\n  <span class=\"hljs-string\">\"created_at\"<\/span>: <span class=\"hljs-string\">\"2023-12-13T06:22:11Z\"<\/span>,\n  <span class=\"hljs-string\">\"format\"<\/span>: <span class=\"hljs-string\">\"jpg\"<\/span>,\n  <span class=\"hljs-string\">\"resource_type\"<\/span>: <span class=\"hljs-string\">\"image\"<\/span>,\n  <span class=\"hljs-string\">\"access_mode\"<\/span>: <span class=\"hljs-string\">\"public\"<\/span>,\n  <span class=\"hljs-string\">\"width\"<\/span>: <span class=\"hljs-number\">2132<\/span>,\n  <span class=\"hljs-string\">\"secure_url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/singhashutoshk\/image\/upload\/v1702448531\/eb8y43ervardt38bqsyz.jpg\"<\/span>,\n  <span class=\"hljs-string\">\"id\"<\/span>: <span class=\"hljs-string\">\"85a8909674e300ab9e6709b47df7dd45\"<\/span>,\n  <span class=\"hljs-string\">\"metadata\"<\/span>: &#91;],\n  <span class=\"hljs-string\">\"_key\"<\/span>: <span class=\"hljs-string\">\"0834b0b79241\"<\/span>,\n  <span class=\"hljs-string\">\"bytes\"<\/span>: <span class=\"hljs-number\">443351<\/span>,\n  <span class=\"hljs-string\">\"_type\"<\/span>: <span class=\"hljs-string\">\"cloudinary.asset\"<\/span>,\n  <span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"upload\"<\/span>,\n  <span class=\"hljs-string\">\"tags\"<\/span>: &#91;],\n  <span class=\"hljs-string\">\"access_control\"<\/span>: &#91;],\n  <span class=\"hljs-string\">\"height\"<\/span>: <span class=\"hljs-number\">2299<\/span>,\n  <span class=\"hljs-string\">\"public_id\"<\/span>: <span class=\"hljs-string\">\"eb8y43ervardt38bqsyz\"<\/span>,\n}\n```<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Connecting the Svelte App to Sanity<\/h2>\n\n\n\n<p>In this section, we\u2019ll integrate Sanity with our Svelte app. We\u2019re using a skeleton Svelte app, which can be set up by running the following command in the terminal:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-string\">``<\/span><span class=\"hljs-string\">`\nnpm create svelte@latest cloudinary-sanity-example\n`<\/span><span class=\"hljs-string\">``<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You can choose the following configuration and tooling when prompted.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-string\">``<\/span><span class=\"hljs-string\">`\n\u250c  Welcome to SvelteKit!\n\u2502\n\u25c7  Which Svelte app template?\n\u2502  SvelteKit demo app\n\u2502\n\u25c7  Add type checking with TypeScript?\n\u2502  No\n\u2502\n\u25c7  Select additional options (use arrow keys\/space bar)\n\u2502  none\n\u2502\n\u2514  Your project is ready!\n\n`<\/span><span class=\"hljs-string\">``<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>&nbsp;You can read more about creating a Svelte project <a href=\"https:\/\/kit.svelte.dev\/docs\/creating-a-project\">here<\/a>.<\/p>\n\n\n\n<p>Next, run the following command to install <a href=\"https:\/\/github.com\/sanity-io\/client\">Sanity Client<\/a> and <a href=\"https:\/\/svelte.cloudinary.dev\/\">Svelte Cloudinary<\/a>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-string\">``<\/span><span class=\"hljs-string\">` \nnpm i @sanity\/client groq svelte-cloudinary\t\n`<\/span><span class=\"hljs-string\">``<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Add the following environment variables to your <code>.env<\/code> file.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-string\">``<\/span><span class=\"hljs-string\">`\nPUBLIC_SANITY_PROJECT_ID=YOUR-SANITY-PROJECT-ID\nPUBLIC_SANITY_DATASET=YOUR-SANITY-DATASET\n\n\nVITE_PUBLIC_CLOUDINARY_CLOUD_NAME=YOUR_CLOUDINARY_CLOUD_NAME\n`<\/span><span class=\"hljs-string\">``<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Create a file named <code>lib\/sanityClient.js<\/code> where we\u2019ll initialize the Sanity Client. A Sanity Client interacts with your Sanity project\u2019s <a href=\"https:\/\/www.sanity.io\/docs\/datastore\">Content Lake<\/a> to perform operations like fetching documents, creating\/replacing documents, uploading assets, etc. Our primary use case in this tutorial is fetching the data from the Content Lake.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">```\nimport { createClient } from <span class=\"hljs-string\">'@sanity\/client'<\/span>;\nimport groq from <span class=\"hljs-string\">'groq'<\/span>;\nimport { PUBLIC_SANITY_DATASET, PUBLIC_SANITY_PROJECT_ID } from <span class=\"hljs-string\">'$env\/static\/public'<\/span>;\n\nexport <span class=\"hljs-keyword\">const<\/span> client = createClient({\n    projectId: PUBLIC_SANITY_PROJECT_ID,\n    dataset: PUBLIC_SANITY_DATASET,\n    useCdn: <span class=\"hljs-keyword\">false<\/span>,\n    apiVersion: <span class=\"hljs-string\">'2023-03-20'<\/span>\n});\n\nexport async <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">getGallery<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> await client.fetch(groq`*&#91;_type == <span class=\"hljs-string\">\"gallery\"<\/span>] | order(_createdAt desc)&#91;<span class=\"hljs-number\">0<\/span>]`);\n}\n\n```<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The next step is to create a file named <code>+page.js<\/code> and define a <code>load<\/code> function to return the data from Sanity to the page (<code>+page.svelte<\/code>) via the <code>data<\/code> prop. You can read more about loading data in Svelte <a href=\"https:\/\/kit.svelte.dev\/docs\/load\">here<\/a>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">```\nimport { getGallery } from <span class=\"hljs-string\">'$lib\/sanityClient'<\/span>;\nimport { error } from <span class=\"hljs-string\">'@sveltejs\/kit'<\/span>;\n\nexport <span class=\"hljs-keyword\">const<\/span> load = async () =&gt; {\n    <span class=\"hljs-keyword\">const<\/span> galleryData = await getGallery();\n\n    <span class=\"hljs-keyword\">if<\/span> (galleryData) {\n   \t <span class=\"hljs-keyword\">return<\/span> galleryData;\n    }\n\n    <span class=\"hljs-keyword\">throw<\/span> error(<span class=\"hljs-number\">404<\/span>, <span class=\"hljs-string\">'Not found'<\/span>);\n};\n\n```<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Update <code>+page.svelte<\/code> like this to access the data from Sanity via <code>data<\/code> prop and render the gallery images using <code>CldImage<\/code> from <code>svelte-cloudinary<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">```\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n    <span class=\"hljs-keyword\">import<\/span> { CldImage } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'svelte-cloudinary'<\/span>;\n\n    <span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">let<\/span> data;\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">section<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"py-4\"<\/span>&gt;<\/span>\n    {#if data}\n   \t <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 max-w-fit mx-auto\"<\/span>&gt;<\/span>\n   \t\t {#each data.images as picture}\n   \t\t\t <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">key<\/span>=<span class=\"hljs-string\">{picture._key}<\/span>&gt;<\/span>\n   \t\t\t\t <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">CldImage<\/span>\n   \t\t\t\t\t <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">{picture.public_id}<\/span>\n   \t\t\t\t\t <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">\"400\"<\/span>\n   \t\t\t\t\t <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"600\"<\/span>\n   \t\t\t\t\t <span class=\"hljs-attr\">crop<\/span>=<span class=\"hljs-string\">\"fill\"<\/span>\n   \t\t\t\t\t <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"rounded hover:transform hover:scale-105 transition duration-300 ease-in-out\"<\/span>\n   \t\t\t\t \/&gt;<\/span>\n   \t\t\t <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n   \t\t {\/each}\n   \t <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    {\/if}\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">section<\/span>&gt;<\/span>\n\n```<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This will render a dynamic gallery like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img width=\"1024\" height=\"676\" data-public-id=\"Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_3\/Dynamic-CMS-Driven-Galleries_3.jpg\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1024,h_676,c_scale\/f_auto,q_auto\/v1705515536\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_3\/Dynamic-CMS-Driven-Galleries_3.jpg?_i=AA\" alt=\"\" class=\"wp-post-32655 wp-image-32660\" data-format=\"jpg\" data-transformations=\"f_auto,q_auto\" data-version=\"1705515536\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515536\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_3\/Dynamic-CMS-Driven-Galleries_3.jpg?_i=AA 1999w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515536\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_3\/Dynamic-CMS-Driven-Galleries_3.jpg?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515536\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_3\/Dynamic-CMS-Driven-Galleries_3.jpg?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515536\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_3\/Dynamic-CMS-Driven-Galleries_3.jpg?_i=AA 1024w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515536\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_3\/Dynamic-CMS-Driven-Galleries_3.jpg?_i=AA 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>You can use the combined strength of Svelte, Sanity, and Cloudinary to build different dynamic galleries, satisfying users&#8217; growing appetite for engaging and elegantly managed visual content. Having multiple images and media assets can impact a site\u2019s performance. However, this can be effectively addressed with Svelte Cloudinary\u2019s <code>CldImage<\/code> component, which can be used to optimize images and boost the overall site\u2019s performance. You can learn more about boosting performance by optimizing the gallery images <a href=\"https:\/\/cloudinary.com\/blog\/boost-svelte-performance-optimized-images\">here<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img width=\"1024\" height=\"676\" data-public-id=\"Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_4\/Dynamic-CMS-Driven-Galleries_4.jpg\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1024,h_676,c_scale\/f_auto,q_auto\/v1705515532\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_4\/Dynamic-CMS-Driven-Galleries_4.jpg?_i=AA\" alt=\"\" class=\"wp-post-32655 wp-image-32661\" data-format=\"jpg\" data-transformations=\"f_auto,q_auto\" data-version=\"1705515532\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515532\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_4\/Dynamic-CMS-Driven-Galleries_4.jpg?_i=AA 1999w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515532\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_4\/Dynamic-CMS-Driven-Galleries_4.jpg?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515532\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_4\/Dynamic-CMS-Driven-Galleries_4.jpg?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515532\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_4\/Dynamic-CMS-Driven-Galleries_4.jpg?_i=AA 1024w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705515532\/Web_Assets\/blog\/Dynamic-CMS-Driven-Galleries_4\/Dynamic-CMS-Driven-Galleries_4.jpg?_i=AA 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">A New Era of Dynamic Galleries<\/h2>\n\n\n\n<p>The combined strength of Svelte, Sanity, and Cloudinary brings forth a new era of dynamic online galleries, satisfying users&#8217; growing appetite for engaging and elegantly managed visual content.&nbsp;<\/p>\n\n\n\n<p>The <code>CldImage<\/code> component provides access to Cloudinary&#8217;s full range of transformations, offering an alternative to the <a href=\"https:\/\/www.sanity.io\/docs\/image-urls\">native image capabilities of Sanity<\/a> for more dynamic and configurable image galleries.<\/p>\n\n\n\n<p>Here are some additional resources:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.sanity.io\/plugins\/sanity-plugin-cloudinary\">Sanity Plugin Cloudinary<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/svelte.cloudinary.dev\/\">Cloudinary Svelte<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=Vr3H3XREkbw\">Optimizing Images with Svelte Cloudinary<\/a><\/li>\n<\/ul>\n\n\n\n<p>If you found this article helpful and want to discuss it in more detail, head over to\u00a0<a href=\"https:\/\/community.cloudinary.com\/\">Cloudinary Community forum<\/a>\u00a0and its associated\u00a0<a href=\"https:\/\/discord.com\/invite\/cloudinary\">Discord<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The paradigm shift in the digital landscape is moving from static to dynamic content, making CMS-driven photo galleries more essential. What makes this dynamic? It stems from personalization, automatic image resizing, and the ability to change text, colors, and more elements within an image programmatically \u2014 possibilities that many might not be aware of. This [&hellip;]<\/p>\n","protected":false},"author":87,"featured_media":32662,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[59,134,370,238],"class_list":["post-32655","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-cms","tag-guest-post","tag-image","tag-product-gallery"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Cloudinary and Sanity in Svelte Transform CMS-Driven Galleries<\/title>\n<meta name=\"description\" content=\"Merging Cloudinary&#039;s media capabilities with Sanity&#039;s content management in a Svelte application lets developers create immersive, CMS-driven galleries.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dynamic CMS-Driven Galleries: Integrating Cloudinary and Sanity in Svelte\" \/>\n<meta property=\"og:description\" content=\"Merging Cloudinary&#039;s media capabilities with Sanity&#039;s content management in a Svelte application lets developers create immersive, CMS-driven galleries.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-17T15:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-08-05T06:55:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1705100394\/BDynamic_CMS_driven_Galleries-Blog\/BDynamic_CMS_driven_Galleries-Blog-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"melindapham\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte\"},\"author\":{\"name\":\"melindapham\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\"},\"headline\":\"Dynamic CMS-Driven Galleries: Integrating Cloudinary and Sanity in Svelte\",\"datePublished\":\"2024-01-17T15:00:00+00:00\",\"dateModified\":\"2024-08-05T06:55:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte\"},\"wordCount\":783,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705100394\/BDynamic_CMS_driven_Galleries-Blog\/BDynamic_CMS_driven_Galleries-Blog.jpg?_i=AA\",\"keywords\":[\"CMS\",\"Guest Post\",\"Image\",\"Product Gallery\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2024\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte\",\"url\":\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte\",\"name\":\"Cloudinary and Sanity in Svelte Transform CMS-Driven Galleries\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705100394\/BDynamic_CMS_driven_Galleries-Blog\/BDynamic_CMS_driven_Galleries-Blog.jpg?_i=AA\",\"datePublished\":\"2024-01-17T15:00:00+00:00\",\"dateModified\":\"2024-08-05T06:55:14+00:00\",\"description\":\"Merging Cloudinary's media capabilities with Sanity's content management in a Svelte application lets developers create immersive, CMS-driven galleries.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705100394\/BDynamic_CMS_driven_Galleries-Blog\/BDynamic_CMS_driven_Galleries-Blog.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705100394\/BDynamic_CMS_driven_Galleries-Blog\/BDynamic_CMS_driven_Galleries-Blog.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dynamic CMS-Driven Galleries: Integrating Cloudinary and Sanity in Svelte\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\",\"name\":\"melindapham\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"caption\":\"melindapham\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Cloudinary and Sanity in Svelte Transform CMS-Driven Galleries","description":"Merging Cloudinary's media capabilities with Sanity's content management in a Svelte application lets developers create immersive, CMS-driven galleries.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte","og_locale":"en_US","og_type":"article","og_title":"Dynamic CMS-Driven Galleries: Integrating Cloudinary and Sanity in Svelte","og_description":"Merging Cloudinary's media capabilities with Sanity's content management in a Svelte application lets developers create immersive, CMS-driven galleries.","og_url":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte","og_site_name":"Cloudinary Blog","article_published_time":"2024-01-17T15:00:00+00:00","article_modified_time":"2024-08-05T06:55:14+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1705100394\/BDynamic_CMS_driven_Galleries-Blog\/BDynamic_CMS_driven_Galleries-Blog-jpg?_i=AA","type":"image\/jpeg"}],"author":"melindapham","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte"},"author":{"name":"melindapham","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9"},"headline":"Dynamic CMS-Driven Galleries: Integrating Cloudinary and Sanity in Svelte","datePublished":"2024-01-17T15:00:00+00:00","dateModified":"2024-08-05T06:55:14+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte"},"wordCount":783,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705100394\/BDynamic_CMS_driven_Galleries-Blog\/BDynamic_CMS_driven_Galleries-Blog.jpg?_i=AA","keywords":["CMS","Guest Post","Image","Product Gallery"],"inLanguage":"en-US","copyrightYear":"2024","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte","url":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte","name":"Cloudinary and Sanity in Svelte Transform CMS-Driven Galleries","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705100394\/BDynamic_CMS_driven_Galleries-Blog\/BDynamic_CMS_driven_Galleries-Blog.jpg?_i=AA","datePublished":"2024-01-17T15:00:00+00:00","dateModified":"2024-08-05T06:55:14+00:00","description":"Merging Cloudinary's media capabilities with Sanity's content management in a Svelte application lets developers create immersive, CMS-driven galleries.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705100394\/BDynamic_CMS_driven_Galleries-Blog\/BDynamic_CMS_driven_Galleries-Blog.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705100394\/BDynamic_CMS_driven_Galleries-Blog\/BDynamic_CMS_driven_Galleries-Blog.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/dynamic-cms-driven-galleries-integrating-cloudinary-sanity-in-svelte#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Dynamic CMS-Driven Galleries: Integrating Cloudinary and Sanity in Svelte"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9","name":"melindapham","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","caption":"melindapham"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1705100394\/BDynamic_CMS_driven_Galleries-Blog\/BDynamic_CMS_driven_Galleries-Blog.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/32655","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/87"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=32655"}],"version-history":[{"count":8,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/32655\/revisions"}],"predecessor-version":[{"id":35074,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/32655\/revisions\/35074"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/32662"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=32655"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=32655"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=32655"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}