<?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: Cagatay Civici</title>
    <description>The latest articles on DEV Community by Cagatay Civici (@cagataycivici).</description>
    <link>https://dev.to/cagataycivici</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%2F275832%2F83974db9-ad2f-4085-a560-eba3a3163740.jpeg</url>
      <title>DEV Community: Cagatay Civici</title>
      <link>https://dev.to/cagataycivici</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cagataycivici"/>
    <language>en</language>
    <item>
      <title>Build your own Vue UI library with Unstyled PrimeVue Core and Tailwind CSS</title>
      <dc:creator>Cagatay Civici</dc:creator>
      <pubDate>Sun, 07 Jan 2024 19:22:34 +0000</pubDate>
      <link>https://dev.to/cagataycivici/build-your-own-vue-ui-library-with-unstyled-primevue-core-and-tailwind-css-23ll</link>
      <guid>https://dev.to/cagataycivici/build-your-own-vue-ui-library-with-unstyled-primevue-core-and-tailwind-css-23ll</guid>
      <description>&lt;p&gt;Wrapping UI components to encapsulate customized behaviors is a common pattern when building your own UI library, especially in larger scale teams where a shared library is utilized amongst numerous applications. A major advantage of this approach is decoupling the dependency to a 3rd party library since the consuming applications depend on the shared library instead. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://primevue.org"&gt;PrimeVue&lt;/a&gt; unstyled core and Tailwind CSS would be a perfect toolset if you require to build a custom UI library. The main idea is to create your UI component by wrapping a PrimeVue component, pass your props as fall through and configure the pass-through Tailwind preset locally instead of a global configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Toggle Switch
&lt;/h2&gt;

&lt;p&gt;Let's build our own ToggleSwitch component inspired by Material Design. For this, we'll be using the PrimeVue InputSwitch component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Template&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The template section consists of a wrapper flex container, a built-in label and the PrimeVue InputSwitch. Notice the use of &lt;code&gt;v-bind="$attrs"&lt;/code&gt; as we'd like to apply any property passed to our own component to the underlying InputSwitch e.g. &lt;code&gt;v-model&lt;/code&gt; and &lt;code&gt;v-on&lt;/code&gt; events. Component here is responsible for the main functionality and accessibility while we focus on standardizing the design requirements.&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;template&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;"flex items-center gap-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;:for=&lt;/span&gt;&lt;span class="s"&gt;"$attrs.inputId"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ label }}&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;InputSwitch&lt;/span&gt; &lt;span class="na"&gt;v-bind=&lt;/span&gt;&lt;span class="s"&gt;"$attrs"&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;/template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Script&lt;/strong&gt;&lt;br&gt;
The script sets &lt;code&gt;inheritAttrs&lt;/code&gt; as false otherwise the fall through properties are applied to the main div container element. The additional props such as label are included as the props of our own component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;defineOptions&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;inheritAttrs&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="nf"&gt;defineProps&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;label&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Preset&lt;/strong&gt;&lt;br&gt;
So far so good as all the wiring is in place, time to apply our custom material design inspired style implemented with Tailwind utilities. The style is applied with the pt property of the InputSwitch locally, since we are using a local preset disable the merging with the global preset with ptOptions. For this we'll be using the &lt;a href="https://stackblitz.com/github/cagataycivici/material-toggle-vue?file=README.md"&gt;material-toggle&lt;/a&gt; preset from the PrimeVue Tailwind CSS Presets &lt;a href="https://tailwind.primevue.org/gallery/"&gt;Gallery&lt;/a&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="nt"&gt;&amp;lt;template&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;"flex items-center gap-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;:for=&lt;/span&gt;&lt;span class="s"&gt;"$attrs.inputId"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ label }}&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;InputSwitch&lt;/span&gt; &lt;span class="na"&gt;v-bind=&lt;/span&gt;&lt;span class="s"&gt;"$attrs"&lt;/span&gt; &lt;span class="na"&gt;:pt=&lt;/span&gt;&lt;span class="s"&gt;"preset"&lt;/span&gt; &lt;span class="na"&gt;:ptOptions=&lt;/span&gt;&lt;span class="s"&gt;"{ mergeSections: false, mergeProps: false }"&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;/template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The preset is a simple pt configuration based on the InputSwitch PassThrough API with some extensions, notice the use of attrs to add an accent mode which does not exist in the API of the PrimeVue InputSwitch. We're able to utilize arbitrary attributes to add functionality to the components we wrap without waiting for component library maintainer to add it for us. This is a great example of the PrimeVue philosophy, providing 3rd party UI library that is easy to tune and customize as if it were an in-house library.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nf"&gt;defineOptions&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;inheritAttrs&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="nf"&gt;defineProps&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;label&lt;/span&gt;&lt;span class="dl"&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;preset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;props&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="na"&gt;class&lt;/span&gt;&lt;span class="p"&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;inline-block relative&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;w-10 h-4&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;opacity-40 select-none pointer-events-none cursor-default&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disabled&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="na"&gt;slider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attrs&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="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="c1"&gt;// Position&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;absolute top-0 left-0 right-0 bottom-0 before:transform&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;before:translate-x-5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="p"&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;before:-translate-x-1&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="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;

            &lt;span class="c1"&gt;// Shape&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rounded-2xl&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

            &lt;span class="c1"&gt;// Before:&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;before:absolute before:top-1/2&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;before:-mt-3&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;before:h-6 before:w-6&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;before:rounded-full&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;before:duration-200&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;before:flex before:justify-center before:items-center&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;before:[text-shadow:0px_0px_WHITE] before:text-transparent&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;before:ring-4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;focused&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;before:bg-surface-500 before:dark:bg-surface-500 before:content-['➖']&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="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;before:content-['✔️']&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;before:bg-violet-500 before:ring-violet-300&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="nx"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;before:bg-amber-500 before:ring-amber-300&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;accent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;

            &lt;span class="c1"&gt;// Colors&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;border border-transparent&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bg-surface-200 dark:bg-surface-400 before:ring-surface-200 dark:before:ring-surface-400&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="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bg-violet-300&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="nx"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bg-amber-300&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;accent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;

            &lt;span class="c1"&gt;// States&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hover:before:bg-surface-400 hover:dark:before:bg-surface-600&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="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hover:before:bg-violet-600&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="nx"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hover:before:bg-amber-600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;accent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;

            &lt;span class="c1"&gt;// Transition&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;transition-colors duration-200&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

            &lt;span class="c1"&gt;// Misc&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cursor-pointer&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;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Final Result&lt;/strong&gt;&lt;br&gt;
Let's wrap it up with an example usage. See the &lt;a href="https://stackblitz.com/github/cagataycivici/material-toggle-vue?file=README.md"&gt;material-toggle demo&lt;/a&gt; for a working sample of the preset we used in this component.&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;ToggleSwitch&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"checked1"&lt;/span&gt; &lt;span class="na"&gt;inputId=&lt;/span&gt;&lt;span class="s"&gt;"primary"&lt;/span&gt; &lt;span class="na"&gt;label=&lt;/span&gt;&lt;span class="s"&gt;"Primary"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ToggleSwitch&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"checked2"&lt;/span&gt; &lt;span class="na"&gt;inputId=&lt;/span&gt;&lt;span class="s"&gt;"accent"&lt;/span&gt; &lt;span class="na"&gt;label=&lt;/span&gt;&lt;span class="s"&gt;"Accent"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"accent"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Deep dive into PrimeVue PassThrough Props</title>
      <dc:creator>Cagatay Civici</dc:creator>
      <pubDate>Sat, 09 Sep 2023 15:24:54 +0000</pubDate>
      <link>https://dev.to/cagataycivici/deep-dive-into-primevue-passthrough-props-2im8</link>
      <guid>https://dev.to/cagataycivici/deep-dive-into-primevue-passthrough-props-2im8</guid>
      <description>&lt;p&gt;One of the recent goals of Prime UI libraries is to be unopinionated and be as flexible as possible. Pass Through props is the key to achieve that as we can combine it with the &lt;a href="https://primevue.org/unstyled/" rel="noopener noreferrer"&gt;Unstyled&lt;/a&gt; mode to remove the default styles to implement theming with a CSS library of your choice such as Tailwind. This integrates the flexibility of Tailwind and the convenience of PrimeVue UI components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basics
&lt;/h2&gt;

&lt;p&gt;So what is Pass Through (&lt;strong&gt;pt&lt;/strong&gt;)? It is a new exciting API of PrimeVue to access the internal DOM Structure of the components. Each component defines a well defined API for props and events already however PT takes it to the next level to be able to customize attributes of internal elements such as adding arbitrary attributes so you don't need to depend on the library maintainer to add those.&lt;/p&gt;

&lt;p&gt;Each component has a special &lt;strong&gt;pt&lt;/strong&gt; property to define an object with keys corresponding to the available DOM elements. Each value can either be a string, an object or a function that returns a string or an object to define the arbitrary properties to apply to the element such as styling, aria, data-* or custom attributes. If the value is a string or a function that returns a string, it is considered as a class definition by default and added to the class attribute of the element. Every component documentation has a dedicated section to document the available section names exposed via PT.&lt;/p&gt;

&lt;p&gt;Most common usage of &lt;strong&gt;pt&lt;/strong&gt; is styling and customization. The &lt;strong&gt;class&lt;/strong&gt; and &lt;strong&gt;style&lt;/strong&gt; properties support the exact syntax of the corresponding Vue bindings like arrays, objects and conditionals.&lt;/p&gt;

&lt;p&gt;The default style of Lara theme is like this;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F8m1fhysfi9axk5czrlzs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F8m1fhysfi9axk5czrlzs.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So let's customize it with PrimeFlex CSS, note that any similar CSS library like Tailwind can also be used. PrimeVue has a &lt;a href="https://primevue.org/tailwind" rel="noopener noreferrer"&gt;built-in Tailwind CSS theme&lt;/a&gt; but that needs a separate article. &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;Panel&lt;/span&gt; &lt;span class="na"&gt;header=&lt;/span&gt;&lt;span class="s"&gt;"Header"&lt;/span&gt; &lt;span class="na"&gt;toggleable&lt;/span&gt;
    &lt;span class="na"&gt;:pt=&lt;/span&gt;&lt;span class="s"&gt;"{
        header: (options) =&amp;gt; ({
            id: 'myPanelHeader',
            style: {
                'user-select': 'none'
            },
            class: [
                'border-primary',
                {
                    'bg-primary': options.state.d_collapsed,
                    'bg-primary-reverse': !options.state.d_collapsed
                }
            ]
        }),
        content: { class: 'border-primary text-lg text-primary-700' },
        title: 'text-xl',                                     // OR { class: 'text-xl' }
        toggler: () =&amp;gt; 'bg-primary hover:bg-primary-reverse'  // OR { class: 'bg-primary hover:bg-primary-reverse' }
    }"&lt;/span&gt;&lt;span class="nt"&gt;&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;"m-0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
        Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Panel&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The output would be;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fib79kaxcw5itwdait0o0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fib79kaxcw5itwdait0o0.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lifecycle
&lt;/h2&gt;

&lt;p&gt;Lifecycle hooks of components are also exposed as pass through using the hooks property so that callback functions can be registered. Available callbacks are &lt;strong&gt;onBeforeCreate&lt;/strong&gt;, &lt;strong&gt;onCreated&lt;/strong&gt;, &lt;strong&gt;onBeforeUpdate&lt;/strong&gt;, &lt;strong&gt;onUpdated&lt;/strong&gt;, &lt;strong&gt;onBeforeMount&lt;/strong&gt;, &lt;strong&gt;onMounted&lt;/strong&gt;, &lt;strong&gt;onBeforeUnmount&lt;/strong&gt; and onUnmounted. Refer to the Vue.js documentation for detailed information about lifecycle hooks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Global
&lt;/h2&gt;

&lt;p&gt;Defines the shared pass through properties per component type. For example, with the configuration below all panel headers have the &lt;strong&gt;bg-primary&lt;/strong&gt; style class and the all autocomplete components have a fixed width. These settings can be overriden by a particular component as components &lt;strong&gt;pt&lt;/strong&gt; property has higher precedence over global &lt;strong&gt;pt&lt;/strong&gt; by default. This can be customized with the &lt;strong&gt;mergeSections&lt;/strong&gt; and &lt;strong&gt;mergeProps&lt;/strong&gt; settings of the &lt;strong&gt;ptOptions&lt;/strong&gt; property of a component. The usePassThrough section later in this article covers how these two properties customize the merge of a global configuration of a component and a particular component with its own pt configuration.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;createApp&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="s2"&gt;vue&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="nx"&gt;PrimeVue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primevue/config&lt;/span&gt;&lt;span class="dl"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PrimeVue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="na"&gt;pt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bg-primary&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="na"&gt;autocomplete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
                &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;w-16rem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// OR { class: 'w-16rem' }&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="p"&gt;});&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Custom CSS
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;global&lt;/strong&gt; property has a css option to define custom css that belongs to a global &lt;strong&gt;pt&lt;/strong&gt; configuration. Common use case of this feature is defining global styles and animations related to the pass through props configuration.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;createApp&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="s2"&gt;vue&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="nx"&gt;PrimeVue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primevue/config&lt;/span&gt;&lt;span class="dl"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PrimeVue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="na"&gt;pt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;global&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;css&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
                button {
                    padding: 2rem;
                }

                .p-ink {
                    display: block;
                    position: absolute;
                    background: rgba(255, 255, 255, 0.5);
                    border-radius: 100%;
                    transform: scale(0);
                    pointer-events: none;
                }

                .p-ink-active {
                    animation: ripple 0.4s linear;
                }

                @keyframes ripple {
                    100% {
                        opacity: 0;
                        transform: scale(2.5);
                    }
                }
            `&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;h2&gt;
  
  
  usePassThrough
&lt;/h2&gt;

&lt;p&gt;An existing pass through configuration is customized with the usePassThrough utility. The first parameter is the object to customize, the second parameter is the customizations and the final parameter is the behavior of merging. One of the example use cases is customizing existing unstyled themes like &lt;a href="https://primevue.org/tailwind" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;createApp&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="s2"&gt;vue&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="nx"&gt;PrimeVue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primevue/config&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;usePassThrough&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="s2"&gt;primevue/passthrough&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="nx"&gt;Tailwind&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primevue/passthrough/tailwind&lt;/span&gt;&lt;span class="dl"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;App&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;CustomTailwind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;usePassThrough&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;Tailwind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&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;leading-none font-light text-2xl&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;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;mergeSections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;mergeProps&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PrimeVue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;unstyled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;pt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CustomTailwind&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;mergeSections&lt;/strong&gt; defines whether the sections from the main configuration gets added and the &lt;strong&gt;mergeProps&lt;/strong&gt; controls whether to override or merge the defined props. Defaults are &lt;strong&gt;true&lt;/strong&gt; for &lt;strong&gt;mergeSections&lt;/strong&gt; and &lt;strong&gt;false&lt;/strong&gt; for &lt;strong&gt;mergeProps&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CustomTailwind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;usePassThrough&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;Tailwind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
        &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
            &lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my_panel_header&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;br&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;mergeSections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;mergeProps&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;br&gt;
&lt;span class="p"&gt;);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="c1"&gt;// Output: &lt;/span&gt;&lt;br&gt;
&lt;span class="c1"&gt;// panel.header.class =&amp;gt; 'my_panel_header'&lt;/span&gt;&lt;br&gt;
&lt;span class="c1"&gt;// panel.title.class =&amp;gt; Tailwind.panel.title.class&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CustomTailwind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;usePassThrough&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;Tailwind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
        &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
            &lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my_panel_header&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;br&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;mergeSections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;mergeProps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span class="p"&gt;);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="c1"&gt;// Output: &lt;/span&gt;&lt;br&gt;
&lt;span class="c1"&gt;// panel.header.class =&amp;gt; [Tailwind.panel.header.class, 'my_panel_header']&lt;/span&gt;&lt;br&gt;
&lt;span class="c1"&gt;// panel.title.class =&amp;gt; Tailwind.panel.title.class&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CustomTailwind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;usePassThrough&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;Tailwind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
        &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
            &lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my_panel_header&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;br&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;mergeSections&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="na"&gt;mergeProps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span class="p"&gt;);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="c1"&gt;// Output: &lt;/span&gt;&lt;br&gt;
&lt;span class="c1"&gt;// panel.header.class =&amp;gt; [Tailwind.panel.header.class, 'my_panel_header']&lt;/span&gt;&lt;br&gt;
&lt;span class="c1"&gt;// panel.title.class =&amp;gt; undefined&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CustomTailwind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;usePassThrough&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;Tailwind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
        &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
            &lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my_panel_header&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;br&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;mergeSections&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="na"&gt;mergeProps&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;br&gt;
&lt;span class="p"&gt;);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="c1"&gt;// Output: &lt;/span&gt;&lt;br&gt;
&lt;span class="c1"&gt;// panel.header.class =&amp;gt; 'my_panel_header'&lt;/span&gt;&lt;br&gt;
&lt;span class="c1"&gt;// panel.title.class =&amp;gt; undefined&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Wrap Up&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Pass Through props opens up many possibilities like implementing design systems using the flexibility of Tailwind along with the convenience of the built-in PrimeVue UI components. This will be covered later this week with an exclusive blog entry. Stay tuned! &lt;/p&gt;

</description>
      <category>vue</category>
    </item>
    <item>
      <title>90+ Vue UI Components Styled with Tailwind CSS</title>
      <dc:creator>Cagatay Civici</dc:creator>
      <pubDate>Wed, 30 Aug 2023 20:42:44 +0000</pubDate>
      <link>https://dev.to/cagataycivici/90-vue-ui-components-styled-with-tailwind-css-1a8</link>
      <guid>https://dev.to/cagataycivici/90-vue-ui-components-styled-with-tailwind-css-1a8</guid>
      <description>&lt;p&gt;&lt;a href="https://primevue.org" rel="noopener noreferrer"&gt;PrimeVue&lt;/a&gt; has recently announced the new &lt;a href="https://primevue.org/unstyled/" rel="noopener noreferrer"&gt;Unstyled&lt;/a&gt; mode that removes the default styling and exposes the component internals via &lt;a href="https://primevue.org/passthrough/properties" rel="noopener noreferrer"&gt;pass through props&lt;/a&gt; API. With the unstyled mode, components do the hard work by providing the feature set and accessibility out of the box but leaves out the styling to the user.&lt;/p&gt;

&lt;p&gt;Although any CSS library like Bootstrap and Bulma can be used, Tailwind CSS integration is match made in heaven, there is even a built-in Tailwind theme available in PrimeVue.&lt;/p&gt;

&lt;p&gt;Interested? Let's dive in!&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;This part assumes that Tailwind is already available in your application, if not visit the Tailwind CSS &lt;a href="https://tailwindcss.com/docs/installation/framework-guides" rel="noopener noreferrer"&gt;framework guides&lt;/a&gt; like Vite or Nuxt for the installation. The built-in default theme is basically a &lt;a href="https://primevue.org/passthrough/" rel="noopener noreferrer"&gt;global pass through&lt;/a&gt; configuration that needs to be imported from &lt;strong&gt;primevue/passthrough/tailwind&lt;/strong&gt; path and then defined during setup. Since the theme is exclusive to unstyled mode, the &lt;strong&gt;unstyled&lt;/strong&gt; setting is required in addition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;createApp&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="s2"&gt;vue&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="nx"&gt;PrimeVue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primevue/config&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="nx"&gt;Tailwind&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primevue/passthrough/tailwind&lt;/span&gt;&lt;span class="dl"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PrimeVue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;unstyled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;pt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Tailwind&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Tailwind uses PurgeCSS internally to remove unused classes, since PrimeVue components are loaded from node_modules the &lt;strong&gt;content&lt;/strong&gt; property at &lt;strong&gt;tailwind.config.js&lt;/strong&gt; needs to be aware of PrimeVue, otherwise the classes utilized in the theme will be removed as well.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./index.html&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="s2"&gt;./src/**/*.{vue,js,ts,jsx,tsx}&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="s2"&gt;./node_modules/primevue/**/*.{vue,js,ts,jsx,tsx}&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;p&gt;Voilà 💚, you now have 90+ awesome Vue UI components styled with Tailwind that will work in harmony with the rest of your application.&lt;/p&gt;
&lt;h2&gt;
  
  
  Customization
&lt;/h2&gt;

&lt;p&gt;The built-in theme provides a strong base that can be extended further for your requirements. For customization, the pass through values need to be overriden. The unstyled section of the theming documentation for each component demonstrates the theme with an editable example. For instance, the panel component has the following default configuration.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;props&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="na"&gt;class&lt;/span&gt;&lt;span class="p"&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;flex items-center justify-between&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// flex and alignments&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;border border-gray-300 bg-gray-100 text-gray-700 rounded-tl-lg rounded-tr-lg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// borders and colors&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark:bg-gray-900 dark:border-blue-900/40 dark:text-white/80&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Dark mode&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;p-5&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="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toggleable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;py-3 px-5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toggleable&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// condition&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;class&lt;/span&gt;&lt;span class="p"&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;leading-none font-bold&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="nx"&gt;toggler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;class&lt;/span&gt;&lt;span class="p"&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;inline-flex items-center justify-center overflow-hidden relative no-underline&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// alignments&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;w-8 h-8 text-gray-600 border-0 bg-transparent rounded-full transition duration-200 ease-in-out&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// widths, borders, and transitions&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hover:text-gray-900 hover:border-transparent hover:bg-gray-200 dark:hover:text-white/80 dark:hover:bg-gray-800/80 dark:focus:shadow-[inset_0_0_0_0.2rem_rgba(147,197,253,0.5)]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// hover&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;focus:outline-none focus:outline-offset-0 focus:shadow-[0_0_0_0.2rem_rgba(191,219,254,1)]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// focus&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nx"&gt;togglerIcon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;class&lt;/span&gt;&lt;span class="p"&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;inline-block&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="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;class&lt;/span&gt;&lt;span class="p"&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;p-5 border border-gray-300 bg-white text-gray-700 border-t-0 last:rounded-br-lg last:rounded-bl-lg&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;dark:bg-gray-900 dark:border-blue-900/40 dark:text-white/80&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// Dark mode&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// padding, borders, and colors&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;Let's assume the title section should be lighter and bigger.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;createApp&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="s2"&gt;vue&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="nx"&gt;PrimeVue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primevue/config&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;usePassThrough&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="s2"&gt;primevue/passthrough&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="nx"&gt;Tailwind&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primevue/passthrough/tailwind&lt;/span&gt;&lt;span class="dl"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Tailwind customization&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CustomTailwind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;usePassThrough&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;Tailwind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&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;leading-none font-light text-2xl&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;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;mergeSections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Used to merge with other PT sections. The default is true.&lt;/span&gt;
        &lt;span class="na"&gt;mergeProps&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="c1"&gt;// Whether to use override or merge with existing configuration&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PrimeVue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;unstyled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;pt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CustomTailwind&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Take a look at the CodeSandbox sample to see the Tailwind CSS + PrimeVue in action&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://codesandbox.io/p/sandbox/unstyled-primevue-dialog-with-tailwind-css-2jp96n?embed=1" rel="noopener noreferrer"&gt;
      codesandbox.io
    &lt;/a&gt;
&lt;/div&gt;



</description>
      <category>vue</category>
    </item>
    <item>
      <title>PrimeFaces v13.0.0 Released</title>
      <dc:creator>Cagatay Civici</dc:creator>
      <pubDate>Mon, 24 Jul 2023 12:23:06 +0000</pubDate>
      <link>https://dev.to/cagataycivici/primefaces-v1300-released-6io</link>
      <guid>https://dev.to/cagataycivici/primefaces-v1300-released-6io</guid>
      <description>&lt;p&gt;&lt;a href="https://www.primefaces.org/showcase"&gt;PrimeFaces&lt;/a&gt; UI component library is back with a new major release featuring over 200 improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  JSF is alive?
&lt;/h3&gt;

&lt;p&gt;Well yes, PrimeFaces has been initiated back in late 2008 and after all these years thanks to the great community contributions it is still a healthy open source project with constant updates. Considering the fast-paced nature of Javascript ecosystem, a 14 year old UI library with 1 million+ download per year is exceptional. For form driven back office apps, it is still a viable choice in a Jakarta EE environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Free Theming
&lt;/h3&gt;

&lt;p&gt;v13 is special because we're introducing some new changes and open sourcing some of the paid add-ons like theming. Theme Designer was a paid add-on and with v13 it is now available as open source, view the new theming documentation for details and tutorials. We'll also come up with a new video tutorial.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.primefaces.org/designer-jsf/"&gt;visual editor&lt;/a&gt; now permits downloading the created themes as well in case you don't want to go through the details of the theming API.&lt;/p&gt;

&lt;p&gt;Material and Bootstrap themes are also open sourced and available at &lt;a href="https://github.com/primefaces/primefaces-sass-theme"&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
   Elite to LTS
&lt;/h3&gt;

&lt;p&gt;PrimeFaces Elite will be replaced with LTS like PrimeNG has this means maintenance versions of the last major version will now be open source starting with 13.0.1. In the past, 13.0.1 was only available to paying users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Special Thanks
&lt;/h3&gt;

&lt;p&gt;A big shout out the community leaders of PrimeFaces, without their contributions it would be impossible to maintain the library. PrimeFaces is a fantastic example of a community driven project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tandraschko"&gt;tandraschko&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jepsar"&gt;jepsar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/melloware"&gt;melloware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Rapster"&gt;Rapster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/christophs78"&gt;christophs78&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Changelog
&lt;/h3&gt;

&lt;p&gt;Visit the &lt;a href="https://github.com/primefaces/primefaces/releases/tag/13.0.0"&gt;changelog&lt;/a&gt; for the complete list of changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Roadmap
&lt;/h3&gt;

&lt;p&gt;Compared to other Prime UI libraries like PrimeNG, PrimeReact and PrimeVue, PrimeFaces still uses an older theming API with ui-* prefix. We're planning to migrate to p-* prefix and move to CSS variables from SASS.&lt;/p&gt;

</description>
      <category>java</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Unstyled PrimeVue Meets Bulma CSS</title>
      <dc:creator>Cagatay Civici</dc:creator>
      <pubDate>Wed, 19 Jul 2023 09:44:31 +0000</pubDate>
      <link>https://dev.to/cagataycivici/unstyled-primevue-meets-bulma-css-2epn</link>
      <guid>https://dev.to/cagataycivici/unstyled-primevue-meets-bulma-css-2epn</guid>
      <description>&lt;p&gt;The new unstyled mode of PrimeVue allows integration with various CSS libraries. In this post, we'll try to use Bulma utilities to style the PrimeVue components.&lt;/p&gt;

&lt;h2&gt;
  
  
  PrimeVue Setup
&lt;/h2&gt;

&lt;p&gt;We'll be using Vite+Vue in our sample. PrimeVue needs to run in unstyled mode so that the default styles are not added. We don't want to override CSS, just work with a plain canvas. &lt;/p&gt;

&lt;p&gt;At &lt;strong&gt;main.js&lt;/strong&gt;, begin with configuring PrimeVue;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;createApp&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="s2"&gt;vue&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="nx"&gt;PrimeVue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primevue/config&lt;/span&gt;&lt;span class="dl"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PrimeVue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;unstyled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install Bulma
&lt;/h2&gt;

&lt;p&gt;Bulma can be used with cdn or npm. Since we use Vite, let's go with npm and import it in our project at &lt;strong&gt;main.js&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install bulma
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bulma/css/bulma.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  PrimeVue Components
&lt;/h2&gt;

&lt;p&gt;Time to add some PrimeVue magic to the mix by adding a couple of components so final &lt;strong&gt;main.js&lt;/strong&gt; becomes;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;createApp&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;vue&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="nx"&gt;App&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;./App.vue&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="nx"&gt;PrimeVue&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;primevue/config&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="nx"&gt;Button&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;primevue/button&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="nx"&gt;InputText&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;primevue/inputtext&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="nx"&gt;Textarea&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;primevue/textarea&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="nx"&gt;DataTable&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;primevue/datatable&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="nx"&gt;Column&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;primevue/column&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="nx"&gt;Panel&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;primevue/panel&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/assets/main.css&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bulma/css/bulma.css&lt;/span&gt;&lt;span class="dl"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PrimeVue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;unstyled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;InputText&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;InputText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Textarea&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Textarea&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DataTable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DataTable&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Column&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Panel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Panel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mount&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&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Input Fields
&lt;/h3&gt;

&lt;p&gt;A Primevue input is easy to style with Bulma by adding the &lt;strong&gt;input&lt;/strong&gt; style class.&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;InputText&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"input"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Text input"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Buttons
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;button&lt;/strong&gt; class with variations applies &lt;strong&gt;class&lt;/strong&gt; property of a PrimeVue button.&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;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"buttons"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"button is-info"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Info&lt;span class="nt"&gt;&amp;lt;/Button&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"button is-success"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Success&lt;span class="nt"&gt;&amp;lt;/Button&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"button is-warning"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Warning&lt;span class="nt"&gt;&amp;lt;/Button&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"button is-danger"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Danger&lt;span class="nt"&gt;&amp;lt;/Button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DataTable
&lt;/h3&gt;

&lt;p&gt;For table, we'll need the mighty &lt;a href="https://primevue.org/passthrough/"&gt;Pass Through&lt;/a&gt; props of PrimeVue to access the component internals to add any arbitrary props.&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;DataTable&lt;/span&gt; &lt;span class="na"&gt;:value=&lt;/span&gt;&lt;span class="s"&gt;"products"&lt;/span&gt;
        &lt;span class="na"&gt;:pt=&lt;/span&gt;&lt;span class="s"&gt;"{
          table: 'table is-fullwidth stripes',
        }"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Column&lt;/span&gt; &lt;span class="na"&gt;field=&lt;/span&gt;&lt;span class="s"&gt;"code"&lt;/span&gt; &lt;span class="na"&gt;header=&lt;/span&gt;&lt;span class="s"&gt;"Code"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/Column&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Column&lt;/span&gt; &lt;span class="na"&gt;field=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;header=&lt;/span&gt;&lt;span class="s"&gt;"Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/Column&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Column&lt;/span&gt; &lt;span class="na"&gt;field=&lt;/span&gt;&lt;span class="s"&gt;"category"&lt;/span&gt; &lt;span class="na"&gt;header=&lt;/span&gt;&lt;span class="s"&gt;"Category"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/Column&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Column&lt;/span&gt; &lt;span class="na"&gt;field=&lt;/span&gt;&lt;span class="s"&gt;"quantity"&lt;/span&gt; &lt;span class="na"&gt;header=&lt;/span&gt;&lt;span class="s"&gt;"Quantity"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/Column&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/DataTable&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Panel
&lt;/h3&gt;

&lt;p&gt;Just like the table, with pass through props, we can pass the Bulma panel utilities to the PrimeVue panel easily.&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;Panel&lt;/span&gt; &lt;span class="na"&gt;header=&lt;/span&gt;&lt;span class="s"&gt;"Header"&lt;/span&gt;
        &lt;span class="na"&gt;:pt=&lt;/span&gt;&lt;span class="s"&gt;"{
          root: 'panel is-primary',
          header: 'panel-heading',
          content: 'panel-block',
        }"&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Content&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Panel&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;The complete source code is available to StackBlitz.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://stackblitz.com/edit/vitejs-vite-9snkbq?embed=1&amp;amp;file=src%2FApp.vue" width="100%" height="500"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>vue</category>
    </item>
    <item>
      <title>PrimeVue Unstyled Mode with Tailwind and Bootstrap Styling</title>
      <dc:creator>Cagatay Civici</dc:creator>
      <pubDate>Wed, 12 Jul 2023 17:00:06 +0000</pubDate>
      <link>https://dev.to/cagataycivici/primevue-unstyled-mode-with-tailwind-and-bootstrap-styling-5d6e</link>
      <guid>https://dev.to/cagataycivici/primevue-unstyled-mode-with-tailwind-and-bootstrap-styling-5d6e</guid>
      <description>&lt;p&gt;Hey, fellow developers!&lt;/p&gt;

&lt;p&gt;I wanted to share some exciting news with you all today. After months of hard work, PrimeVue UI library has just released its brand new Unstyled Mode, and it's a game-changer! 🚀&lt;/p&gt;

&lt;p&gt;For those unfamiliar with PrimeVue, it's a UI library that provides a rich set of UI components for Vue.js applications. It's been a valuable choice for developers looking to build sleek and modern user interfaces quickly. And now, with the Unstyled Mode, PrimeVue is taking customization to a whole new level.&lt;/p&gt;

&lt;p&gt;So, what exactly is Unstyled Mode? Well, as the name suggests, it allows us to use PrimeVue components without any predefined styling. Instead, it gives us the flexibility to apply our own custom styles using popular CSS libraries like Tailwind, Bootstrap, and many others.&lt;/p&gt;

&lt;p&gt;This is a game-changer for several reasons. First and foremost, it opens up a world of possibilities in terms of design. No longer are we limited to the default PrimeVue styles. We can now leverage the power of CSS libraries like Tailwind and Bootstrap to create stunning interfaces that match our project's aesthetic requirements.&lt;/p&gt;

&lt;p&gt;Imagine being able to use Tailwind's utility classes to style PrimeVue components effortlessly. Need a button? Apply Tailwind's button classes directly to the PrimeVue button component. Want a responsive grid system? Combine the power of Bootstrap's grid classes with PrimeVue's layout components. The possibilities are endless! In fact, our team is working on a built-in Tailwind theme to get you started quickly.&lt;/p&gt;

&lt;p&gt;Visit the &lt;a href="http://primevue.org/tailwind"&gt;Tailwind Demo&lt;/a&gt; and &lt;a href="http://primevue.org/bootstrap"&gt;Bootstrap Demo&lt;/a&gt; for details and code samples. Both examples use a button and a modal dialog styled with different approaches.&lt;/p&gt;

&lt;p&gt;Moreover, this Unstyled Mode promotes reusability and consistency across projects. By separating the component logic from the styling, we can easily reuse the same PrimeVue component with different styles across various projects. This not only saves development time but also ensures a consistent user experience.&lt;/p&gt;

&lt;p&gt;Unstyled mode can be enabled globally or for a particular component, visit the &lt;a href="https://primevue.org/unstyled"&gt;official documentation&lt;/a&gt; to get started.&lt;/p&gt;

&lt;p&gt;So, whether you're a fan of Tailwind, Bootstrap, or any other CSS library, the new Unstyled Mode in PrimeVue opens up a world of possibilities. It gives you the freedom to create beautiful and customized user interfaces effortlessly while letting PrimeVue taking care of advanced UI requirements and accessibility.&lt;/p&gt;

&lt;p&gt;I can't wait to see what amazing designs and applications you all come up with using PrimeVue's Unstyled Mode. Share your thoughts, experiences, and any cool examples you've created in the PrimeLand Discord Server!&lt;/p&gt;

&lt;p&gt;To sum it up with a short overview of our Roadmap. Next piece is providing the built-in Tailwind theme to be the first Unstyled Mode theme. Then we'll begin updating the styled mode to merge the primevue-sass-theme to core and migrate to CSS variables for a dynamic approach. Then we'll continue with RTL support and the new UI based theme designer to provide an app to create themes easily whether in styled mode or unstyled mode.&lt;/p&gt;

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

</description>
      <category>vue</category>
    </item>
    <item>
      <title>PrimeVue 3.2.0-rc1 with Vite Support</title>
      <dc:creator>Cagatay Civici</dc:creator>
      <pubDate>Wed, 20 Jan 2021 12:06:20 +0000</pubDate>
      <link>https://dev.to/cagataycivici/primevue-3-2-0-rc1-with-vite-support-3268</link>
      <guid>https://dev.to/cagataycivici/primevue-3-2-0-rc1-with-vite-support-3268</guid>
      <description>&lt;p&gt;&lt;a href="https://www.primefaces.org/primevue/showcase"&gt;PrimeVue&lt;/a&gt; 3.2.0-rc.1 is released with first class support for &lt;a href="https://github.com/vitejs/vite"&gt;Vite&lt;/a&gt;, the new build tool from the create of Vue, Evan You. See the &lt;a href="http://github.com/primefaces/primevue-quickstart-vite"&gt;Vite-PrimeVue starter app&lt;/a&gt; for an example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New Build&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Up until now, PrimeVue can only be used with environments that support single file components, with 3.2.0-rc.1 the npm distribution contains native &lt;strong&gt;ES modules&lt;/strong&gt;, &lt;strong&gt;IIFE&lt;/strong&gt; format and &lt;strong&gt;CommonJS fallback&lt;/strong&gt; so that it can be used with Vue CLI, Vite, a custom build with vue-loader enabled and directly within the browser with script tags. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Changelog&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The highlight of this release is compatibility with the rest of the Vue ecosystem however we've managed to add numerous quality improvements reported by the users. View the &lt;a href="https://github.com/primefaces/primevue/blob/master/CHANGELOG.md"&gt;changelog&lt;/a&gt; for details. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Demos&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Visit &lt;a href="https://www.primefaces.org/primevue/showcase"&gt;PrimeVue&lt;/a&gt; documentation to get started now or take a look around the &lt;a href="https://www.primefaces.org/primevue/showcase"&gt;showcase&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Roadmap&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Now the new build is out of the way we'll start adding the following features for 3.3.0;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://primefaces.org/primeng/showcase/#/table/filter"&gt;Advanced Filtering&lt;/a&gt; like in PrimeNG.&lt;/li&gt;
&lt;li&gt;  Standalone &lt;a href="https://primefaces.org/primeng/showcase/#/virtualscroller"&gt;VirtualScroller&lt;/a&gt; component as in PrimeNG.&lt;/li&gt;
&lt;li&gt;  New VirtualScroller for table and select components like PrimeNG has.&lt;/li&gt;
&lt;li&gt;  Grouping option for Select components.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Always bet on Prime!&lt;/p&gt;

</description>
      <category>vue</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>PrimeVue 3.1.0 Brings 12 New UI Components For Vue 3</title>
      <dc:creator>Cagatay Civici</dc:creator>
      <pubDate>Thu, 10 Dec 2020 13:57:10 +0000</pubDate>
      <link>https://dev.to/cagataycivici/primevue-3-1-0-brings-12-new-ui-components-for-vue-3-2e36</link>
      <guid>https://dev.to/cagataycivici/primevue-3-1-0-brings-12-new-ui-components-for-vue-3-2e36</guid>
      <description>&lt;p&gt;Your new favorite UI component library for Vue is updated to bring 12 new components, Localization API and Confirmation API along with numerous improvements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12 New Components&lt;/strong&gt; &lt;br&gt;
PrimeVue 3.1.0 is a major release that brings handy new components.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://primefaces.org/primevue/showcase/#/avatar"&gt;Avatar&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://primefaces.org/primevue/showcase/#/badge"&gt;Badge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://primefaces.org/primevue/showcase/#/cascadeselect"&gt;CascadeSelect&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://primefaces.org/primevue/showcase/#/chip"&gt;Chip&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://primefaces.org/primevue/showcase/#/confirmdialog"&gt;ConfirmDialog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://primefaces.org/primevue/showcase/#/confirmpopup"&gt;ConfirmPopup&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://primefaces.org/primevue/showcase/#/divider"&gt;Divider&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://primefaces.org/primevue/showcase/#/knob"&gt;Knob&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://primefaces.org/primevue/showcase/#/scrolltop"&gt;ScrollTop&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://primefaces.org/primevue/showcase/#/skeleton"&gt;Skeleton&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://primefaces.org/primevue/showcase/#/splitter"&gt;Splitter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://primefaces.org/primevue/showcase/#/tag"&gt;Tag&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Confirmation API&lt;/strong&gt; &lt;br&gt;
Confirmation API makes it trivial to implement the repetitive confirmation tasks, the UI consists of &lt;a href="https://primefaces.org/primevue/showcase/#/confirmdialog"&gt;ConfirmDialog&lt;/a&gt; and &lt;a href="https://primefaces.org/primevue/showcase/#/confirmpopup"&gt;ConfirmPopup&lt;/a&gt; whereas the API is used via a ConfirmationService with full support for Options API and Composition API. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Locale API&lt;/strong&gt; &lt;br&gt;
It is cumbersome to manipulate the translations and localization options on each page so &lt;a href="https://primefaces.org/primevue/showcase/#/locale"&gt;Locale API&lt;/a&gt; is created to solve this by offering a reactive global configuration to localize PrimeVue components with ease. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Changelog&lt;/strong&gt; &lt;br&gt;
Visit &lt;a href="https://github.com/primefaces/primevue/blob/master/CHANGELOG.md"&gt;Changelog&lt;/a&gt; for more information about the improvements. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vue 2 Users&lt;/strong&gt; &lt;br&gt;
If you are on Vue 2, no worries because PrimeVue 2.x is actively maintained, version 2.3.0 will bring these new enhancements to Vue 2. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download&lt;/strong&gt; &lt;br&gt;
PrimeVue is free library to use under MIT License and available at &lt;a href="https://www.npmjs.com/package/primevue"&gt;NPM&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Roadmap&lt;/strong&gt; &lt;br&gt;
Upcoming enhancements will make PrimeVue even better;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Advanced &lt;a href="https://primefaces.org/primeng/showcase/#/table/filter"&gt;Data Filtering&lt;/a&gt; (e.g. PrimeNG)&lt;/li&gt;
&lt;li&gt;  Standalone &lt;a href="https://primefaces.org/primeng/showcase/#/virtualscroller"&gt;VirtualScroller&lt;/a&gt; (e.g. PrimeNG)&lt;/li&gt;
&lt;li&gt;  New VirtualScroller for &lt;a href="https://primefaces.org/primeng/showcase/#/table/virtualscroll"&gt;DataTable&lt;/a&gt; (e.g. PrimeNG)&lt;/li&gt;
&lt;li&gt;  VirtualScroller for &lt;a href="https://primefaces.org/primeng/showcase/#/dropdown"&gt;Select components&lt;/a&gt; (e.g. PrimeNG)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Always bet on Prime!&lt;/p&gt;

</description>
      <category>vue</category>
      <category>vue3</category>
    </item>
    <item>
      <title>PrimeVue 3.0.0 released for Vue 3 with 60+ UI Components featuring Bootstrap, Material, Fluent UI and Custom Themes</title>
      <dc:creator>Cagatay Civici</dc:creator>
      <pubDate>Tue, 13 Oct 2020 19:58:19 +0000</pubDate>
      <link>https://dev.to/cagataycivici/primevue-3-0-0-released-for-vue-3-with-60-ui-components-featuring-bootstrap-material-fluent-ui-and-custom-themes-348i</link>
      <guid>https://dev.to/cagataycivici/primevue-3-0-0-released-for-vue-3-with-60-ui-components-featuring-bootstrap-material-fluent-ui-and-custom-themes-348i</guid>
      <description>&lt;p&gt;&lt;a href="https://www.primetek.com.tr"&gt;PrimeTek&lt;/a&gt; is proud to introduce &lt;a href="https://www.primefaces.org/primevue/showcase"&gt;PrimeVue&lt;/a&gt; 3.0.0 final release with full support Vue 3, over 60 highly customizable and accessible UI Components, a design agnostic theming featuring &lt;strong&gt;Material&lt;/strong&gt;, &lt;strong&gt;Bootstrap&lt;/strong&gt;, &lt;strong&gt;FluentUI&lt;/strong&gt; and &lt;strong&gt;PrimeOne&lt;/strong&gt; Themes, a theme designer, PrimeFlex css utilities, modern set of icons via PrimeIcons, premium Vue-CLI templates and more.&lt;/p&gt;

&lt;p&gt;Take a tour around the &lt;a href="https://primefaces.org/primevue/showcase/#/"&gt;PrimeVue Live Showcase&lt;/a&gt; to take the library for a test run. &lt;/p&gt;

&lt;p&gt;PrimeVue is a free library to use under MIT License and available at &lt;a href="https://www.npmjs.com/package/primevue"&gt;NPM&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note for Vue 2 Users&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;For Vue 2 users, we'll still be maintaining and improving PrimeVue 2, if you are on V2, please view the &lt;a href="https://www.primefaces.org/primevue/showcase-v2/#/"&gt;PrimeVue 2 website&lt;/a&gt; instead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QS6aYi93--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.primefaces.org/wp-content/uploads/2020/08/primevue-promo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QS6aYi93--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.primefaces.org/wp-content/uploads/2020/08/primevue-promo.jpg" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>PrimeVue 3.0.0-rc.1 brings 60+ UI Components with Excellent Support for Vue 3</title>
      <dc:creator>Cagatay Civici</dc:creator>
      <pubDate>Mon, 28 Sep 2020 12:13:54 +0000</pubDate>
      <link>https://dev.to/cagataycivici/primevue-3-0-0-rc-1-brings-60-ui-components-with-excellent-support-for-vue-3-2l63</link>
      <guid>https://dev.to/cagataycivici/primevue-3-0-0-rc-1-brings-60-ui-components-with-excellent-support-for-vue-3-2l63</guid>
      <description>&lt;p&gt;Ready to get started with Vue 3 and looking for a UI component suite? If so we have good news!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.primefaces.org/primevue/showcase/#/"&gt;PrimeVue 3.0.0-rc.1&lt;/a&gt; is released with excellent support and compatibility for Vue 3. PrimeVue provides 60+ rich set of open source UI components for Vue 3 with stunning &lt;strong&gt;bootstrap&lt;/strong&gt;, &lt;strong&gt;material&lt;/strong&gt; and &lt;strong&gt;custom themes&lt;/strong&gt; along with PrimeFlex css utilities, dashboards, icons, visual theme designer and more.&lt;/p&gt;

</description>
      <category>vue</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>css</category>
    </item>
    <item>
      <title>PrimeVue 2.0.0 is released with 60+ Open Source UI Components featuring Bootstrap, Material Design and Custom Themes</title>
      <dc:creator>Cagatay Civici</dc:creator>
      <pubDate>Mon, 06 Jul 2020 10:38:50 +0000</pubDate>
      <link>https://dev.to/cagataycivici/primevue-2-0-0-is-released-with-60-open-source-ui-components-featuring-bootstrap-material-design-and-custom-themes-361j</link>
      <guid>https://dev.to/cagataycivici/primevue-2-0-0-is-released-with-60-open-source-ui-components-featuring-bootstrap-material-design-and-custom-themes-361j</guid>
      <description>&lt;p&gt;PrimeTek is thrilled to announce the 2.0.0 release of &lt;a href="https://www.primefaces.org/primevue/"&gt;PrimeVue&lt;/a&gt; featuring 60+ UI components, a design agnostic theming api with &lt;strong&gt;Bootstrap&lt;/strong&gt;, &lt;strong&gt;Material&lt;/strong&gt; and custom themes, the new PrimeFlex CSS utility, modern icons via PrimeIcons v4, all-new demos and showcase. We believe PrimeVue is the most advanced and complete UI solution at the moment for Vue.js.&lt;/p&gt;

&lt;p&gt;Take a tour around the &lt;a href="https://www.primefaces.org/primevue/showcase"&gt;PrimeVue Live Showcase&lt;/a&gt; to take the library for a test run.&lt;/p&gt;

&lt;p&gt;PrimeVue is a free library to use under MIT License and available at &lt;a href="https://www.npmjs.com/package/primevue"&gt;NPM&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>vue</category>
      <category>opensource</category>
      <category>javascript</category>
      <category>css</category>
    </item>
    <item>
      <title>PrimeVue UI Suite 1.0.0 released with 50+ Components featuring Material, Bootstrap and Custom Themes</title>
      <dc:creator>Cagatay Civici</dc:creator>
      <pubDate>Mon, 13 Jan 2020 12:02:01 +0000</pubDate>
      <link>https://dev.to/cagataycivici/primevue-ui-suite-1-0-0-released-with-50-components-featuring-material-bootstrap-and-custom-themes-539a</link>
      <guid>https://dev.to/cagataycivici/primevue-ui-suite-1-0-0-released-with-50-components-featuring-material-bootstrap-and-custom-themes-539a</guid>
      <description>&lt;p&gt;&lt;a href="http://www.primetek.com.tr/"&gt;PrimeTek&lt;/a&gt; is proud to announce that, after months of hard work and dedication, &lt;a href="https://www.primefaces.org/primevue"&gt;PrimeVue&lt;/a&gt; has reached &lt;strong&gt;1.0.0-final.&lt;/strong&gt; PrimeVue is the most complete UI Component suite for Vue featuring over 50 components, theme designer, various VueCLI templates and professional support. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FVnP_BEw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.primefaces.org/wp-content/uploads/2020/01/primevue-release-100.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FVnP_BEw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.primefaces.org/wp-content/uploads/2020/01/primevue-release-100.jpg" alt="" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Most Complete UI Component Suite&lt;/strong&gt; &lt;br&gt;
PrimeVue offers 50+ components as a solution for your UI requirements, whether they are simple or complex. From form components to charts, let PrimeVue do its magic while you focus on the business logic. &lt;strong&gt;Theme Designer&lt;/strong&gt; &lt;a href="https://www.primefaces.org/designer/primevue"&gt;Theme Designer&lt;/a&gt; is a Vue application to easily skin PrimeVue components to make sure they work within harmony within your own application. Nova, Luna and Rhea themes are included as free themes to get started in no time. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Premium Templates&lt;/strong&gt; &lt;br&gt;
Premium VueCLI templates are offered as a complete solution for your UI featuring an application layout, template pages on top of special themes such as &lt;strong&gt;Material&lt;/strong&gt;, &lt;strong&gt;Bootstrap&lt;/strong&gt; or &lt;strong&gt;Custom&lt;/strong&gt; themes. Initially, following templates are available;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.primefaces.org/serenity-vue/#/"&gt;Serenity&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.primefaces.org/sapphire-vue/#/"&gt;Sapphire&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.primefaces.org/avalon-vue/#/"&gt;Avalon&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.primefaces.org/apollo-vue/#/"&gt;Apollo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.primefaces.org/babylon-vue/#/"&gt;Babylon&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.primefaces.org/roma-vue/#/"&gt;Roma&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.primefaces.org/serenity-vue"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XacHSofz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.primefaces.org/wp-content/uploads/2018/12/serenity-biggest-o.jpg" alt="" width="800" height="240"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PRO Support&lt;/strong&gt; &lt;br&gt;
With PrimeVue PRO, it is easy to support, tune and add features to PrimeVue as if it were an in-house framework. PrimeVue PRO is a term based commercial support service. With the exclusive services of Pro account, you no longer need to post your questions in the community forum and your issues to community issue tracker. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download&lt;/strong&gt; &lt;br&gt;
PrimeVue is free library to use under MIT License and available at &lt;a href="https://www.npmjs.com/package/primevue"&gt;NPM&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Roadmap&lt;/strong&gt; &lt;br&gt;
Our goal is to make PrimeVue a well-known and valuable member of the Vue Ecosystem in 2020 and improve it every day based on the community feedback. Always bet on Prime!&lt;/p&gt;

</description>
      <category>vue</category>
    </item>
  </channel>
</rss>
