<?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>Forem: Angular Material Dev</title>
    <description>The latest articles on Forem by Angular Material Dev (@ngmaterialdev).</description>
    <link>https://forem.com/ngmaterialdev</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%2Forganization%2Fprofile_image%2F7551%2F951317fd-33cb-4e29-8b15-9246096c9797.png</url>
      <title>Forem: Angular Material Dev</title>
      <link>https://forem.com/ngmaterialdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ngmaterialdev"/>
    <language>en</language>
    <item>
      <title>Summer Sale: 50% Off Angular Material Blocks (Ends April 9)</title>
      <dc:creator>Dharmen Shah</dc:creator>
      <pubDate>Fri, 03 Apr 2026 15:05:23 +0000</pubDate>
      <link>https://forem.com/ngmaterialdev/summer-sale-50-off-angular-material-blocks-ends-april-9-1632</link>
      <guid>https://forem.com/ngmaterialdev/summer-sale-50-off-angular-material-blocks-ends-april-9-1632</guid>
      <description>&lt;p&gt;Just a quick reminder — the &lt;strong&gt;Summer Sale&lt;/strong&gt; is live!&lt;/p&gt;

&lt;p&gt;All &lt;strong&gt;Angular Material Blocks licenses are 50% off&lt;/strong&gt;, and the discount ends tonight.&lt;/p&gt;

&lt;p&gt;If you're building dashboards, admin panels, internal tools, or SaaS apps with Angular Material, Angular Material Blocks can save a significant amount of UI development time with production-ready blocks, layouts, and templates.&lt;/p&gt;

&lt;h3&gt;
  
  
  What you get
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;300+ Angular Material UI blocks&lt;/li&gt;
&lt;li&gt;Application shells and layouts&lt;/li&gt;
&lt;li&gt;Dashboard templates&lt;/li&gt;
&lt;li&gt;Marketing page sections&lt;/li&gt;
&lt;li&gt;CLI to install blocks directly into your project&lt;/li&gt;
&lt;li&gt;Built for Angular 21 + Angular Material + Tailwind CSS&lt;/li&gt;
&lt;li&gt;Lifetime access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After the sale, prices go back to normal.&lt;/p&gt;

&lt;p&gt;👉 Get 50% off here: &lt;a href="https://ui.angular-material.dev/#pricing" rel="noopener noreferrer"&gt;https://ui.angular-material.dev/#pricing&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you only want to get templates, all of them are also on 50% discount, head over to &lt;a href="https://ui.angular-material.dev/templates/" rel="noopener noreferrer"&gt;https://ui.angular-material.dev/templates/&lt;/a&gt;, find your favourite template &amp;amp; simply get it!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thanks for your support.&lt;/p&gt;

&lt;p&gt;Best,&lt;br&gt;
&lt;strong&gt;Dharmen Shah&lt;/strong&gt;&lt;br&gt;
Creator, Angular Material Blocks&lt;/p&gt;

</description>
      <category>angular</category>
      <category>angularmaterial</category>
      <category>tailwindcss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>You can now get templates individually 🎉</title>
      <dc:creator>Dharmen Shah</dc:creator>
      <pubDate>Wed, 18 Mar 2026 15:39:07 +0000</pubDate>
      <link>https://forem.com/ngmaterialdev/you-can-now-get-templates-individually-52lm</link>
      <guid>https://forem.com/ngmaterialdev/you-can-now-get-templates-individually-52lm</guid>
      <description>&lt;p&gt;Hi there,&lt;/p&gt;

&lt;p&gt;I’ve got a big update for you 👇&lt;/p&gt;

&lt;h3&gt;
  
  
  ✨ You can now purchase templates individually
&lt;/h3&gt;

&lt;p&gt;Until now, templates in &lt;strong&gt;Angular Material Blocks&lt;/strong&gt; were only available as part of the full bundle.&lt;/p&gt;

&lt;p&gt;Starting today, you can &lt;strong&gt;buy individual templates separately&lt;/strong&gt; — so you can pick exactly what you need for your project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this matters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No need to buy the full bundle&lt;/li&gt;
&lt;li&gt;Start faster with a specific template&lt;/li&gt;
&lt;li&gt;Pay only for what you actually use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you’re building a &lt;strong&gt;dashboard, analytics platform, or workflow system&lt;/strong&gt;, you can now choose the right template and get started instantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  What you get
&lt;/h3&gt;

&lt;p&gt;All templates are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built with &lt;strong&gt;Angular 21 + Angular Material&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Styled using &lt;strong&gt;Tailwind CSS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production-ready&lt;/strong&gt; and fully responsive&lt;/li&gt;
&lt;li&gt;Designed for real-world applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Browse available templates&lt;br&gt;
&lt;a href="https://ui.angular-material.dev/templates" rel="noopener noreferrer"&gt;https://ui.angular-material.dev/templates&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As always, thanks for building with Angular Material Blocks.&lt;/p&gt;

&lt;p&gt;Best,&lt;br&gt;
&lt;strong&gt;Dharmen Shah&lt;/strong&gt;&lt;br&gt;
Creator, Angular Material Blocks&lt;/p&gt;

</description>
      <category>angular</category>
      <category>angularmaterial</category>
      <category>tailwindcss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>New Angular Dashboard Template: Overview</title>
      <dc:creator>Dharmen Shah</dc:creator>
      <pubDate>Sun, 08 Mar 2026 06:36:19 +0000</pubDate>
      <link>https://forem.com/ngmaterialdev/new-angular-dashboard-template-overview-4e60</link>
      <guid>https://forem.com/ngmaterialdev/new-angular-dashboard-template-overview-4e60</guid>
      <description>&lt;p&gt;Hi there,&lt;/p&gt;

&lt;p&gt;I’m excited to announce a &lt;strong&gt;new template&lt;/strong&gt; in &lt;strong&gt;Angular Material Blocks&lt;/strong&gt; 🎉&lt;/p&gt;

&lt;h3&gt;
  
  
  ✨ Introducing: Overview
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt; is a modern &lt;strong&gt;dashboard template&lt;/strong&gt; designed for building data-driven applications with rich visualizations and interactive analytics.&lt;/p&gt;

&lt;p&gt;It includes multiple ready-to-use dashboard pages such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;KPI Overview&lt;/strong&gt; – track support metrics, SLA performance, and call volume trends&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retention Analysis&lt;/strong&gt; – cohort retention tables and user engagement insights&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow Scenario Analysis&lt;/strong&gt; – simulate operational scenarios and measure impact&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents Management&lt;/strong&gt; – advanced tables with filtering, sorting, and performance metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8vqzltyxw411the96wgc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8vqzltyxw411the96wgc.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ep10ky0hm5ndaesi8n6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ep10ky0hm5ndaesi8n6.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyg5ofd9hk4nk44f84i2r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyg5ofd9hk4nk44f84i2r.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F86p3vky7o4y0mjkilo61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F86p3vky7o4y0mjkilo61.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrwop43t6u1t76c48flm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrwop43t6u1t76c48flm.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5sikinhwfwfmjxgfeuy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5sikinhwfwfmjxgfeuy.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Built with a modern Angular stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Angular 21&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Angular Material 21&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tailwind CSS 4&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zoneless architecture&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Responsive layout&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Light &amp;amp; dark themes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ng2-charts (Chart.js)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drawers, overlays, and advanced UI patterns&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The template is designed for building &lt;strong&gt;analytics dashboards, workflow tools, internal systems, and operational platforms&lt;/strong&gt; with a highly customizable and performant architecture.&lt;/p&gt;

&lt;p&gt;🔎 &lt;strong&gt;Live preview&lt;/strong&gt;&lt;br&gt;
&lt;a href="http://template-overview.angular-material.dev/" rel="noopener noreferrer"&gt;http://template-overview.angular-material.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;Learn more about the template&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://ui.angular-material.dev/templates#overview" rel="noopener noreferrer"&gt;https://ui.angular-material.dev/templates#overview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for building with Angular Material Blocks.&lt;/p&gt;

&lt;p&gt;Best,&lt;br&gt;
&lt;strong&gt;Dharmen Shah&lt;/strong&gt;&lt;br&gt;
Creator, Angular Material Blocks&lt;/p&gt;

</description>
      <category>angular</category>
      <category>angularmaterial</category>
      <category>webdev</category>
      <category>websitetemplate</category>
    </item>
    <item>
      <title>Implement Enter/Exit Animations with Angular CDK Overlay</title>
      <dc:creator>Dharmen Shah</dc:creator>
      <pubDate>Fri, 16 Jan 2026 05:44:20 +0000</pubDate>
      <link>https://forem.com/ngmaterialdev/implement-enterexit-animations-with-angular-cdk-overlay-pd3</link>
      <guid>https://forem.com/ngmaterialdev/implement-enterexit-animations-with-angular-cdk-overlay-pd3</guid>
      <description>&lt;p&gt;Angular CDK's Overlay module provides a powerful way to create floating panels that appear over your application's content. These overlays are commonly used for dropdowns, tooltips, modals, and context menus. While overlays work great out of the box, adding smooth enter and exit animations can significantly enhance the user experience.&lt;/p&gt;

&lt;p&gt;In this article, we'll explore how to implement sophisticated enter/exit animations with Angular CDK Overlay using signals, dynamic animation classes and understand the true power of new &lt;a href="https://angular.dev/guide/animations" rel="noopener noreferrer"&gt;Angular Animations's APIs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Angular CDK Overlay?
&lt;/h2&gt;

&lt;p&gt;The Angular CDK (Component Dev Kit) Overlay is a module that allows you to open floating panels on top of the current page. Unlike traditional CSS positioning, the Overlay module handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Positioning&lt;/strong&gt;: Automatically positions the overlay relative to a trigger element&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repositioning&lt;/strong&gt;: Dynamically adjusts position when the overlay doesn't fit in the viewport&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backdrop Management&lt;/strong&gt;: Provides optional backdrop with click-outside handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Z-Index Management&lt;/strong&gt;: Manages stacking context for multiple overlays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scroll Handling&lt;/strong&gt;: Repositions or closes overlays on scroll&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we begin, ensure you have Angular CDK installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng add @angular/cdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the basic styles for the overlay are imported correctly in your application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;'@angular/cdk/overlay-prebuilt.css'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creating the Overlay Wrapper Component
&lt;/h2&gt;

&lt;p&gt;Let's build a reusable overlay wrapper component that handles animations automatically based on the overlay's position.&lt;/p&gt;

&lt;h3&gt;
  
  
  Component Structure
&lt;/h3&gt;

&lt;p&gt;First, let's create the component with signals for reactive state management:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;CdkConnectedOverlay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;CdkOverlayOrigin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;STANDARD_DROPDOWN_BELOW_POSITIONS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ConnectedOverlayPositionChange&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ConnectedPosition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/cdk/overlay&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ChangeDetectionStrategy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-overlay-wrapper&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./overlay-wrapper.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;changeDetection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChangeDetectionStrategy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OnPush&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CdkConnectedOverlay&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OverlayWrapperComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Input signals for component configuration&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;trigger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CdkOverlayOrigin&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;positions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ConnectedPosition&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;panelClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// State signals&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;isOpen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;animationDirection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;up&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;down&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;down&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Computed animation classes based on direction&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;enterAnimationClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;animationDirection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;up&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;animate-fade-in-up&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;animate-fade-in-down&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;leaveAnimationClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;animationDirection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;up&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;animate-fade-out-down&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;animate-fade-out-up&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Computed overlay positions with offset&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;overlayPositions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;STANDARD_DROPDOWN_BELOW_POSITIONS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;offsetY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;overlayY&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bottom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;toggleOverlay&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;onPositionChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ConnectedOverlayPositionChange&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;animationDirection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connectionPair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;overlayY&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bottom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;up&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;down&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;);&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;h3&gt;
  
  
  Key Features Explained
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Signals for Reactive State&lt;/strong&gt;: We use Angular signals for state management, making the component reactive and efficient.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Animation Classes&lt;/strong&gt;: The component automatically determines whether the overlay opens upward or downward and applies appropriate animation classes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Position Tracking&lt;/strong&gt;: The &lt;code&gt;onPositionChange&lt;/code&gt; method tracks the overlay's position, allowing us to adjust animations accordingly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible Configuration&lt;/strong&gt;: Input signals allow customization of trigger element, positions, and panel classes.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Instead of &lt;code&gt;STANDARD_DROPDOWN_BELOW_POSITIONS&lt;/code&gt;, you can also use &lt;code&gt;STANDARD_DROPDOWN_ADJACENT_POSITIONS&lt;/code&gt; to position the overlay adjacent to the trigger element. To learn more about how positioning works, see the &lt;a href="https://material.angular.dev/cdk/overlay/overview#position-strategies" rel="noopener noreferrer"&gt;official Angular CDK Overlay documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Template Implementation
&lt;/h3&gt;

&lt;p&gt;Now let's create the template that uses the CDK Connected Overlay:&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="nt"&gt;&amp;lt;ng-template&lt;/span&gt;
  &lt;span class="na"&gt;cdkConnectedOverlay&lt;/span&gt;
  &lt;span class="na"&gt;[cdkConnectedOverlayOrigin]=&lt;/span&gt;&lt;span class="s"&gt;"trigger()"&lt;/span&gt;
  &lt;span class="na"&gt;[cdkConnectedOverlayOpen]=&lt;/span&gt;&lt;span class="s"&gt;"isOpen()"&lt;/span&gt;
  &lt;span class="na"&gt;[cdkConnectedOverlayPositions]=&lt;/span&gt;&lt;span class="s"&gt;"overlayPositions()"&lt;/span&gt;
  &lt;span class="na"&gt;[cdkConnectedOverlayHasBackdrop]=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
  &lt;span class="na"&gt;[cdkConnectedOverlayBackdropClass]=&lt;/span&gt;&lt;span class="s"&gt;"'cdk-overlay-transparent-backdrop'"&lt;/span&gt;
  &lt;span class="na"&gt;[cdkConnectedOverlayPanelClass]=&lt;/span&gt;&lt;span class="s"&gt;"panelClass()"&lt;/span&gt;
  &lt;span class="na"&gt;(backdropClick)=&lt;/span&gt;&lt;span class="s"&gt;"close()"&lt;/span&gt;
  &lt;span class="na"&gt;(positionChange)=&lt;/span&gt;&lt;span class="s"&gt;"onPositionChange($event)"&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;[animate.enter]=&lt;/span&gt;&lt;span class="s"&gt;"enterAnimationClass()"&lt;/span&gt;
    &lt;span class="na"&gt;[animate.leave]=&lt;/span&gt;&lt;span class="s"&gt;"leaveAnimationClass()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ng-content&lt;/span&gt; &lt;span class="nt"&gt;/&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;/ng-template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Template Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;cdkConnectedOverlay&lt;/strong&gt;: The main directive that creates the overlay&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cdkConnectedOverlayOrigin&lt;/strong&gt;: References the trigger element&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cdkConnectedOverlayOpen&lt;/strong&gt;: Controls overlay visibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cdkConnectedOverlayPositions&lt;/strong&gt;: Array of preferred positions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cdkConnectedOverlayHasBackdrop&lt;/strong&gt;: Enables backdrop for click-outside detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[cdkConnectedOverlayBackdropClass]="'cdk-overlay-transparent-backdrop'"&lt;/strong&gt;: Sets the backdrop class to transparent. Note that &lt;code&gt;cdk-overlay-transparent-backdrop&lt;/code&gt; is a class that is provided by the Angular CDK library..&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Projection&lt;/strong&gt;: &lt;code&gt;&amp;lt;ng-content /&amp;gt;&lt;/code&gt; allows flexible content insertion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The real power of new Angular Animations APIs
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;animate.enter&lt;/code&gt; and &lt;code&gt;animate.leave&lt;/code&gt; are Angular's built-in animation APIs that apply CSS animation classes to elements during enter and exit transitions. These APIs are designed to apply animation classes only when elements are being added to or removed from the DOM.&lt;/p&gt;

&lt;p&gt;The key benefit is that Angular automatically manages the element's lifecycle during animations. When using &lt;code&gt;animate.leave&lt;/code&gt;, Angular waits for the animation to complete before removing the element from the DOM. In our case, this means the overlay content remains visible throughout the exit animation, and the framework handles the timing automatically—we don't need to write any extra code to delay the destruction or manually remove elements. This is all managed by Angular's animation system.&lt;/p&gt;

&lt;p&gt;For more details, see the &lt;a href="https://angular.dev/guide/animations/enter-and-leave" rel="noopener noreferrer"&gt;official Angular animations guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  CSS Animation Classes
&lt;/h2&gt;

&lt;p&gt;Now, let's implement the CSS animation classes. These animations provide smooth fade and slide effects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Base animation configuration */&lt;/span&gt;
&lt;span class="nc"&gt;.animate-fade-in-up&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.animate-fade-in-down&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.animate-fade-out-up&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.animate-fade-out-down&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation-duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200ms&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;animation-timing-function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cubic-bezier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;animation-fill-mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;both&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Fade in from bottom (sliding up) */&lt;/span&gt;
&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;fadeInUp&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;from&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.animate-fade-in-up&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation-name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fadeInUp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Fade in from top (sliding down) */&lt;/span&gt;
&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;fadeInDown&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;from&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-10px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.animate-fade-in-down&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation-name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fadeInDown&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Fade out to bottom (sliding down) */&lt;/span&gt;
&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;fadeOutDown&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;from&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.animate-fade-out-down&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation-name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fadeOutDown&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Fade out to top (sliding up) */&lt;/span&gt;
&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;fadeOutUp&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;from&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-10px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.animate-fade-out-up&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation-name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fadeOutUp&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;h3&gt;
  
  
  Animation Details
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Duration&lt;/strong&gt;: 200ms provides a snappy but smooth animation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timing Function&lt;/strong&gt;: &lt;code&gt;cubic-bezier(0.4, 0, 0.2, 1)&lt;/code&gt; creates a natural ease-out effect&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transform Distance&lt;/strong&gt;: 10px vertical movement is subtle yet noticeable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opacity Transition&lt;/strong&gt;: Fades from 0 to 1 (enter) or 1 to 0 (exit)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Using the Overlay Wrapper
&lt;/h2&gt;

&lt;p&gt;Here's how to use the overlay wrapper component in your application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;viewChild&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CdkOverlayOrigin&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/cdk/overlay&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;OverlayWrapperComponent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./overlay-wrapper.component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-dropdown-example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
    &amp;lt;button
      #trigger="cdkOverlayOrigin"
      cdkOverlayOrigin
      (click)="overlay.toggleOverlay()"&amp;gt;
      Open Menu
    &amp;lt;/button&amp;gt;

    &amp;lt;app-overlay-wrapper
      [trigger]="trigger"
      #overlay&amp;gt;
      &amp;lt;div class="menu-content"&amp;gt;
        &amp;lt;button (click)="overlay.close()"&amp;gt;Option 1&amp;lt;/button&amp;gt;
        &amp;lt;button (click)="overlay.close()"&amp;gt;Option 2&amp;lt;/button&amp;gt;
        &amp;lt;button (click)="overlay.close()"&amp;gt;Option 3&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/app-overlay-wrapper&amp;gt;
  `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CdkOverlayOrigin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;OverlayWrapperComponent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DropdownExampleComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;overlay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;viewChild&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;OverlayWrapperComponent&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;h3&gt;
  
  
  Additional Styling
&lt;/h3&gt;

&lt;p&gt;Add some basic styling for your overlay content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.dropdown-panel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.15&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.menu-content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.15&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.menu-content&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;background-color&lt;/span&gt; &lt;span class="m"&gt;150ms&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.menu-content&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.04&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;h2&gt;
  
  
  Looking for more?
&lt;/h2&gt;

&lt;p&gt;Head out to &lt;a href="https://ui.angular-material.dev/blocks/marketing/elements/flyout-menus" rel="noopener noreferrer"&gt;Flyout Menus by Angular Material Blocks&lt;/a&gt; for a more advanced implementation of flyout menus with Angular CDK Overlay.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ui.angular-material.dev/blocks/marketing/elements/flyout-menus" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5st5ib5dh5n1oqwwmhgi.png" alt="flyout menu examples on ui.angular-material.dev"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Implementing enter/exit animations with Angular CDK Overlay enhances the user experience by providing visual feedback and smooth transitions. By combining Angular's signals with CDK's positioning system, we've created a reusable component that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatically adjusts animations based on overlay position&lt;/li&gt;
&lt;li&gt;Provides a clean, reactive API using signals&lt;/li&gt;
&lt;li&gt;Supports flexible configuration through input signals&lt;/li&gt;
&lt;li&gt;Maintains performance with OnPush change detection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The approach demonstrated here can be adapted for various use cases including dropdowns, tooltips, context menus, and custom floating panels. The key is to keep animations subtle, performant, and purposeful.&lt;/p&gt;

&lt;p&gt;Happy coding! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  Live Playground
&lt;/h2&gt;

&lt;p&gt;

&lt;iframe src="https://stackblitz.com/edit/euwp5rmr?embed=1&amp;amp;file=src%2Foverlay-wrapper%2Foverlay-wrapper.html" width="100%" height="500"&gt;
&lt;/iframe&gt;


&lt;/p&gt;

</description>
      <category>angular</category>
      <category>angularcdk</category>
      <category>angularanimations</category>
      <category>webdev</category>
    </item>
    <item>
      <title>New Flyout Menu Blocks Built with Angular CDK Overlay</title>
      <dc:creator>Dharmen Shah</dc:creator>
      <pubDate>Fri, 16 Jan 2026 05:40:52 +0000</pubDate>
      <link>https://forem.com/ngmaterialdev/new-flyout-menu-blocks-built-with-angular-cdk-overlay-4j18</link>
      <guid>https://forem.com/ngmaterialdev/new-flyout-menu-blocks-built-with-angular-cdk-overlay-4j18</guid>
      <description>&lt;p&gt;We’ve just added a brand new set of blocks to Angular Material Blocks 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Introducing: Flyout Menus
&lt;/h2&gt;

&lt;p&gt;These new Flyout Menu blocks are built using Angular CDK Overlay APIs, combined with Angular Material and Tailwind CSS—designed for modern, interactive UI patterns.&lt;/p&gt;

&lt;p&gt;They’re perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marketing and product navigation&lt;/li&gt;
&lt;li&gt;Feature and pricing flyouts&lt;/li&gt;
&lt;li&gt;Rich menus with layered interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All blocks are production-ready, accessible, and easy to integrate into real Angular apps.&lt;/p&gt;

&lt;p&gt;👉 Explore the new flyout menus here:&lt;br&gt;
&lt;a href="https://ui.angular-material.dev/blocks/marketing/elements/flyout-menus" rel="noopener noreferrer"&gt;https://ui.angular-material.dev/blocks/marketing/elements/flyout-menus&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>angularmaterial</category>
      <category>tailwindcss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>New Release 🚀 Insights Template for Angular 20 &amp; Tailwind 4</title>
      <dc:creator>Dharmen Shah</dc:creator>
      <pubDate>Tue, 16 Dec 2025 06:07:45 +0000</pubDate>
      <link>https://forem.com/ngmaterialdev/new-release-insights-template-for-angular-20-tailwind-4-c6a</link>
      <guid>https://forem.com/ngmaterialdev/new-release-insights-template-for-angular-20-tailwind-4-c6a</guid>
      <description>&lt;p&gt;Hi there 👋,&lt;/p&gt;

&lt;p&gt;I am excited to announce the launch of our newest premium template:&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Insights — A Data-Driven Template for Angular
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosj6gzvdomlbzveymjdn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosj6gzvdomlbzveymjdn.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Insights is built for one purpose: to help you feed, filter, and analyze data with clarity — while giving you a production-ready UI that feels clean, modern, and customizable.&lt;/p&gt;

&lt;p&gt;Whether you're building dashboards, analytics tools, admin systems, or CRUD apps, Insights gives you the structure, components, and patterns you need to move fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's inside Insights?
&lt;/h3&gt;

&lt;p&gt;✔️ Dynamic Filtering + URL Query Parameters&lt;br&gt;
Users can refine data visualizations with shareable deep-links.&lt;/p&gt;

&lt;p&gt;✔️ Rich Charting&lt;br&gt;
Powered by ng2-charts (Chart.js) with reusable chart compositions.&lt;/p&gt;

&lt;p&gt;✔️ Dark &amp;amp; Light Themes&lt;br&gt;
Beautiful defaults with full customization support.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5agqqo25qk54jbuxylhq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5agqqo25qk54jbuxylhq.png" alt=" " width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✔️ Full Application Flows&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign-in &amp;amp; onboarding&lt;/li&gt;
&lt;li&gt;Reports dashboard&lt;/li&gt;
&lt;li&gt;Transactions&lt;/li&gt;
&lt;li&gt;Settings &amp;amp; user management&lt;/li&gt;
&lt;li&gt;Tables with input drawers&lt;/li&gt;
&lt;li&gt;Interactive filterbar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is connected and ready to plug into real backend APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Angular 20&lt;/li&gt;
&lt;li&gt;Angular Material 20&lt;/li&gt;
&lt;li&gt;Tailwind CSS 4&lt;/li&gt;
&lt;li&gt;Zoneless&lt;/li&gt;
&lt;li&gt;Chart.js (ng2-charts)&lt;/li&gt;
&lt;li&gt;Completely responsive&lt;/li&gt;
&lt;li&gt;Accessible &amp;amp; semantic&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why developers love it
&lt;/h3&gt;

&lt;p&gt;Because Insights removes UI boilerplate—so you can focus on your product logic.&lt;/p&gt;

&lt;p&gt;It’s flexible enough for startups and powerful enough for enterprise dashboards.&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 Explore the Insights Template
&lt;/h3&gt;

&lt;p&gt;Live preview -&amp;gt; &lt;a href="https://template-insights.angular-material.dev/" rel="noopener noreferrer"&gt;https://template-insights.angular-material.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More details -&amp;gt; &lt;a href="https://ui.angular-material.dev/templates#insights" rel="noopener noreferrer"&gt;https://ui.angular-material.dev/templates#insights&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy building!&lt;br&gt;
Dharmen Shah&lt;/p&gt;

</description>
      <category>angular</category>
      <category>angularmaterial</category>
      <category>sass</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🚀 New SaaS Website Template Added: "Database" Is Now Live</title>
      <dc:creator>Dharmen Shah</dc:creator>
      <pubDate>Tue, 25 Nov 2025 06:17:20 +0000</pubDate>
      <link>https://forem.com/ngmaterialdev/new-saas-website-template-added-database-is-now-live-5fh9</link>
      <guid>https://forem.com/ngmaterialdev/new-saas-website-template-added-database-is-now-live-5fh9</guid>
      <description>&lt;p&gt;We’re excited to announce a brand-new addition to Angular Material Blocks — introducing Database, a complete website template designed for SaaS products, developer tools, and modern cloud platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database&lt;/strong&gt; is built with the latest Angular ecosystem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular 20&lt;/li&gt;
&lt;li&gt;Angular Material 20&lt;/li&gt;
&lt;li&gt;Tailwind CSS 4&lt;/li&gt;
&lt;li&gt;Zoneless architecture&lt;/li&gt;
&lt;li&gt;Light &amp;amp; Dark theme support&lt;/li&gt;
&lt;li&gt;Markdown docs using marked.js&lt;/li&gt;
&lt;li&gt;Shiki-powered code highlighting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SaaS website template showcasing DataBase product with responsive desktop and mobile interfaces highlighting web application features&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 What’s inside?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  A beautifully designed landing page
&lt;/h3&gt;

&lt;p&gt;Landing page for a modern database service with usage statistics and pricing information&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyt8z5x0o08gr3l63ltno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyt8z5x0o08gr3l63ltno.png" alt="Landing page" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing page
&lt;/h3&gt;

&lt;p&gt;Database pricing page showing three subscription tiers with different features and pricing for Starter, Teams, and Business plans.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkxf0fyqkoy3oecg7asua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkxf0fyqkoy3oecg7asua.png" alt="Pricing page" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  About page
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuhvo29itqkw2m4u1153k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuhvo29itqkw2m4u1153k.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A markdown-driven changelog system
&lt;/h3&gt;

&lt;p&gt;Changelog is written using Markdown with custom angular components and redered using markedjs!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhr03y3nufq127wplpvag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhr03y3nufq127wplpvag.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Shiki powered code highlighting
&lt;/h3&gt;

&lt;p&gt;Shiki is the goto highlighter for codes! And it was perfect fit for this template.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhrspcqartshjq6o6z11u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhrspcqartshjq6o6z11u.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whether you’re launching a new SaaS, building a DevTool, or creating documentation for your product, Database gives you a professional, production-ready foundation to ship faster.&lt;/p&gt;

&lt;p&gt;👉 Live Preview: &lt;a href="https://template-database.angular-material.dev/" rel="noopener noreferrer"&gt;https://template-database.angular-material.dev/&lt;/a&gt;&lt;br&gt;
👉 Get the Template: &lt;a href="https://ui.angular-material.dev/templates#database" rel="noopener noreferrer"&gt;https://ui.angular-material.dev/templates#database&lt;/a&gt;&lt;br&gt;
👉 All Blocks &amp;amp; Templates: &lt;a href="https://ui.angular-material.dev/" rel="noopener noreferrer"&gt;https://ui.angular-material.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have any feedback or need help integrating the template into your Angular project, we’re always happy to help!&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>angular</category>
      <category>tailwindcss</category>
      <category>template</category>
      <category>webdev</category>
    </item>
    <item>
      <title>New Release: The Complete Dashboard Template for Modern Angular Applications</title>
      <dc:creator>Dharmen Shah</dc:creator>
      <pubDate>Wed, 22 Oct 2025 11:46:54 +0000</pubDate>
      <link>https://forem.com/ngmaterialdev/new-release-the-complete-dashboard-template-for-modern-angular-applications-11ho</link>
      <guid>https://forem.com/ngmaterialdev/new-release-the-complete-dashboard-template-for-modern-angular-applications-11ho</guid>
      <description>&lt;p&gt;Today, we're launching our most ambitious and powerful product yet: The Dashboard Template.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;See more details at: &lt;a href="https://ui.angular-material.dev/templates#dashboard" rel="noopener noreferrer"&gt;https://ui.angular-material.dev/templates#dashboard&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This isn't just a new set of blocks. It's a complete, production-ready application starter, built on the most modern Angular stack available. We designed it to be the perfect foundation for your customer-facing analytics, helping you drive revenue and ship your product in a fraction of the time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jgep9pmfksf3oqauzyf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jgep9pmfksf3oqauzyf.png" alt=" " width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8tqckn3vatzqe528q7y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8tqckn3vatzqe528q7y.png" alt=" " width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Complete SaaS Dashboard, Out-of-the-Box
&lt;/h2&gt;

&lt;p&gt;This template includes every core feature you need for a modern data application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📊 Analytics Overview: A full dashboard with KPI cards, usage meters, ng2-charts with custom tooltips, and more.&lt;/li&gt;
&lt;li&gt;📄 Advanced Data Tables: A "Details" page with robust, multi-select filters and a clean layout.&lt;/li&gt;
&lt;li&gt;⚙️ Complete Settings Pages: Pre-built, functional forms for General, Billing &amp;amp; Usage, and User Management (with roles).&lt;/li&gt;
&lt;li&gt;🎨 Full Theming: Beautiful light/dark modes and full customization capabilities to match your corporate identity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqypd6be7gflqj0tmu7xt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqypd6be7gflqj0tmu7xt.png" alt=" " width="800" height="1733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ee2vicr46agq9515uij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ee2vicr46agq9515uij.png" alt=" " width="800" height="1733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F540bfnhej49b7pdzupxh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F540bfnhej49b7pdzupxh.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcvhzheoy0nxt0pm6zyf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcvhzheoy0nxt0pm6zyf.png" alt=" " width="800" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Powered by a Cutting-Edge Tech Stack
&lt;/h2&gt;

&lt;p&gt;We built this on a future-proof foundation, so you can start with the best:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular 20 with Angular Material&lt;/li&gt;
&lt;li&gt;Zoneless Architecture (for peak performance and simplicity)&lt;/li&gt;
&lt;li&gt;Tailwind CSS 4&lt;/li&gt;
&lt;li&gt;New Angular Animations API&lt;/li&gt;
&lt;li&gt;Chartjs with custom tooltips&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stop rebuilding the same boilerplate. Get the ultimate starter template for your next big idea and focus on what makes your application unique.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ui.angular-material.dev/templates#dashboard" rel="noopener noreferrer"&gt;View more details about dashboard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>angular</category>
      <category>dashboard</category>
      <category>sass</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Weekly Recap: Our Charts Collection is Now Complete!</title>
      <dc:creator>Dharmen Shah</dc:creator>
      <pubDate>Mon, 06 Oct 2025 07:04:13 +0000</pubDate>
      <link>https://forem.com/ngmaterialdev/weekly-recap-our-charts-collection-is-now-complete-4dd8</link>
      <guid>https://forem.com/ngmaterialdev/weekly-recap-our-charts-collection-is-now-complete-4dd8</guid>
      <description>&lt;p&gt;What a week for data visualization! We've been on a roll, and in case you missed anything, we've now officially completed our entire Charts category with five incredible new collections.&lt;/p&gt;

&lt;p&gt;You now have a complete, end-to-end toolkit for building beautiful, insightful, and professional dashboards in your Angular applications.&lt;/p&gt;

&lt;p&gt;Here’s a quick recap of everything that launched this week:&lt;/p&gt;

&lt;h2&gt;
  
  
  Chart Compositions
&lt;/h2&gt;

&lt;p&gt;The grand finale! These aren't just charts; they are complete, real-world dashboard layouts that combine charts, stats, tables, and filters into one powerful block.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ui.angular-material.dev/blocks/application/charts/chart-compositions" rel="noopener noreferrer"&gt;Explore Compositions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbq6kx8co5oacxqebn8ce.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbq6kx8co5oacxqebn8ce.jpg" alt=" " width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Line Charts
&lt;/h2&gt;

&lt;p&gt;The cornerstone of any dashboard. Track trends over time with our versatile collection, perfect for visualizing website traffic, portfolio performance, and revenue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ui.angular-material.dev/blocks/application/charts/line-charts" rel="noopener noreferrer"&gt;Explore Line Charts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fto8hfnp9rgvvfecwgjym.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fto8hfnp9rgvvfecwgjym.png" alt=" " width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Spark Area Charts
&lt;/h2&gt;

&lt;p&gt;Add at-a-glance trends to your high-density dashboards. These compact, minimalist charts are perfect for stock tickers, KPI summaries, and portfolio lists.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ui.angular-material.dev/blocks/application/charts/spark-area-charts" rel="noopener noreferrer"&gt;Explore Spark Area Charts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgoosfdmrhxostflwa2kz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgoosfdmrhxostflwa2kz.png" alt=" " width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bar Lists
&lt;/h2&gt;

&lt;p&gt;The cleanest way to visualize ranked data. Instantly see your top screens, visitor locations, or order statuses in a scannable, easy-to-read format.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ui.angular-material.dev/blocks/application/charts/bar-lists" rel="noopener noreferrer"&gt;Explore Bar Lists&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6w3ai51t1pqnykh2ask.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6w3ai51t1pqnykh2ask.png" alt=" " width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Chart Tooltips
&lt;/h2&gt;

&lt;p&gt;It’s the small details that matter. This collection provides a variety of tooltip styles to make your charts more interactive and informative for your users.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ui.angular-material.dev/blocks/application/charts/chart-tooltips" rel="noopener noreferrer"&gt;Explore Chart Tooltips&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffegeifx3f14nfzyb665w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffegeifx3f14nfzyb665w.png" alt=" " width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for following along as we built out this category. We're incredibly proud of how it turned out and can't wait to see the amazing dashboards and applications you'll create.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>angular</category>
      <category>angularmaterial</category>
      <category>webdev</category>
      <category>charts</category>
    </item>
    <item>
      <title>Now Live: A Brand New Collection of Area Chart Blocks!</title>
      <dc:creator>Dharmen Shah</dc:creator>
      <pubDate>Tue, 23 Sep 2025 04:20:08 +0000</pubDate>
      <link>https://forem.com/ngmaterialdev/now-live-a-brand-new-collection-of-area-chart-blocks-3k6m</link>
      <guid>https://forem.com/ngmaterialdev/now-live-a-brand-new-collection-of-area-chart-blocks-3k6m</guid>
      <description>&lt;p&gt;We're excited to announce that the new Area Chart blocks collection is now officially live and available for you to use!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu885jdd017c9dfeg40xr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu885jdd017c9dfeg40xr.gif" alt="Area chart with custom tooltip &amp;amp; vertical hover line" width="606" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is one of our most beautiful and functional collections yet, designed to make data visualization in your Angular applications both easy and powerful. We've created a wide variety of chart styles, perfect for any dashboard you can imagine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analytics &amp;amp; Performance Metrics&lt;/li&gt;
&lt;li&gt;Financial &amp;amp; Revenue Dashboards&lt;/li&gt;
&lt;li&gt;Real-time Monitoring&lt;/li&gt;
&lt;li&gt;And many more!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Powered by the popular and robust ng2-charts library, each block is interactive, fully responsive, and comes in both light and dark themes right out of the box.&lt;/p&gt;

&lt;p&gt;Stop building charts from scratch. Drop one of these blocks into your project and bring your data to life today.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ui.angular-material.dev/blocks/application/charts/area-charts" rel="noopener noreferrer"&gt;Explore All Area Chart Blocks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can't wait to see the incredible dashboards you'll build.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>angular</category>
      <category>angularmaterial</category>
      <category>angularcharts</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AI Rules files for Angular Material</title>
      <dc:creator>Dharmen Shah</dc:creator>
      <pubDate>Sat, 06 Sep 2025 12:17:18 +0000</pubDate>
      <link>https://forem.com/ngmaterialdev/rules-files-for-angular-material-19ni</link>
      <guid>https://forem.com/ngmaterialdev/rules-files-for-angular-material-19ni</guid>
      <description>&lt;p&gt;Several editors, such as Cursor, have rules files useful for providing critical context to LLMs.&lt;/p&gt;

&lt;p&gt;Angular Material Blocks now provides rules files to help you write code faster and more efficiently 🎉.&lt;/p&gt;

&lt;p&gt;These rules files will help you with some common tasks of Angular Material 20, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Theme configuration&lt;/li&gt;
&lt;li&gt;Component and directive usage&lt;/li&gt;
&lt;li&gt;Using and modifying tokens&lt;/li&gt;
&lt;li&gt;Using theme styles&lt;/li&gt;
&lt;li&gt;Using imports&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get rules files
&lt;/h2&gt;

&lt;p&gt;All the rules files are also available on &lt;a href="https://github.com/Angular-Material-Dev/angular-material-ai-rules" rel="noopener noreferrer"&gt;Angular-Material-Dev/angular-material-ai-rules GitHub repository&lt;/a&gt;, but you can use the &lt;a href="https://ui.angular-material.dev/docs/cli-setup" rel="noopener noreferrer"&gt;CLI&lt;/a&gt; to add them to your project or simply copy and paste the content into your editor.&lt;/p&gt;

&lt;p&gt;Visit &lt;a href="https://ui.angular-material.dev/docs/rules-files#get-rules-files" rel="noopener noreferrer"&gt;https://ui.angular-material.dev/docs/rules-files#get-rules-files&lt;/a&gt; to know more!&lt;/p&gt;

&lt;h2&gt;
  
  
  Share Your Thoughts
&lt;/h2&gt;

&lt;p&gt;Have suggestions for improving our rules files or ideas for new features? We'd love to hear from you! Create an issue in our &lt;a href="https://github.com/Angular-Material-Dev/angular-material-ai-rules/issues" rel="noopener noreferrer"&gt;Angular-Material-Dev/angular-material-ai-rules GitHub repository&lt;/a&gt; to share your feedback and help make these tools even better.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cursor</category>
      <category>angularmaterial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>New Blocks Alert: A Huge Collection of Tables!</title>
      <dc:creator>Dharmen Shah</dc:creator>
      <pubDate>Sat, 23 Aug 2025 10:26:50 +0000</pubDate>
      <link>https://forem.com/ngmaterialdev/new-blocks-alert-a-huge-collection-of-tables-1n34</link>
      <guid>https://forem.com/ngmaterialdev/new-blocks-alert-a-huge-collection-of-tables-1n34</guid>
      <description>&lt;p&gt;Ending the week with one of our biggest drops of blocks yet!&lt;/p&gt;

&lt;p&gt;We're thrilled to announce a brand new, comprehensive collection of Table blocks for Angular Material Blocks. We know that data tables are the backbone of almost every application, and this collection is designed to be your new go-to.&lt;/p&gt;

&lt;p&gt;This is more than just a single component; it's a versatile library of styles and features, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tables with rich content like user avatars and status badges.&lt;/li&gt;
&lt;li&gt;Interactive elements like checkboxes for bulk actions.&lt;/li&gt;
&lt;li&gt;Full support for both light and dark themes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're building a user list, a transaction log, or a project dashboard, there's a design here for you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ui.angular-material.dev/blocks/application/lists/tables" rel="noopener noreferrer"&gt;Explore the New Tables Collection&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have any questions, please feel leave comment.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>angular</category>
      <category>angularmaterial</category>
      <category>webdev</category>
      <category>angulartable</category>
    </item>
  </channel>
</rss>
