adminlte4
Version:
789 lines (770 loc) • 91.2 kB
HTML
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Recommended Integrations | AdminLTE 4</title>
<!--begin::Accessibility Meta Tags-->
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<meta name="color-scheme" content="light dark" />
<meta name="theme-color" content="#007bff" media="(prefers-color-scheme: light)" />
<meta name="theme-color" content="#1a1a1a" media="(prefers-color-scheme: dark)" />
<!--end::Accessibility Meta Tags-->
<!--begin::Primary Meta Tags-->
<meta name="title" content="Recommended Integrations | AdminLTE 4" />
<meta name="author" content="ColorlibHQ" />
<meta
name="description"
content="AdminLTE is a Free Bootstrap 5 Admin Dashboard, 30 example pages using Vanilla JS. Fully accessible with WCAG 2.1 AA compliance."
/>
<meta
name="keywords"
content="bootstrap 5, bootstrap, bootstrap 5 admin dashboard, bootstrap 5 dashboard, bootstrap 5 charts, bootstrap 5 calendar, bootstrap 5 datepicker, bootstrap 5 tables, bootstrap 5 datatable, vanilla js datatable, colorlibhq, colorlibhq dashboard, colorlibhq admin dashboard, accessible admin panel, WCAG compliant"
/>
<!--end::Primary Meta Tags-->
<!--begin::Accessibility Features-->
<!-- Skip links will be dynamically added by accessibility.js -->
<meta name="supported-color-schemes" content="light dark" />
<link rel="preload" href="../css/adminlte.css" as="style" />
<!--end::Accessibility Features-->
<!--begin::Fonts-->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@fontsource/source-sans-3@5.0.12/index.css"
integrity="sha256-tXJfXfp6Ewt1ilPzLDtQnJV4hclT9XuaZUKyUvmyr+Q="
crossorigin="anonymous"
media="print"
onload="this.media = 'all'"
/>
<!--end::Fonts-->
<!--begin::Third Party Plugin(OverlayScrollbars)-->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.11.0/styles/overlayscrollbars.min.css"
crossorigin="anonymous"
/>
<!--end::Third Party Plugin(OverlayScrollbars)-->
<!--begin::Third Party Plugin(Bootstrap Icons)-->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css"
crossorigin="anonymous"
/>
<!--end::Third Party Plugin(Bootstrap Icons)-->
<!--begin::Required Plugin(AdminLTE)-->
<link rel="stylesheet" href="../css/adminlte.css" />
<!--end::Required Plugin(AdminLTE)-->
</head>
<body class="layout-fixed sidebar-expand-lg bg-body-tertiary docs-page">
<div class="app-wrapper">
<!--begin::Header-->
<nav class="app-header navbar navbar-expand bg-body">
<!--begin::Container-->
<div class="container-fluid">
<!--begin::Start Navbar Links-->
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" data-lte-toggle="sidebar" href="#" role="button">
<i class="bi bi-list"></i>
</a>
</li>
<li class="nav-item d-none d-md-block">
<a href="../docs/introduction.html" class="nav-link">
<i class="bi bi-book me-1" aria-hidden="true"></i>
Documentation
</a>
</li>
<li class="nav-item d-none d-md-block">
<a href="../index.html" class="nav-link">
<i class="bi bi-arrow-left me-1" aria-hidden="true"></i>
Back to live preview
</a>
</li>
</ul>
<!--end::Start Navbar Links-->
<!--begin::End Navbar Links-->
<ul class="navbar-nav ms-auto">
<!--begin::Navbar Search-->
<li class="nav-item">
<a class="nav-link" data-widget="navbar-search" href="#" role="button">
<i class="bi bi-search"></i>
</a>
</li>
<!--end::Navbar Search-->
<!--begin::Messages Dropdown Menu-->
<li class="nav-item dropdown">
<a class="nav-link" data-bs-toggle="dropdown" href="#">
<i class="bi bi-chat-text"></i>
<span class="navbar-badge badge text-bg-danger">3</span>
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-end">
<a href="#" class="dropdown-item">
<!--begin::Message-->
<div class="d-flex">
<div class="flex-shrink-0">
<img
src="../assets/img/user1-128x128.jpg"
alt="User Avatar"
class="img-size-50 rounded-circle me-3"
/>
</div>
<div class="flex-grow-1">
<h3 class="dropdown-item-title">
Brad Diesel
<span class="float-end fs-7 text-danger"
><i class="bi bi-star-fill"></i
></span>
</h3>
<p class="fs-7">Call me whenever you can...</p>
<p class="fs-7 text-secondary">
<i class="bi bi-clock-fill me-1"></i> 4 Hours Ago
</p>
</div>
</div>
<!--end::Message-->
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<!--begin::Message-->
<div class="d-flex">
<div class="flex-shrink-0">
<img
src="../assets/img/user8-128x128.jpg"
alt="User Avatar"
class="img-size-50 rounded-circle me-3"
/>
</div>
<div class="flex-grow-1">
<h3 class="dropdown-item-title">
John Pierce
<span class="float-end fs-7 text-secondary">
<i class="bi bi-star-fill"></i>
</span>
</h3>
<p class="fs-7">I got your message bro</p>
<p class="fs-7 text-secondary">
<i class="bi bi-clock-fill me-1"></i> 4 Hours Ago
</p>
</div>
</div>
<!--end::Message-->
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<!--begin::Message-->
<div class="d-flex">
<div class="flex-shrink-0">
<img
src="../assets/img/user3-128x128.jpg"
alt="User Avatar"
class="img-size-50 rounded-circle me-3"
/>
</div>
<div class="flex-grow-1">
<h3 class="dropdown-item-title">
Nora Silvester
<span class="float-end fs-7 text-warning">
<i class="bi bi-star-fill"></i>
</span>
</h3>
<p class="fs-7">The subject goes here</p>
<p class="fs-7 text-secondary">
<i class="bi bi-clock-fill me-1"></i> 4 Hours Ago
</p>
</div>
</div>
<!--end::Message-->
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item dropdown-footer">See All Messages</a>
</div>
</li>
<!--end::Messages Dropdown Menu-->
<!--begin::Notifications Dropdown Menu-->
<li class="nav-item dropdown">
<a class="nav-link" data-bs-toggle="dropdown" href="#">
<i class="bi bi-bell-fill"></i>
<span class="navbar-badge badge text-bg-warning">15</span>
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-end">
<span class="dropdown-item dropdown-header">15 Notifications</span>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="bi bi-envelope me-2"></i> 4 new messages
<span class="float-end text-secondary fs-7">3 mins</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="bi bi-people-fill me-2"></i> 8 friend requests
<span class="float-end text-secondary fs-7">12 hours</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="bi bi-file-earmark-fill me-2"></i> 3 new reports
<span class="float-end text-secondary fs-7">2 days</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item dropdown-footer"> See All Notifications </a>
</div>
</li>
<!--end::Notifications Dropdown Menu-->
<!--begin::Fullscreen Toggle-->
<li class="nav-item">
<a class="nav-link" href="#" data-lte-toggle="fullscreen">
<i data-lte-icon="maximize" class="bi bi-arrows-fullscreen"></i>
<i data-lte-icon="minimize" class="bi bi-fullscreen-exit d-none"></i>
</a>
</li>
<!--end::Fullscreen Toggle-->
<!--begin::Color Mode Toggle (#6010)-->
<li class="nav-item dropdown">
<a
class="nav-link"
href="#"
id="bd-theme"
aria-label="Toggle color scheme"
data-bs-toggle="dropdown"
aria-expanded="false"
>
<i class="bi bi-sun-fill" data-lte-theme-icon="light"></i>
<i class="bi bi-moon-fill d-none" data-lte-theme-icon="dark"></i>
<i class="bi bi-circle-half d-none" data-lte-theme-icon="auto"></i>
</a>
<ul
class="dropdown-menu dropdown-menu-end"
aria-labelledby="bd-theme"
style="--bs-dropdown-min-width: 8rem"
>
<li>
<button
type="button"
class="dropdown-item d-flex align-items-center"
data-bs-theme-value="light"
aria-pressed="false"
>
<i class="bi bi-sun-fill me-2"></i>
Light
<i class="bi bi-check-lg ms-auto d-none"></i>
</button>
</li>
<li>
<button
type="button"
class="dropdown-item d-flex align-items-center"
data-bs-theme-value="dark"
aria-pressed="false"
>
<i class="bi bi-moon-fill me-2"></i>
Dark
<i class="bi bi-check-lg ms-auto d-none"></i>
</button>
</li>
<li>
<button
type="button"
class="dropdown-item d-flex align-items-center active"
data-bs-theme-value="auto"
aria-pressed="true"
>
<i class="bi bi-circle-half me-2"></i>
Auto
<i class="bi bi-check-lg ms-auto d-none"></i>
</button>
</li>
</ul>
</li>
<!--end::Color Mode Toggle-->
<!--begin::User Menu Dropdown-->
<li class="nav-item dropdown user-menu">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">
<img
src="../assets/img/user2-160x160.jpg"
class="user-image rounded-circle shadow"
alt="User Image"
/>
<span class="d-none d-md-inline">Alexander Pierce</span>
</a>
<ul class="dropdown-menu dropdown-menu-lg dropdown-menu-end">
<!--begin::User Image-->
<li class="user-header text-bg-primary">
<img
src="../assets/img/user2-160x160.jpg"
class="rounded-circle shadow"
alt="User Image"
/>
<p>
Alexander Pierce - Web Developer
<small>Member since Nov. 2023</small>
</p>
</li>
<!--end::User Image-->
<!--begin::Menu Body-->
<li class="user-body">
<!--begin::Row-->
<div class="row">
<div class="col-4 text-center">
<a href="#">Followers</a>
</div>
<div class="col-4 text-center">
<a href="#">Sales</a>
</div>
<div class="col-4 text-center">
<a href="#">Friends</a>
</div>
</div>
<!--end::Row-->
</li>
<!--end::Menu Body-->
<!--begin::Menu Footer-->
<li class="user-footer">
<a href="#" class="btn btn-outline-secondary">Profile</a>
<a href="#" class="btn btn-outline-danger float-end">Sign out</a>
</li>
<!--end::Menu Footer-->
</ul>
</li>
<!--end::User Menu Dropdown-->
</ul>
<!--end::End Navbar Links-->
</div>
<!--end::Container-->
</nav>
<!--end::Header-->
<!--begin::Sidebar (docs mode)-->
<aside class="app-sidebar bg-body-secondary shadow" data-bs-theme="dark">
<!--begin::Sidebar Brand-->
<div class="sidebar-brand">
<a href="../docs/introduction.html" class="brand-link">
<img
src="../assets/img/AdminLTELogo.png"
alt="AdminLTE Logo"
class="brand-image opacity-75 shadow"
/>
<span class="brand-text fw-light">
AdminLTE 4 <span class="opacity-75">· Docs</span>
</span>
</a>
</div>
<!--end::Sidebar Brand-->
<!--begin::Sidebar Wrapper-->
<div class="sidebar-wrapper">
<nav class="mt-2">
<!-- Back to preview CTA -->
<div class="px-3 pb-2">
<a
href="../index.html"
class="btn btn-sm btn-outline-light w-100 d-flex align-items-center justify-content-center gap-2"
>
<i class="bi bi-arrow-left" aria-hidden="true"></i>
Back to live preview
</a>
</div>
<!--begin::Sidebar Menu-->
<ul
class="nav sidebar-menu flex-column"
data-lte-toggle="treeview"
role="navigation"
aria-label="Documentation navigation"
data-accordion="false"
id="docs-navigation"
>
<li class="nav-header">START HERE</li>
<li class="nav-item">
<a href="../docs/introduction.html" class="nav-link">
<i class="nav-icon bi bi-download"></i>
<p>Installation</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/getting-started.html" class="nav-link">
<i class="nav-icon bi bi-rocket-takeoff"></i>
<p>Getting Started</p>
</a>
</li>
<li class="nav-header">FOUNDATIONS</li>
<li class="nav-item">
<a href="../docs/layout.html" class="nav-link">
<i class="nav-icon bi bi-grip-horizontal"></i>
<p>Layout Classes</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/layout-blueprint.html" class="nav-link">
<i class="nav-icon bi bi-diagram-3"></i>
<p>Layout Blueprint</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/customization.html" class="nav-link">
<i class="nav-icon bi bi-palette"></i>
<p>Customization</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/color-mode.html" class="nav-link">
<i class="nav-icon bi bi-star-half"></i>
<p>Color Mode</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/rtl.html" class="nav-link">
<i class="nav-icon bi bi-text-paragraph"></i>
<p>RTL Support</p>
</a>
</li>
<li class="nav-header">BUILDING</li>
<li class="nav-item">
<a href="../docs/recipes.html" class="nav-link">
<i class="nav-icon bi bi-clipboard-check"></i>
<p>Recipes</p>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon bi bi-ui-checks-grid"></i>
<p>
Components
<i class="nav-arrow bi bi-chevron-right"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="../docs/components/main-header.html" class="nav-link">
<i class="nav-icon bi bi-circle"></i>
<p>Main Header</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/components/main-sidebar.html" class="nav-link">
<i class="nav-icon bi bi-circle"></i>
<p>Main Sidebar</p>
</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon bi bi-filetype-js"></i>
<p>
JavaScript Plugins
<i class="nav-arrow bi bi-chevron-right"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="../docs/javascript/plugins-overview.html" class="nav-link">
<i class="nav-icon bi bi-circle"></i>
<p>Overview</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/javascript/layout.html" class="nav-link">
<i class="nav-icon bi bi-circle"></i>
<p>Layout</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/javascript/pushmenu.html" class="nav-link">
<i class="nav-icon bi bi-circle"></i>
<p>PushMenu</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/javascript/treeview.html" class="nav-link">
<i class="nav-icon bi bi-circle"></i>
<p>Treeview</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/javascript/card-widget.html" class="nav-link">
<i class="nav-icon bi bi-circle"></i>
<p>Card Widget</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/javascript/direct-chat.html" class="nav-link">
<i class="nav-icon bi bi-circle"></i>
<p>Direct Chat</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/javascript/fullscreen.html" class="nav-link">
<i class="nav-icon bi bi-circle"></i>
<p>Fullscreen</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/javascript/accessibility.html" class="nav-link">
<i class="nav-icon bi bi-circle"></i>
<p>Accessibility</p>
</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="../docs/integrations.html" class="nav-link active">
<i class="nav-icon bi bi-puzzle"></i>
<p>Integrations</p>
</a>
</li>
<li class="nav-header">SHIPPING</li>
<li class="nav-item">
<a href="../docs/migration.html" class="nav-link">
<i class="nav-icon bi bi-arrow-up-right-square"></i>
<p>Migration from v3</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/deployment.html" class="nav-link">
<i class="nav-icon bi bi-cloud-upload"></i>
<p>Deployment</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/browser-support.html" class="nav-link">
<i class="nav-icon bi bi-browser-chrome"></i>
<p>Browser Support</p>
</a>
</li>
<li class="nav-header">RESOURCES</li>
<li class="nav-item">
<a href="../docs/faq.html" class="nav-link">
<i class="nav-icon bi bi-question-circle"></i>
<p>FAQ</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/how-to-contribute.html" class="nav-link">
<i class="nav-icon bi bi-people"></i>
<p>Contributing</p>
</a>
</li>
<li class="nav-item">
<a href="../docs/license.html" class="nav-link">
<i class="nav-icon bi bi-patch-check"></i>
<p>License</p>
</a>
</li>
<li class="nav-item">
<a
href="https://github.com/ColorlibHQ/AdminLTE"
target="_blank"
rel="noopener"
class="nav-link"
>
<i class="nav-icon bi bi-github"></i>
<p>
GitHub
<i class="bi bi-box-arrow-up-right ms-1" aria-hidden="true"></i>
</p>
</a>
</li>
</ul>
<!--end::Sidebar Menu-->
</nav>
</div>
<!--end::Sidebar Wrapper-->
</aside>
<!--end::Sidebar (docs mode)-->
<main class="app-main">
<div class="app-content-header">
<div class="container-fluid">
<div class="row">
<div class="col-sm-6">
<h3 class="mb-0">Recommended Integrations</h3>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-end">
<li class="breadcrumb-item"><a href="#">Docs</a></li>
<li class="breadcrumb-item active" aria-current="page">
Recommended Integrations
</li>
</ol>
</div>
</div>
</div>
</div>
<div class="app-content">
<div class="container-fluid">
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-body">
<p>
AdminLTE deliberately ships a lean dependency tree. Rather than bundling every
form widget or chart library, we recommend best-in-class third-party libraries
you can drop in when you need them. Every library below is
<strong>MIT-licensed</strong>, <strong>actively maintained</strong>, and
<strong>jQuery-free</strong>.
</p>
<p>
Each section has a CDN-based “install” snippet and the minimum JavaScript
needed to wire it up. You can swap CDN URLs for npm installs if you’re using a
bundler.
</p>
<blockquote>
<p>
<strong>About the version numbers below:</strong> every CDN URL pins a
specific version (eg. <code>@4.6.13</code>) so the snippets stay
reproducible. They were current as of the latest release, but third-party
libraries publish new versions independently of AdminLTE. Before copying a
snippet into production, check the library’s homepage (linked in each
section) for the latest version — and consider hosting a copy yourself
rather than relying on the CDN long-term.
</p>
</blockquote>
<h5 id="form-widgets">Form widgets</h5>
<h6 id="date--time-picker--flatpickr">Date / time picker — Flatpickr</h6>
<p>
<a href="https://flatpickr.js.org/">Flatpickr</a> is a lightweight,
no-dependency date and time picker.
</p>
<pre
class="astro-code dark-plus"
style="background-color: #1e1e1e; color: #d4d4d4; overflow-x: auto"
tabindex="0"
data-language="html"
><code><span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">link</span><span style="color:#9CDCFE"> rel</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"stylesheet"</span><span style="color:#9CDCFE"> href</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"https://cdn.jsdelivr.net/npm/flatpickr@4.6.13/dist/flatpickr.min.css"</span><span style="color:#808080"> /></span></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#9CDCFE"> src</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"https://cdn.jsdelivr.net/npm/flatpickr@4.6.13"</span><span style="color:#808080">></</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">input</span><span style="color:#9CDCFE"> type</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"text"</span><span style="color:#9CDCFE"> class</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"form-control"</span><span style="color:#9CDCFE"> id</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"datepicker"</span><span style="color:#9CDCFE"> placeholder</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"Select a date"</span><span style="color:#808080"> /></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"><span style="color:#DCDCAA"> flatpickr</span><span style="color:#D4D4D4">(</span><span style="color:#CE9178">"#datepicker"</span><span style="color:#D4D4D4">, {</span></span>
<span class="line"><span style="color:#9CDCFE"> altInput:</span><span style="color:#569CD6"> true</span><span style="color:#D4D4D4">,</span></span>
<span class="line"><span style="color:#9CDCFE"> altFormat:</span><span style="color:#CE9178"> "F j, Y"</span><span style="color:#D4D4D4">,</span></span>
<span class="line"><span style="color:#9CDCFE"> dateFormat:</span><span style="color:#CE9178"> "Y-m-d"</span></span>
<span class="line"><span style="color:#D4D4D4"> })</span></span>
<span class="line"><span style="color:#808080"></</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span></code></pre>
<p>
Supports date ranges, time-only mode, multiple dates, and i18n out of the box.
</p>
<h6 id="multi-select--tag-input--tom-select">
Multi-select / tag input — Tom Select
</h6>
<p>
<a href="https://tom-select.js.org/">Tom Select</a> is a vanilla-JS rewrite of
Selectize. Great fit for searchable selects, tag inputs, and remote-data
autocomplete.
</p>
<pre
class="astro-code dark-plus"
style="background-color: #1e1e1e; color: #d4d4d4; overflow-x: auto"
tabindex="0"
data-language="html"
><code><span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">link</span><span style="color:#9CDCFE"> rel</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"stylesheet"</span><span style="color:#9CDCFE"> href</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"https://cdn.jsdelivr.net/npm/tom-select@2.6.1/dist/css/tom-select.bootstrap5.min.css"</span><span style="color:#808080"> /></span></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#9CDCFE"> src</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"https://cdn.jsdelivr.net/npm/tom-select@2.6.1/dist/js/tom-select.complete.min.js"</span><span style="color:#808080">></</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">select</span><span style="color:#9CDCFE"> id</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"tags"</span><span style="color:#9CDCFE"> class</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"form-control"</span><span style="color:#9CDCFE"> multiple</span><span style="color:#9CDCFE"> placeholder</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"Pick some tags"</span><span style="color:#808080">></span></span>
<span class="line"><span style="color:#808080"> <</span><span style="color:#569CD6">option</span><span style="color:#9CDCFE"> value</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"design"</span><span style="color:#808080">></span><span style="color:#D4D4D4">Design</span><span style="color:#808080"></</span><span style="color:#569CD6">option</span><span style="color:#808080">></span></span>
<span class="line"><span style="color:#808080"> <</span><span style="color:#569CD6">option</span><span style="color:#9CDCFE"> value</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"dev"</span><span style="color:#808080">></span><span style="color:#D4D4D4">Development</span><span style="color:#808080"></</span><span style="color:#569CD6">option</span><span style="color:#808080">></span></span>
<span class="line"><span style="color:#808080"> <</span><span style="color:#569CD6">option</span><span style="color:#9CDCFE"> value</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"qa"</span><span style="color:#808080">></span><span style="color:#D4D4D4">QA</span><span style="color:#808080"></</span><span style="color:#569CD6">option</span><span style="color:#808080">></span></span>
<span class="line"><span style="color:#808080"></</span><span style="color:#569CD6">select</span><span style="color:#808080">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"><span style="color:#569CD6"> new</span><span style="color:#DCDCAA"> TomSelect</span><span style="color:#D4D4D4">(</span><span style="color:#CE9178">"#tags"</span><span style="color:#D4D4D4">, { </span><span style="color:#9CDCFE">plugins:</span><span style="color:#D4D4D4"> [</span><span style="color:#CE9178">"remove_button"</span><span style="color:#D4D4D4">] })</span></span>
<span class="line"><span style="color:#808080"></</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span></code></pre>
<p>
Ships a <code>tom-select.bootstrap5.min.css</code> theme that matches
Bootstrap form controls.
</p>
<h6 id="range-slider--nouislider">Range slider — noUiSlider</h6>
<p>
<a href="https://refreshless.com/nouislider/">noUiSlider</a> handles single,
range, and multi-handle sliders with no dependencies.
</p>
<pre
class="astro-code dark-plus"
style="background-color: #1e1e1e; color: #d4d4d4; overflow-x: auto"
tabindex="0"
data-language="html"
><code><span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">link</span><span style="color:#9CDCFE"> rel</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"stylesheet"</span><span style="color:#9CDCFE"> href</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"https://cdn.jsdelivr.net/npm/nouislider@15.8.1/dist/nouislider.min.css"</span><span style="color:#808080"> /></span></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#9CDCFE"> src</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"https://cdn.jsdelivr.net/npm/nouislider@15.8.1/dist/nouislider.min.js"</span><span style="color:#808080">></</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">div</span><span style="color:#9CDCFE"> id</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"slider"</span><span style="color:#808080">></</span><span style="color:#569CD6">div</span><span style="color:#808080">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"><span style="color:#9CDCFE"> noUiSlider</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">create</span><span style="color:#D4D4D4">(</span><span style="color:#9CDCFE">document</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">getElementById</span><span style="color:#D4D4D4">(</span><span style="color:#CE9178">"slider"</span><span style="color:#D4D4D4">), {</span></span>
<span class="line"><span style="color:#9CDCFE"> start:</span><span style="color:#D4D4D4"> [</span><span style="color:#B5CEA8">20</span><span style="color:#D4D4D4">, </span><span style="color:#B5CEA8">80</span><span style="color:#D4D4D4">],</span></span>
<span class="line"><span style="color:#9CDCFE"> connect:</span><span style="color:#569CD6"> true</span><span style="color:#D4D4D4">,</span></span>
<span class="line"><span style="color:#9CDCFE"> range:</span><span style="color:#D4D4D4"> { </span><span style="color:#9CDCFE">min:</span><span style="color:#B5CEA8"> 0</span><span style="color:#D4D4D4">, </span><span style="color:#9CDCFE">max:</span><span style="color:#B5CEA8"> 100</span><span style="color:#D4D4D4"> }</span></span>
<span class="line"><span style="color:#D4D4D4"> })</span></span>
<span class="line"><span style="color:#808080"></</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span></code></pre>
<h6 id="color-picker--pickr">Color picker — Pickr</h6>
<p>
<a href="https://github.com/Simonwep/pickr">Pickr</a> is a flat, modern color
picker with multiple themes.
</p>
<pre
class="astro-code dark-plus"
style="background-color: #1e1e1e; color: #d4d4d4; overflow-x: auto"
tabindex="0"
data-language="html"
><code><span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">link</span><span style="color:#9CDCFE"> rel</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"stylesheet"</span><span style="color:#9CDCFE"> href</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"https://cdn.jsdelivr.net/npm/@simonwep/pickr@1.9.1/dist/themes/classic.min.css"</span><span style="color:#808080"> /></span></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#9CDCFE"> src</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"https://cdn.jsdelivr.net/npm/@simonwep/pickr@1.9.1/dist/pickr.min.js"</span><span style="color:#808080">></</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">div</span><span style="color:#9CDCFE"> id</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"color-picker"</span><span style="color:#808080">></</span><span style="color:#569CD6">div</span><span style="color:#808080">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"><span style="color:#9CDCFE"> Pickr</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">create</span><span style="color:#D4D4D4">({</span></span>
<span class="line"><span style="color:#9CDCFE"> el:</span><span style="color:#CE9178"> "#color-picker"</span><span style="color:#D4D4D4">,</span></span>
<span class="line"><span style="color:#9CDCFE"> theme:</span><span style="color:#CE9178"> "classic"</span><span style="color:#D4D4D4">,</span></span>
<span class="line"><span style="color:#9CDCFE"> default:</span><span style="color:#CE9178"> "#0d6efd"</span><span style="color:#D4D4D4">,</span></span>
<span class="line"><span style="color:#9CDCFE"> components:</span><span style="color:#D4D4D4"> { </span><span style="color:#9CDCFE">preview:</span><span style="color:#569CD6"> true</span><span style="color:#D4D4D4">, </span><span style="color:#9CDCFE">opacity:</span><span style="color:#569CD6"> true</span><span style="color:#D4D4D4">, </span><span style="color:#9CDCFE">hue:</span><span style="color:#569CD6"> true</span><span style="color:#D4D4D4">, </span><span style="color:#9CDCFE">interaction:</span><span style="color:#D4D4D4"> { </span><span style="color:#9CDCFE">input:</span><span style="color:#569CD6"> true</span><span style="color:#D4D4D4">, </span><span style="color:#9CDCFE">save:</span><span style="color:#569CD6"> true</span><span style="color:#D4D4D4"> } }</span></span>
<span class="line"><span style="color:#D4D4D4"> })</span></span>
<span class="line"><span style="color:#808080"></</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span></code></pre>
<h6 id="input-mask--imask">Input mask — IMask</h6>
<p>
<a href="https://imask.js.org/">IMask</a> handles phone numbers, credit cards,
dates, currency — anything with a fixed pattern.
</p>
<pre
class="astro-code dark-plus"
style="background-color: #1e1e1e; color: #d4d4d4; overflow-x: auto"
tabindex="0"
data-language="html"
><code><span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#9CDCFE"> src</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"https://cdn.jsdelivr.net/npm/imask@7.6.1/dist/imask.min.js"</span><span style="color:#808080">></</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">input</span><span style="color:#9CDCFE"> class</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"form-control"</span><span style="color:#9CDCFE"> id</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"phone"</span><span style="color:#9CDCFE"> placeholder</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"(123) 456-7890"</span><span style="color:#808080"> /></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"><span style="color:#DCDCAA"> IMask</span><span style="color:#D4D4D4">(</span><span style="color:#9CDCFE">document</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">getElementById</span><span style="color:#D4D4D4">(</span><span style="color:#CE9178">"phone"</span><span style="color:#D4D4D4">), { </span><span style="color:#9CDCFE">mask:</span><span style="color:#CE9178"> "(000) 000-0000"</span><span style="color:#D4D4D4"> })</span></span>
<span class="line"><span style="color:#808080"></</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span></code></pre>
<h5 id="file-handling">File handling</h5>
<h6 id="file-uploader--dropzone">File uploader — Dropzone</h6>
<p>
<a href="https://www.dropzone.dev/">Dropzone</a> is the de-facto drag-and-drop
uploader. The v6 rewrite is plain JavaScript (the older v5 had jQuery-coupled
examples; v6+ does not).
</p>
<pre
class="astro-code dark-plus"
style="background-color: #1e1e1e; color: #d4d4d4; overflow-x: auto"
tabindex="0"
data-language="html"
><code><span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">link</span><span style="color:#9CDCFE"> rel</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"stylesheet"</span><span style="color:#9CDCFE"> href</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"https://cdn.jsdelivr.net/npm/dropzone@6.0.0-beta.2/dist/dropzone.css"</span><span style="color:#808080"> /></span></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#9CDCFE"> src</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"https://cdn.jsdelivr.net/npm/dropzone@6.0.0-beta.2/dist/dropzone-min.js"</span><span style="color:#808080">></</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">form</span><span style="color:#9CDCFE"> action</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"/upload"</span><span style="color:#9CDCFE"> class</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"dropzone"</span><span style="color:#9CDCFE"> id</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"uploader"</span><span style="color:#808080">></</span><span style="color:#569CD6">form</span><span style="color:#808080">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"><span style="color:#9CDCFE"> Dropzone</span><span style="color:#D4D4D4">.</span><span style="color:#9CDCFE">autoDiscover</span><span style="color:#D4D4D4"> = </span><span style="color:#569CD6">false</span></span>
<span class="line"><span style="color:#569CD6"> new</span><span style="color:#DCDCAA"> Dropzone</span><span style="color:#D4D4D4">(</span><span style="color:#CE9178">"#uploader"</span><span style="color:#D4D4D4">, { </span><span style="color:#9CDCFE">paramName:</span><span style="color:#CE9178"> "file"</span><span style="color:#D4D4D4">, </span><span style="color:#9CDCFE">maxFilesize:</span><span style="color:#B5CEA8"> 5</span><span style="color:#D4D4D4"> })</span></span>
<span class="line"><span style="color:#808080"></</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span></code></pre>
<h6 id="file-uploader--filepond">File uploader — FilePond</h6>
<p>
<a href="https://pqina.nl/filepond/">FilePond</a> is a more modern alternative
with a polished UX and a plugin system for image preview, validation, EXIF,
etc.
</p>
<pre
class="astro-code dark-plus"
style="background-color: #1e1e1e; color: #d4d4d4; overflow-x: auto"
tabindex="0"
data-language="html"
><code><span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">link</span><span style="color:#9CDCFE"> rel</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"stylesheet"</span><span style="color:#9CDCFE"> href</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"https://cdn.jsdelivr.net/npm/filepond@4.32.12/dist/filepond.min.css"</span><span style="color:#808080"> /></span></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#9CDCFE"> src</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"https://cdn.jsdelivr.net/npm/filepond@4.32.12/dist/filepond.min.js"</span><span style="color:#808080">></</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">input</span><span style="color:#9CDCFE"> type</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"file"</span><span style="color:#9CDCFE"> class</span><span style="color:#D4D4D4">=</span><span style="color:#CE9178">"filepond"</span><span style="color:#808080"> /></span></span>
<span class="line"></span>
<span class="line"><span style="color:#808080"><</span><span style="color:#569CD6">script</span><span style="color:#808080">></span></span>
<span class="line"><span style="color:#9CDCFE"> FilePond</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">create</span><span style="color:#D4D4D4">(</span><span style="color:#9CDCFE">document</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">querySelector</span><span style="color:#D4D4D4">(</span><span style="color:#CE9178">".filepond"</span><span style="color:#D4D4D4">), { </span><span style="color:#9CDCFE">allowMultiple:</span><span style="color:#569CD6"> true</span><span style="color:#D4D4D4"> })</