Skip to content
  • No data uploaded
  • Instant results

Tailwind CSS Pricing Table for Vanilla JS

A production-ready minimal pricing table: a three-tier pricing section with a monthly/yearly billing toggle, a highlighted “most popular” plan and feature checklists. Pick your brand color, toggle dark mode and corner radius — the live preview and the Vanilla JS code update instantly in your browser.

Live component editor

Library
Framework
Style
Theme
Corner radius
Live preview
<!-- Requires Tailwind CSS v3 (CLI/PostCSS build, or the Play CDN for prototypes) -->
<section class="py-16 px-6">
  <div class="max-w-6xl mx-auto">
    <div class="text-center mb-10">
      <h2 class="text-3xl font-bold text-slate-900">Simple, transparent pricing</h2>
      <p class="mt-2 text-slate-500">Start free. Upgrade when you need more.</p>
      <button type="button" class="inline-flex items-center justify-center px-4 py-2.5 text-sm font-semibold rounded-lg border transition-colors border-slate-300 text-slate-700 hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-[#4f46e5] focus:ring-offset-2 focus:ring-offset-white mt-6" data-toggle="yearly">
        <span data-hide="yearly">Billed monthly · switch to yearly (save 20%)</span>
        <span data-show="yearly" hidden>Billed yearly · switch to monthly</span>
      </button>
    </div>
    <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
      <div>
        <div class="h-full p-8 flex flex-col bg-white border border-slate-200 shadow-sm rounded-xl">
          <div class="flex items-center justify-between">
            <h3 class="text-lg font-semibold text-slate-900">Starter</h3>
          </div>
          <p class="mt-1 text-sm text-slate-500">For side projects.</p>
          <p class="mt-6">
            <span class="text-4xl font-bold text-slate-900"><span data-hide="yearly">$0</span><span data-show="yearly" hidden>$0</span></span>
            <span class="text-sm text-slate-500">/month</span>
          </p>
          <ul class="list-none mt-6 mb-8 flex flex-col gap-3 flex-1">
            <li class="flex items-start gap-2 text-sm text-slate-700"><svg class="shrink-0 mt-1 text-[#4f46e5]" width="16" height="16" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M16.7 5.3a1 1 0 010 1.4l-8 8a1 1 0 01-1.4 0l-4-4a1 1 0 111.4-1.4L8 12.6l7.3-7.3a1 1 0 011.4 0z" clip-rule="evenodd"/></svg>1 project</li>
            <li class="flex items-start gap-2 text-sm text-slate-700"><svg class="shrink-0 mt-1 text-[#4f46e5]" width="16" height="16" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M16.7 5.3a1 1 0 010 1.4l-8 8a1 1 0 01-1.4 0l-4-4a1 1 0 111.4-1.4L8 12.6l7.3-7.3a1 1 0 011.4 0z" clip-rule="evenodd"/></svg>Community support</li>
            <li class="flex items-start gap-2 text-sm text-slate-700"><svg class="shrink-0 mt-1 text-[#4f46e5]" width="16" height="16" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M16.7 5.3a1 1 0 010 1.4l-8 8a1 1 0 01-1.4 0l-4-4a1 1 0 111.4-1.4L8 12.6l7.3-7.3a1 1 0 011.4 0z" clip-rule="evenodd"/></svg>Basic analytics</li>
          </ul>
          <a href="#" class="inline-flex items-center justify-center px-4 py-2.5 text-sm font-semibold rounded-lg border transition-colors border-slate-300 text-slate-700 hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-[#4f46e5] focus:ring-offset-2 focus:ring-offset-white w-full">Get started</a>
        </div>
      </div>
      <div>
        <div class="h-full p-8 flex flex-col bg-white border border-slate-200 shadow-sm rounded-xl ring-2 ring-[#4f46e5]">
          <div class="flex items-center justify-between">
            <h3 class="text-lg font-semibold text-slate-900">Pro</h3>
            <span class="inline-flex items-center px-2.5 py-0.5 text-xs font-semibold rounded-full bg-[#4f46e5]/10 text-[#4f46e5]">Most popular</span>
          </div>
          <p class="mt-1 text-sm text-slate-500">For growing teams.</p>
          <p class="mt-6">
            <span class="text-4xl font-bold text-slate-900"><span data-hide="yearly">$29</span><span data-show="yearly" hidden>$24</span></span>
            <span class="text-sm text-slate-500">/month</span>
          </p>
          <ul class="list-none mt-6 mb-8 flex flex-col gap-3 flex-1">
            <li class="flex items-start gap-2 text-sm text-slate-700"><svg class="shrink-0 mt-1 text-[#4f46e5]" width="16" height="16" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M16.7 5.3a1 1 0 010 1.4l-8 8a1 1 0 01-1.4 0l-4-4a1 1 0 111.4-1.4L8 12.6l7.3-7.3a1 1 0 011.4 0z" clip-rule="evenodd"/></svg>Unlimited projects</li>
            <li class="flex items-start gap-2 text-sm text-slate-700"><svg class="shrink-0 mt-1 text-[#4f46e5]" width="16" height="16" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M16.7 5.3a1 1 0 010 1.4l-8 8a1 1 0 01-1.4 0l-4-4a1 1 0 111.4-1.4L8 12.6l7.3-7.3a1 1 0 011.4 0z" clip-rule="evenodd"/></svg>Priority support</li>
            <li class="flex items-start gap-2 text-sm text-slate-700"><svg class="shrink-0 mt-1 text-[#4f46e5]" width="16" height="16" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M16.7 5.3a1 1 0 010 1.4l-8 8a1 1 0 01-1.4 0l-4-4a1 1 0 111.4-1.4L8 12.6l7.3-7.3a1 1 0 011.4 0z" clip-rule="evenodd"/></svg>Advanced analytics</li>
            <li class="flex items-start gap-2 text-sm text-slate-700"><svg class="shrink-0 mt-1 text-[#4f46e5]" width="16" height="16" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M16.7 5.3a1 1 0 010 1.4l-8 8a1 1 0 01-1.4 0l-4-4a1 1 0 111.4-1.4L8 12.6l7.3-7.3a1 1 0 011.4 0z" clip-rule="evenodd"/></svg>Custom domains</li>
          </ul>
          <a href="#" class="inline-flex items-center justify-center px-4 py-2.5 text-sm font-semibold rounded-lg bg-[#4f46e5] hover:bg-[#433cc3] text-white shadow-sm transition-colors focus:outline-none focus:ring-2 focus:ring-[#4f46e5] focus:ring-offset-2 focus:ring-offset-white w-full">Start free trial</a>
        </div>
      </div>
      <div>
        <div class="h-full p-8 flex flex-col bg-white border border-slate-200 shadow-sm rounded-xl">
          <div class="flex items-center justify-between">
            <h3 class="text-lg font-semibold text-slate-900">Enterprise</h3>
          </div>
          <p class="mt-1 text-sm text-slate-500">For large organisations.</p>
          <p class="mt-6">
            <span class="text-4xl font-bold text-slate-900"><span data-hide="yearly">$99</span><span data-show="yearly" hidden>$79</span></span>
            <span class="text-sm text-slate-500">/month</span>
          </p>
          <ul class="list-none mt-6 mb-8 flex flex-col gap-3 flex-1">
            <li class="flex items-start gap-2 text-sm text-slate-700"><svg class="shrink-0 mt-1 text-[#4f46e5]" width="16" height="16" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M16.7 5.3a1 1 0 010 1.4l-8 8a1 1 0 01-1.4 0l-4-4a1 1 0 111.4-1.4L8 12.6l7.3-7.3a1 1 0 011.4 0z" clip-rule="evenodd"/></svg>SSO & SAML</li>
            <li class="flex items-start gap-2 text-sm text-slate-700"><svg class="shrink-0 mt-1 text-[#4f46e5]" width="16" height="16" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M16.7 5.3a1 1 0 010 1.4l-8 8a1 1 0 01-1.4 0l-4-4a1 1 0 111.4-1.4L8 12.6l7.3-7.3a1 1 0 011.4 0z" clip-rule="evenodd"/></svg>Dedicated manager</li>
            <li class="flex items-start gap-2 text-sm text-slate-700"><svg class="shrink-0 mt-1 text-[#4f46e5]" width="16" height="16" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M16.7 5.3a1 1 0 010 1.4l-8 8a1 1 0 01-1.4 0l-4-4a1 1 0 111.4-1.4L8 12.6l7.3-7.3a1 1 0 011.4 0z" clip-rule="evenodd"/></svg>Audit logs</li>
            <li class="flex items-start gap-2 text-sm text-slate-700"><svg class="shrink-0 mt-1 text-[#4f46e5]" width="16" height="16" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M16.7 5.3a1 1 0 010 1.4l-8 8a1 1 0 01-1.4 0l-4-4a1 1 0 111.4-1.4L8 12.6l7.3-7.3a1 1 0 011.4 0z" clip-rule="evenodd"/></svg>99.99% SLA</li>
          </ul>
          <a href="#" class="inline-flex items-center justify-center px-4 py-2.5 text-sm font-semibold rounded-lg border transition-colors border-slate-300 text-slate-700 hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-[#4f46e5] focus:ring-offset-2 focus:ring-offset-white w-full">Start free trial</a>
        </div>
      </div>
    </div>
  </div>
</section>

<script>
  (() => {
    const state = { yearly: false };
    const actions = {  };
    const pair = (s) => s.split(':');
    const sync = () => {
      document.querySelectorAll('[data-show]').forEach((el) => (el.hidden = !state[el.dataset.show]));
      document.querySelectorAll('[data-hide]').forEach((el) => (el.hidden = !!state[el.dataset.hide]));
      document.querySelectorAll('[data-when]').forEach((el) => { const [k, v] = pair(el.dataset.when); el.hidden = state[k] !== v; });
      document.querySelectorAll('[data-pressed]').forEach((el) => { const [k, v] = pair(el.dataset.pressed); el.setAttribute('aria-pressed', String(state[k] === v)); });
      document.querySelectorAll('[data-expanded]').forEach((el) => el.setAttribute('aria-expanded', String(!!state[el.dataset.expanded])));
    };
    document.addEventListener('click', (e) => {
      const t = e.target.closest('[data-toggle],[data-open],[data-close],[data-set],[data-call]');
      if (!t) return;
      const { toggle, open, close, set, call } = t.dataset;
      if (call) actions[call]?.(e);
      if (toggle) state[toggle] = !state[toggle];
      if (open) state[open] = true;
      if (close) state[close] = false;
      if (set) { const [k, v] = pair(set); state[k] = v; }
      sync();
    });
    sync();
  })();
</script>
All components →

Free Tailwind CSS Pricing Table for Vanilla JS by pGento

Install Tailwind CSS for Vanilla JS

Prototype instantly with the Play CDN, or install the Tailwind CLI for production:

<script src="https://cdn.tailwindcss.com"></script>
npm install -D tailwindcss@3
npx tailwindcss init
npx tailwindcss -i ./src/input.css -o ./dist/output.css --watch

Add ./**/*.html to content in tailwind.config.js and put the three @tailwind directives in src/input.css.

Use the pricing table in Vanilla JS

Paste the markup where the component should appear. The small inline <script> wires up the interactive state with one delegated click listener — no framework needed.

Accessibility & customization

The billing switch is a real <button> with aria-pressed semantics handled by state, prices are plain text (no images), and decorative check icons are hidden with aria-hidden="true".

Every color, radius and dark-mode choice is baked into plain utility classes, so the copied code has no runtime dependency on this site.

Compatibility

ItemDetails
CSS frameworkTailwind CSS v3.4+
LibraryPlain HTML + optional vanilla JS
Interactive stateyearly
Dark modeYes — toggle in the editor
StyleMinimal

Frequently asked questions

How do I install this Tailwind pricing table in Vanilla JS?
Create a web page, install Tailwind CSS as shown in the installation section, then paste the generated code.
Can I change the color of the pricing table?
Yes. Use the brand color picker or type any hex code — the preview and code update instantly, and the color is written directly into the classes you copy.
Does the pricing table support dark mode?
Yes. Toggle “Dark mode” in the editor to generate a dark palette version of the same component.
Is the pricing table accessible?
The billing switch is a real <button> with aria-pressed semantics handled by state, prices are plain text (no images), and decorative check icons are hidden with aria-hidden="true".
Is this component free for commercial use?
Yes. The generated code is yours to use in personal and commercial projects without attribution.
Tailwind CSS Pricing Table for Vanilla JS

Embed this tool on your site

Paste this code into any web page. It stays free, fast and ad-free inside your site.

Print or save as PDF

Prints just this tool and its result. Choose “Save as PDF” as the printer to get a file. Branding is stored only in this browser.