<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shamsad Anam</title>
    <description>The latest articles on DEV Community by Shamsad Anam (@shamsadanam).</description>
    <link>https://dev.to/shamsadanam</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F491020%2F39ec5021-7110-4825-ad55-3150c42e5904.jpg</url>
      <title>DEV Community: Shamsad Anam</title>
      <link>https://dev.to/shamsadanam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shamsadanam"/>
    <language>en</language>
    <item>
      <title>How to generate PDF that supports modern CSS such as Tailwind</title>
      <dc:creator>Shamsad Anam</dc:creator>
      <pubDate>Sun, 07 Sep 2025 10:05:12 +0000</pubDate>
      <link>https://dev.to/shamsadanam/how-to-generate-pdf-that-supports-modern-css-such-as-tailwind-3h53</link>
      <guid>https://dev.to/shamsadanam/how-to-generate-pdf-that-supports-modern-css-such-as-tailwind-3h53</guid>
      <description>&lt;p&gt;Creating PDFs in Laravel with modern CSS like Tailwind used to be tricky. Traditional PDF generators often fail with Flexbox, Grid, or Tailwind classes. &lt;strong&gt;Spatie Browsershot&lt;/strong&gt; uses &lt;strong&gt;headless Chrome&lt;/strong&gt; to render HTML, so you can fully utilize modern CSS and JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Install Browsershot and Dependencies
&lt;/h2&gt;

&lt;p&gt;Install via Composer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require spatie/browsershot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Browsershot needs &lt;strong&gt;Node.js&lt;/strong&gt; and &lt;strong&gt;npm&lt;/strong&gt; (for Puppeteer). Install Node.js with nvm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;node
nvm use node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Puppeteer globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; puppeteer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Chromium will be downloaded automatically if Puppeteer is installed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. Create a Blade Template with Tailwind
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;resources/views/pdf/template.blade.php&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;PDF Example&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.tailwindcss.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-gray-100 p-10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"max-w-2xl mx-auto bg-white p-8 rounded shadow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-4xl font-bold text-center text-blue-600"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hello, PDF!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 text-gray-700"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;This PDF is fully styled with Tailwind CSS and modern CSS features.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Generate PDF from Blade Template
&lt;/h2&gt;

&lt;p&gt;Use Browsershot in a route or controller:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Spatie\Browsershot\Browsershot&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/pdf'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$pdfPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;storage_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'app/public/example.pdf'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;Browsershot&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'pdf.template'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'A4'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;landscape&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;showBackground&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pdfPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;download&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pdfPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tips:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;showBackground()&lt;/code&gt; renders backgrounds.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;format('A4')&lt;/code&gt; sets page size.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.pdf()&lt;/code&gt; outputs directly to the browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Tailwind Tips with Browsershot
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Use CDN for Tailwind in Blade.&lt;/li&gt;
&lt;li&gt;For custom fonts, use web fonts or inline &lt;code&gt;@font-face&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use absolute URLs for images.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  5. Advanced: Compiled Tailwind
&lt;/h2&gt;

&lt;p&gt;If using Laravel Mix or Vite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Browsershot&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'pdf.template'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setNodeBinary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/usr/bin/node'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setNpmBinary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/usr/bin/npm'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pdfPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Browsershot&lt;/strong&gt; allows Laravel to generate PDFs with full support for modern CSS, Tailwind, Flexbox, Grid, and JavaScript. Ideal for invoices, reports, certificates, or any styled PDF content.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>pdf</category>
      <category>tailwindcss</category>
      <category>browsershot</category>
    </item>
    <item>
      <title>What is Expo?</title>
      <dc:creator>Shamsad Anam</dc:creator>
      <pubDate>Mon, 02 Oct 2023 09:03:55 +0000</pubDate>
      <link>https://dev.to/shamsadanam/what-is-expo-2lhj</link>
      <guid>https://dev.to/shamsadanam/what-is-expo-2lhj</guid>
      <description>&lt;p&gt;Recently, one of my clients asked me to set up an Expo project. Although I had no prior experience with Expo, I agreed when I learned that it utilizes JavaScript.&lt;/p&gt;

&lt;p&gt;After conducting some research, I discovered the following:&lt;/p&gt;

&lt;p&gt;Expo is an open-source framework that leverages React Native to develop native applications for Android, iOS, and the web. Essentially, it serves as an alternative to Flutter and employs JavaScript syntax.&lt;/p&gt;

&lt;p&gt;I experimented with several methods for setting up the project. If you're interested in quickly installing and exploring the framework, I recommend using the tab navigation template with the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx create-expo-app@latest --template tabs@49&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To initiate the development server, simply execute:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx expo start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For learning Expo, I strongly suggest perusing their excellent documentation, which contains a wealth of examples. You can find it at the following link:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.expo.dev/" rel="noopener noreferrer"&gt;Link&lt;/a&gt; to official documentation.&lt;/p&gt;

&lt;p&gt;Happy Coding.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>mobile</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>How to add local fonts to my website?</title>
      <dc:creator>Shamsad Anam</dc:creator>
      <pubDate>Thu, 15 Oct 2020 20:18:16 +0000</pubDate>
      <link>https://dev.to/shamsadanam/how-to-add-local-fonts-to-my-website-1hd3</link>
      <guid>https://dev.to/shamsadanam/how-to-add-local-fonts-to-my-website-1hd3</guid>
      <description>&lt;p&gt;Sometimes client might ask you to add a font to his/her website that he found or purchased online. Now you have to use this on the website. &lt;/p&gt;

&lt;p&gt;Those who like me are used to using Google Fonts or the default fonts on the Computer, this might seem like tricky. But it actually is not.&lt;/p&gt;

&lt;p&gt;So, How do we achieve this? By using the &lt;code&gt;@font-face&lt;/code&gt; rule of CSS.&lt;/p&gt;

&lt;p&gt;First you have to download the font file and put it inside your project folder. The most supported font files are - &lt;strong&gt;TTF/OTF, WOFF, and WOFF2&lt;/strong&gt;.&lt;br&gt;
Now all you have to do is to add this to your CSS and give it a name. This name is what you will use to use the font.&lt;br&gt;
For example,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@font-face {
  font-family: myFirstFont; /*The name you choose goes here*/
  src: url(sansation_light.woff);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks for reading.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/ShamsadAnam" rel="noopener noreferrer"&gt;My Twitter Profile&lt;/a&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>html</category>
    </item>
  </channel>
</rss>
