{"id":28189,"date":"2021-12-21T19:20:06","date_gmt":"2021-12-21T19:20:06","guid":{"rendered":"http:\/\/Create-a-holiday-card-generator-in-Nuxt.js"},"modified":"2021-12-21T19:20:06","modified_gmt":"2021-12-21T19:20:06","slug":"create-a-holiday-card-generator-in-nuxt-js","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/","title":{"rendered":"Create a holiday card generator in Nuxt.js"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Greeting cards are pieces of stiff paper or thin cardboard with text, illustrations, or photos, given on special occasions such as birthdays, anniversaries, holidays, e.t.c.<\/p>\n<p>This post will discuss building a holiday card generator for the Harvest Month, Thanksgiving, and Diwali holidays using <a href=\"https:\/\/cloudinary.com\/\">Cloudinary<\/a> and <a href=\"https:\/\/nuxtjs.org\/\">Nuxt.js<\/a>. At the end of this tutorial, we will learn how to create holiday cards from images we stored on Cloudinary.<\/p>\n<p>Cloudinary is a platform on which you can quickly and easily upload, store, manage, transform, and deliver images and videos for websites and applications. The platform also offers a vast collection of software development kits (SDKs) for frontend frameworks and libraries.<\/p>\n<p>Nuxt.js is a vue-based frontend development framework that enables functionalities like server-side rendering, static site generation, file-system routing, components auto-import, and API endpoints for backend features.<\/p>\n<h2>Sandbox<\/h2>\n<p>We completed this project in <a href=\"https:\/\/codesandbox.io\/s\/funny-wave-r5cc3\">a CodeSandbox<\/a>, and you can fork it to run the code.<\/p>\n<\/div>\n  \n  <div class=\"wp-block-cloudinary-code-sandbox \">\n    <iframe\n      src=\"https:\/\/codesandbox.io\/embed\/funny-wave-r5cc3?theme=dark&amp;codemirror=1&amp;highlights=&amp;editorsize=50&amp;fontsize=14&amp;expanddevtools=0&amp;hidedevtools=0&amp;eslint=0&amp;forcerefresh=0&amp;hidenavigation=0&amp;initialpath=%2F&amp;module=&amp;moduleview=0&amp;previewwindow=&amp;view=&amp;runonclick=1\"\n      height=\"500\"\n      style=\"width: 100%;\"\n      title=\"Create a holiday card in Next.js\"\n      loading=\"lazy\"\n      allow=\"accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking\"\n      sandbox=\"allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts\"\n    ><\/iframe>\n  <\/div>\n\n  <div class=\"wp-block-cloudinary-markdown \"><p>GitHub: <a href=\"https:\/\/github.com\/Mr-Malomz\/holiday_card_nuxt\">https:\/\/github.com\/Mr-Malomz\/holiday_card_nuxt<\/a><\/p>\n<!-- Hi can you please double-check the full codesandbox embed, title\/ID -->\n<h2>Prerequisites<\/h2>\n<p>The following steps in this post require JavaScript and Vue.js experience. Experience with Nuxt.js isn\u2019t a requirement, but it\u2019s nice to have.<\/p>\n<p>We also need a <a href=\"https:\/\/cloudinary.com\/\">Cloudinary account<\/a> to store the media files. <a href=\"https:\/\/cloudinary.com\/users\/register\/free\"><strong>Signup<\/strong><\/a> <strong>is completely free<\/strong>.<\/p>\n<h2>Getting Started<\/h2>\n<p>We need to create a Nuxt.js starter project by navigating to the desired directory and running the command below in our terminal.<\/p>\n<pre class=\"js-syntax-highlighted\"><span><code class=\"hljs shcb-wrap-lines\">    npx create-nuxt-app holiday_card_nuxt &amp;&amp; cd holiday_card_nuxt\n<\/code><\/span><\/pre>\n<p>This command will ask us some questions on how to configure our application. We can answer the questions as shown below:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">    project name: &lt;PRESS ENTER&gt;\n    programming langauge: &lt;JAVASCRIPT&gt;\n    package manager: &lt;NPM&gt;\n    UI framework: &lt;TAILWIND CSS&gt;\n    Nuxt.js modules: &lt;AXIOS - PROMISE BASED HTTP CLIENT&gt;\n    Linting tools: &lt;ESLINT, PRETTIER&gt;\n    Testing framework: &lt;NONE&gt;\n    Rendering mode: &lt;UNIVERSAL (SSR\/<span class=\"hljs-keyword\">STATIC<\/span>)\n    Deployment target: &lt;<span class=\"hljs-keyword\">STATIC<\/span>\/JAMSTACK HOSTING&gt;\n    Deployment tools: &lt;JSCONFIG.JSON&gt;\n    Continous integration: &lt;NONE&gt;\n    Version control system: &lt;GIT&gt;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<p>The command creates a Next.js project with TailwindCSS called <code>holiday_card_nuxt<\/code>, and navigates into the project directory.<\/p>\n<p><a href=\"https:\/\/tailwindcss.com\/\">TailwindCSS<\/a> is a utility-first CSS framework packed with classes to help us style our web page.<\/p>\n<p>We proceed to install the <a href=\"https:\/\/cloudinary.nuxtjs.org\/\">@nuxtjs\/cloudinary<\/a> dependency with:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\">    <span class=\"hljs-selector-tag\">npm<\/span> <span class=\"hljs-selector-tag\">install<\/span> <span class=\"hljs-keyword\">@nuxtjs<\/span>\/cloudinary\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p><strong>Configuring Cloudinary in Nuxt.js<\/strong>\nFirst, we need to modify the <code>nuxt.config.js<\/code> file by adding <code>@nuxtjs\/cloudinary<\/code> as a module in the  <code>modules<\/code> section:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">    modules: &#91;\n        <span class=\"hljs-string\">'@nuxtjs\/cloudinary'<\/span>, <span class=\"hljs-comment\">\/\/add this<\/span>\n      ],\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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<p>Next, we need to configure Cloudinary by adding a <code>cloudinary<\/code> section below the <code>modules<\/code> section as shown below:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">\n    <span class=\"hljs-attr\">modules<\/span>: &#91;\n        <span class=\"hljs-string\">'@nuxtjs\/cloudinary'<\/span>,\n      ],\n    \n    <span class=\"hljs-comment\">\/\/add this<\/span>\n    <span class=\"hljs-attr\">cloudinary<\/span>: {\n        <span class=\"hljs-attr\">cloudName<\/span>: <span class=\"hljs-string\">'&lt;your-cloud-name&gt;'<\/span>,\n        <span class=\"hljs-attr\">useComponent<\/span>: <span class=\"hljs-literal\">true<\/span>,\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\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p><code>useComponent<\/code> flag set to true lets us use the built-in Cloudinary components. Our cloud name is obtained from our Cloudinary dashboard.<\/p>\n<h2>Image sourceing and upload to Cloudinary<\/h2>\n<p>Next, we download sample images to create our holiday cards. We navigate to the URLs below and download the photos from Unsplash.<\/p>\n<p><strong>Harvest Month Photos<\/strong><\/p>\n<ul>\n<li>\n<a href=\"https:\/\/unsplash.com\/photos\/fjyAh0NLowI\">https:\/\/unsplash.com\/photos\/fjyAh0NLowI<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/unsplash.com\/photos\/yP19KADwhEI\">https:\/\/unsplash.com\/photos\/yP19KADwhEI<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/unsplash.com\/photos\/yuiJO6bvHi4\">https:\/\/unsplash.com\/photos\/yuiJO6bvHi4<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/unsplash.com\/photos\/6cC7WKiwcGs\">https:\/\/unsplash.com\/photos\/6cC7WKiwcGs<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/unsplash.com\/photos\/Nu4u9g7Sgdw\">https:\/\/unsplash.com\/photos\/Nu4u9g7Sgdw<\/a>\n<\/li>\n<\/ul>\n<p><strong>Thanksgiving Photos<\/strong><\/p>\n<ul>\n<li>\n<a href=\"https:\/\/unsplash.com\/photos\/7BpuzmcxlHU\">https:\/\/unsplash.com\/photos\/7BpuzmcxlHU<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/unsplash.com\/photos\/NPBnWE1o07I\">https:\/\/unsplash.com\/photos\/NPBnWE1o07I<\/a>\n<\/li>\n<\/ul>\n<p><strong>Diwali Photos<\/strong><\/p>\n<ul>\n<li>\n<a href=\"https:\/\/unsplash.com\/photos\/xisPXJqwQkA\">https:\/\/unsplash.com\/photos\/xisPXJqwQkA<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/unsplash.com\/photos\/o9e6ItFOIh0\">https:\/\/unsplash.com\/photos\/o9e6ItFOIh0<\/a>\n<\/li>\n<\/ul>\n<p>In our Cloudinary dashboard, we uploaded the images by, clicking on the <strong>Media Library<\/strong> tab, then drag and drop the downloaded images. Cloudinary also supports other upload formats.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_09154C99BD025007588E7E863D13AB13FE936D0B55FA69EF06F32C362371F6D6_1635104341304_Screenshot+2021-10-24+at+20.37.46.png\" alt=\"Cloudinary console and upload button for other formats of upload\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"275\"\/><\/p>\n<p>After uploading all the images, we will see them displayed on the console with their <code>publicId<\/code>. The <strong>ID<\/strong>s will come in handy when generating holiday cards.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_09154C99BD025007588E7E863D13AB13FE936D0B55FA69EF06F32C362371F6D6_1635104691679_Screenshot+2021-10-24+at+20.43.31.png\" alt=\"Uploaded image with publicId highlighted\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"983\"\/><\/p>\n<h2>Set up the image collection<\/h2>\n<p>Next, we need to create a <code>utils<\/code> folder in the project root directory. In this folder, we create <code>harvest.json<\/code>, <code>thanksgiving.json<\/code>, and <code>diwali.json<\/code> files. These files contain image data for each type of card.<\/p>\n<p>Here is the JSON data for each file.<\/p>\n<p><strong>harvest.json<\/strong><\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json shcb-wrap-lines\">    &#91;\n        {\n            <span class=\"hljs-attr\">\"id\"<\/span>: <span class=\"hljs-number\">1<\/span>,\n            <span class=\"hljs-attr\">\"publicId\"<\/span>: <span class=\"hljs-string\">\"&lt;REPLACE THIS WITH YOUR IMAGE PUBLICID&gt;\"<\/span>\n        },\n        {\n            <span class=\"hljs-attr\">\"id\"<\/span>: <span class=\"hljs-number\">2<\/span>,\n            <span class=\"hljs-attr\">\"publicId\"<\/span>: <span class=\"hljs-string\">\"&lt;REPLACE THIS WITH YOUR IMAGE PUBLICID&gt;\"<\/span>\n        },\n        {\n            <span class=\"hljs-attr\">\"id\"<\/span>: <span class=\"hljs-number\">3<\/span>,\n            <span class=\"hljs-attr\">\"publicId\"<\/span>: <span class=\"hljs-string\">\"&lt;REPLACE THIS WITH YOUR IMAGE PUBLICID&gt;\"<\/span>\n        },\n        {\n            <span class=\"hljs-attr\">\"id\"<\/span>: <span class=\"hljs-number\">4<\/span>,\n            <span class=\"hljs-attr\">\"publicId\"<\/span>: <span class=\"hljs-string\">\"&lt;REPLACE THIS WITH YOUR IMAGE PUBLICID&gt;\"<\/span>\n        },\n        {\n            <span class=\"hljs-attr\">\"id\"<\/span>: <span class=\"hljs-number\">5<\/span>,\n            <span class=\"hljs-attr\">\"publicId\"<\/span>: <span class=\"hljs-string\">\"&lt;REPLACE THIS WITH YOUR IMAGE PUBLICID&gt;\"<\/span>\n        }\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\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p><strong>Thanksgiving.json<\/strong><\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json shcb-wrap-lines\">    &#91;\n        {\n            <span class=\"hljs-attr\">\"id\"<\/span>: <span class=\"hljs-number\">1<\/span>,\n            <span class=\"hljs-attr\">\"publicId\"<\/span>: <span class=\"hljs-string\">\"&lt;REPLACE THIS WITH YOUR IMAGE PUBLICID&gt;\"<\/span>\n        },\n        {\n            <span class=\"hljs-attr\">\"id\"<\/span>: <span class=\"hljs-number\">2<\/span>,\n            <span class=\"hljs-attr\">\"publicId\"<\/span>: <span class=\"hljs-string\">\"&lt;REPLACE THIS WITH YOUR IMAGE PUBLICID&gt;\"<\/span>\n        }\n    ]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p><strong>diwali.json<\/strong><\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json shcb-wrap-lines\">    &#91;\n        {\n            <span class=\"hljs-attr\">\"id\"<\/span>: <span class=\"hljs-number\">1<\/span>,\n            <span class=\"hljs-attr\">\"publicId\"<\/span>: <span class=\"hljs-string\">\"&lt;REPLACE THIS WITH YOUR IMAGE PUBLICID&gt;\"<\/span>\n        },\n        {\n            <span class=\"hljs-attr\">\"id\"<\/span>: <span class=\"hljs-number\">2<\/span>,\n            <span class=\"hljs-attr\">\"publicId\"<\/span>: <span class=\"hljs-string\">\"&lt;REPLACE THIS WITH YOUR IMAGE PUBLICID&gt;\"<\/span>\n        }\n    ]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<h2>Creating the holiday card<\/h2>\n<p>Next, we modify the <code>index.vue<\/code> file in the <code>pages<\/code>  folder to the following:<\/p>\n<p><a href=\"https:\/\/gist.github.com\/Mr-Malomz\/f89a9ad2664e7c722f27334c205445a7\">https:\/\/gist.github.com\/Mr-Malomz\/f89a9ad2664e7c722f27334c205445a7<\/a><\/p>\n<p><a href=\"https:\/\/gist.github.com\/Mr-Malomz\/f89a9ad2664e7c722f27334c205445a7\">https:\/\/gist.github.com\/Mr-Malomz\/f89a9ad2664e7c722f27334c205445a7<\/a><\/p>\n<p>The snippet above does the following:<\/p>\n<ul>\n<li>Import the image collections<\/li>\n<li>Create <code>data<\/code> properties to manage imported image collections, active tabs, selected Image ID, form data, and display the Holiday card.<\/li>\n<li>Markup to conditionally display tabs<\/li>\n<li>Markup for form elements and conditionally render the list of Images using <code>@nuxtjs\/cloudinary<\/code>. The list of images also has a <code>click<\/code> function that sets the current image <code>id<\/code> to show the active image, the form object, and the <code>showCard<\/code> property.<\/li>\n<\/ul>\n<p>With that done, we can start a development server using the command below:<\/p>\n<pre class=\"js-syntax-highlighted\"><span><code class=\"hljs shcb-wrap-lines\">    npm run dev\n<\/code><\/span><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_09154C99BD025007588E7E863D13AB13FE936D0B55FA69EF06F32C362371F6D6_1635420381602_screencapture-localhost-3000-2021-10-28-12_25_21.png\" alt=\"\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"1002\"\/>\n<img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_09154C99BD025007588E7E863D13AB13FE936D0B55FA69EF06F32C362371F6D6_1635420381639_screencapture-localhost-3000-2021-10-28-12_25_29.png\" alt=\"\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"969\"\/><\/p>\n<p>With our application up and running, we need to create a <code>Card.vue<\/code> component to render the generated Holiday card. To do this, we navigate to the <code>components<\/code> folder, and in this folder, create a <code>Card.vue<\/code> file containing the code snippet below:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cld-image<\/span> <span class=\"hljs-attr\">:public-id<\/span>=<span class=\"hljs-string\">\"publicId\"<\/span> <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"1000\"<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cld-transformation<\/span> <span class=\"hljs-attr\">crop<\/span>=<span class=\"hljs-string\">\"fit\"<\/span> <span class=\"hljs-attr\">effect<\/span>=<span class=\"hljs-string\">\"blur:100\"<\/span> \/&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cld-transformation<\/span> <span class=\"hljs-attr\">effect<\/span>=<span class=\"hljs-string\">\"brightness_hsb:-50\"<\/span> \/&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cld-transformation<\/span>\n            <span class=\"hljs-attr\">color<\/span>=<span class=\"hljs-string\">\"#FFFFFF\"<\/span>\n            <span class=\"hljs-attr\">:overlay<\/span>=<span class=\"hljs-string\">\"{\n              fontFamily: 'Neucha',\n              fontSize: 100,\n              fontWeight: 'bold',\n              text: message,\n              textAlign: 'center',\n            }\"<\/span>\n            <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"1300\"<\/span>\n            <span class=\"hljs-attr\">crop<\/span>=<span class=\"hljs-string\">\"fit\"<\/span>\n          \/&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cld-transformation<\/span> <span class=\"hljs-attr\">flags<\/span>=<span class=\"hljs-string\">\"layer_apply\"<\/span> \/&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cld-transformation<\/span>\n            <span class=\"hljs-attr\">color<\/span>=<span class=\"hljs-string\">\"#FFFFFF\"<\/span>\n            <span class=\"hljs-attr\">:overlay<\/span>=<span class=\"hljs-string\">\"{\n              fontFamily: 'Dancing Script',\n              fontSize: 50,\n              fontWeight: 'bold',\n              text: `from ${name}`,\n            }\"<\/span>\n          \/&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cld-transformation<\/span> <span class=\"hljs-attr\">flags<\/span>=<span class=\"hljs-string\">\"layer_apply\"<\/span> <span class=\"hljs-attr\">gravity<\/span>=<span class=\"hljs-string\">\"center\"<\/span> <span class=\"hljs-attr\">x<\/span>=<span class=\"hljs-string\">\"450\"<\/span> <span class=\"hljs-attr\">y<\/span>=<span class=\"hljs-string\">\"350\"<\/span> \/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">cld-image<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n    <span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n      <span class=\"hljs-attr\">props<\/span>: {\n        <span class=\"hljs-attr\">message<\/span>: { <span class=\"hljs-attr\">type<\/span>: <span class=\"hljs-built_in\">String<\/span>, <span class=\"hljs-attr\">required<\/span>: <span class=\"hljs-literal\">true<\/span> },\n        <span class=\"hljs-attr\">name<\/span>: { <span class=\"hljs-attr\">type<\/span>: <span class=\"hljs-built_in\">String<\/span>, <span class=\"hljs-attr\">required<\/span>: <span class=\"hljs-literal\">true<\/span> },\n        <span class=\"hljs-attr\">publicId<\/span>: { <span class=\"hljs-attr\">type<\/span>: <span class=\"hljs-built_in\">String<\/span>, <span class=\"hljs-attr\">required<\/span>: <span class=\"hljs-literal\">true<\/span> },\n      },\n    }\n    <\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><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<p>The snippet above does the following:<\/p>\n<ul>\n<li>Configures the component to accept <code>message<\/code>, <code>name<\/code>, and <code>publicId<\/code> props<\/li>\n<li>Configure <code>cld-image<\/code> and <code>cld-transformation<\/code>s to render the image, message, and name.\nWe also leverage Cloudinary\u2019s support for multiple transformations to transform the image. We added the following transformations, <strong>cropping<\/strong>, <strong>blurring<\/strong>, <strong>brightening<\/strong>, adding overlays for <strong>text<\/strong>, <strong>text position<\/strong>**,** <strong>text properties<\/strong>, and <strong>flags<\/strong> to alter the positioning of the text.<\/li>\n<\/ul>\n<p>We proceed to update <code>index.vue<\/code> to  conditionally render the <code>Card.vue<\/code> component as shown below:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"p-10\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-3xl\"<\/span>&gt;<\/span>Holiday Card Generator<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">header<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"flex border-b-2 mt-7 mb-7\"<\/span>&gt;<\/span>\n          <span class=\"hljs-comment\">&lt;!-- Header contents comes here --&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">header<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">form<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"lg:w-2\/5\"<\/span> @<span class=\"hljs-attr\">submit.prevent<\/span>=<span class=\"hljs-string\">\"handleSubmit\"<\/span>&gt;<\/span> <span class=\"hljs-comment\">&lt;!-- add handleSubmit --&gt;<\/span>\n          <span class=\"hljs-comment\">&lt;!-- Form contents comes here --&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n    \n        <span class=\"hljs-comment\">&lt;!-- Conditionally render card component --&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">v-if<\/span>=<span class=\"hljs-string\">\"showCard\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"mt-10\"<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Card<\/span>\n            <span class=\"hljs-attr\">:message<\/span>=<span class=\"hljs-string\">\"formData.message\"<\/span>\n            <span class=\"hljs-attr\">:name<\/span>=<span class=\"hljs-string\">\"formData.name\"<\/span>\n            <span class=\"hljs-attr\">:publicId<\/span>=<span class=\"hljs-string\">\"formData.publicId\"<\/span>\n          \/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n    <span class=\"hljs-comment\">\/\/imports here<\/span>\n    \n    <span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n      data() {\n        <span class=\"hljs-keyword\">return<\/span> {\n          <span class=\"hljs-comment\">\/\/data code here<\/span>\n        }\n      },\n      <span class=\"hljs-attr\">methods<\/span>: {\n        setTab(tabName) {\n          <span class=\"hljs-comment\">\/\/code here<\/span>\n        },\n    \n        handleSelectedImg(imgId, publicId) {\n          <span class=\"hljs-comment\">\/\/code here<\/span>\n        },\n    \n        <span class=\"hljs-comment\">\/\/add<\/span>\n        handleSubmit() {\n          <span class=\"hljs-keyword\">if<\/span> (<span class=\"hljs-keyword\">this<\/span>.imageId) {\n            <span class=\"hljs-keyword\">this<\/span>.showCard = <span class=\"hljs-literal\">true<\/span>\n          } <span class=\"hljs-keyword\">else<\/span> {\n            <span class=\"hljs-keyword\">this<\/span>.formData.error = <span class=\"hljs-literal\">true<\/span>\n          }\n        },\n      },\n    }\n    <\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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<p>In the snippet above, we created an <code>handleSubmit<\/code> function that checks if an image is selected, and then conditionally renders the <code>Card<\/code> component with necessary props.<\/p>\n<p><strong>Complete index.vue<\/strong><\/p>\n<p><a href=\"https:\/\/gist.github.com\/Mr-Malomz\/38877df09d38fff7c323bc7d29f825eb\">https:\/\/gist.github.com\/Mr-Malomz\/38877df09d38fff7c323bc7d29f825eb<\/a><\/p>\n<p><a href=\"https:\/\/gist.github.com\/Mr-Malomz\/38877df09d38fff7c323bc7d29f825eb\">https:\/\/gist.github.com\/Mr-Malomz\/38877df09d38fff7c323bc7d29f825eb<\/a><\/p>\n<p>We can test our application by starting the development server and creating different holiday cards.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_09154C99BD025007588E7E863D13AB13FE936D0B55FA69EF06F32C362371F6D6_1635421283900_screencapture-localhost-3000-2021-10-28-12_40_06.png\" alt=\"Working application\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"2015\"\/><\/p>\n<h2>Adding a shareable link support<\/h2>\n<p>Our card is incomplete if we can\u2019t share it with friends and family. To do this, we need to modify the <code>Card.vue<\/code> file to include a button to copy the generated image\u2019s URL.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cld-image<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"ref\"<\/span> <span class=\"hljs-attr\">:public-id<\/span>=<span class=\"hljs-string\">\"publicId\"<\/span> <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"1000\"<\/span>&gt;<\/span> <span class=\"hljs-comment\">&lt;!-- add ref --&gt;<\/span>\n          <span class=\"hljs-comment\">&lt;!-- Transformation codes goes here --&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">cld-image<\/span>&gt;<\/span>\n    \n        <span class=\"hljs-comment\">&lt;!-- add --&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"mt-10\"<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h5<\/span>&gt;<\/span>Shareable link<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h5<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span>\n            <span class=\"hljs-attr\">disabled<\/span>\n            <span class=\"hljs-attr\">:value<\/span>=<span class=\"hljs-string\">\"url\"<\/span>\n            <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"w-full lg:w-2\/5 h-10 border-&#91;#B7B3B3] border rounded-sm p-2 mr-4\"<\/span>\n          \/&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span>\n            <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"bg-gray-600 py-2 px-6 rounded-sm text-white font-semibold\"<\/span>\n            @<span class=\"hljs-attr\">click<\/span>=<span class=\"hljs-string\">\"handleCopyToClip\"<\/span>\n          &gt;<\/span>\n            {{ copy }}\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n    <span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n      <span class=\"hljs-attr\">props<\/span>: {\n        <span class=\"hljs-comment\">\/\/props goes here<\/span>\n      },\n    \n      <span class=\"hljs-comment\">\/\/add<\/span>\n      data() {\n        <span class=\"hljs-keyword\">return<\/span> {\n          <span class=\"hljs-attr\">url<\/span>: <span class=\"hljs-string\">''<\/span>,\n          <span class=\"hljs-attr\">copy<\/span>: <span class=\"hljs-string\">'Copy File'<\/span>,\n        }\n      },\n    \n      <span class=\"hljs-attr\">methods<\/span>: {\n        handleCopyToClip() {\n          navigator.clipboard\n            .writeText(<span class=\"hljs-keyword\">this<\/span>.url)\n            .then(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> (<span class=\"hljs-keyword\">this<\/span>.copy = <span class=\"hljs-string\">'Copied!'<\/span>))\n            .catch(<span class=\"hljs-function\">(<span class=\"hljs-params\">err<\/span>) =&gt;<\/span> <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">'error copying to clipboard'<\/span>, err))\n        },\n      },\n    \n      mounted() {\n        <span class=\"hljs-keyword\">this<\/span>.$nextTick(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> (<span class=\"hljs-params\"><\/span>) <\/span>{\n          <span class=\"hljs-keyword\">this<\/span>.url = <span class=\"hljs-keyword\">this<\/span>.$refs.ref.$el.src\n        })\n      },\n    }\n    <\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><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<p>The snippet above does the following:<\/p>\n<ul>\n<li>Create data properties and <code>ref<\/code> to access the Image DOM element.<\/li>\n<li>\n<code>handleCopyToClip<\/code> function that uses <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Clipboard\/writeText\">Clipboard API<\/a> to copy the returned URL on our device clipboard.<\/li>\n<li>Update the <code>url<\/code> by accessing the <code>src<\/code> property Cloudinary passed to the <code>cld-image<\/code> component when it mounts.<\/li>\n<li>Add <code>ref<\/code> to the <code>cld-image<\/code> component and markups for sharing links.<\/li>\n<\/ul>\n<p><strong>Complete Card.vue<\/strong><\/p>\n<p><a href=\"https:\/\/gist.github.com\/Mr-Malomz\/17c4ba7f313c9dce33b9ce76016e8471\">https:\/\/gist.github.com\/Mr-Malomz\/17c4ba7f313c9dce33b9ce76016e8471<\/a><\/p>\n<p><a href=\"https:\/\/gist.github.com\/Mr-Malomz\/17c4ba7f313c9dce33b9ce76016e8471\">https:\/\/gist.github.com\/Mr-Malomz\/17c4ba7f313c9dce33b9ce76016e8471<\/a><\/p>\n<p>The final output of our application should look like this:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_09154C99BD025007588E7E863D13AB13FE936D0B55FA69EF06F32C362371F6D6_1635421382079_screencapture-localhost-3000-2021-10-28-12_40_22.png\" alt=\"Working application with shareable link\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1993\" height=\"2160\"\/><\/p>\n<h1>Conclusion<\/h1>\n<p>This post discussed how to build a holiday card generator using Cloudinary\u2019s image transformations and Nuxt.js.<\/p>\n<!-- Hi, can you please include your GitHub link to the project as well? The gist you provided was very helpful! Thank you for the awesome build, would highly recommend to peers! -->\n<p>You may find these resources helpful:<\/p>\n<ul>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations\">Cloudinary Image Transformation<\/a>.<\/li>\n<li>\n<a href=\"https:\/\/tailwindcss.com\/\">TailwindCSS<\/a>.<\/li>\n<li>\n<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Clipboard\/writeText\">Browser clipboard<\/a>.<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.nuxtjs.org\/\">Cloudinary Nuxt.js module<\/a>.<\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":28190,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[134,370,372,371,315],"class_list":["post-28189","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guest-post","tag-image","tag-nuxtjs","tag-under-review","tag-vue"],"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>Create a holiday card generator in Nuxt.js<\/title>\n<meta name=\"description\" content=\"Create a holiday card generator using Nuxt.js and Cloudinary\" \/>\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\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Create a holiday card generator in Nuxt.js\" \/>\n<meta property=\"og:description\" content=\"Create a holiday card generator using Nuxt.js and Cloudinary\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-12-21T19:20:06+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925171\/Web_Assets\/blog\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e.jpg?_i=AA\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Create a holiday card generator in Nuxt.js\",\"datePublished\":\"2021-12-21T19:20:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/\"},\"wordCount\":8,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925171\/Web_Assets\/blog\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e.jpg?_i=AA\",\"keywords\":[\"Guest Post\",\"Image\",\"NuxtJS\",\"Under Review\",\"Vue\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2021\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/\",\"name\":\"Create a holiday card generator in Nuxt.js\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925171\/Web_Assets\/blog\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e.jpg?_i=AA\",\"datePublished\":\"2021-12-21T19:20:06+00:00\",\"description\":\"Create a holiday card generator using Nuxt.js and Cloudinary\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925171\/Web_Assets\/blog\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925171\/Web_Assets\/blog\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e.jpg?_i=AA\",\"width\":5658,\"height\":3772},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a holiday card generator in Nuxt.js\"}]},{\"@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\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Create a holiday card generator in Nuxt.js","description":"Create a holiday card generator using Nuxt.js and Cloudinary","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\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/","og_locale":"en_US","og_type":"article","og_title":"Create a holiday card generator in Nuxt.js","og_description":"Create a holiday card generator using Nuxt.js and Cloudinary","og_url":"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/","og_site_name":"Cloudinary Blog","article_published_time":"2021-12-21T19:20:06+00:00","twitter_card":"summary_large_image","twitter_image":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925171\/Web_Assets\/blog\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e.jpg?_i=AA","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/"},"author":{"name":"","@id":""},"headline":"Create a holiday card generator in Nuxt.js","datePublished":"2021-12-21T19:20:06+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/"},"wordCount":8,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925171\/Web_Assets\/blog\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e.jpg?_i=AA","keywords":["Guest Post","Image","NuxtJS","Under Review","Vue"],"inLanguage":"en-US","copyrightYear":"2021","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/","url":"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/","name":"Create a holiday card generator in Nuxt.js","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925171\/Web_Assets\/blog\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e.jpg?_i=AA","datePublished":"2021-12-21T19:20:06+00:00","description":"Create a holiday card generator using Nuxt.js and Cloudinary","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925171\/Web_Assets\/blog\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925171\/Web_Assets\/blog\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e.jpg?_i=AA","width":5658,"height":3772},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/create-a-holiday-card-generator-in-nuxt-js\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Create a holiday card generator in Nuxt.js"}]},{"@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":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925171\/Web_Assets\/blog\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e\/08282feec3b7bc242808bc17532ab68e4495c578-5658x3772-1_28190d5c4e.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28189","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\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=28189"}],"version-history":[{"count":0,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28189\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/28190"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=28189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=28189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=28189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}