瀏覽代碼

Merge branch 'dev' into dev-css-props

Paweł Kuna 7 月之前
父節點
當前提交
05ab7eff71
共有 45 個文件被更改,包括 877 次插入353 次删除
  1. 3 1
      .changeset/config.json
  2. 5 0
      .changeset/dry-rice-march.md
  3. 5 0
      .changeset/gorgeous-mugs-admire.md
  4. 5 0
      .changeset/grumpy-flowers-act.md
  5. 5 0
      .changeset/large-walls-wave.md
  6. 5 0
      .changeset/long-falcons-fetch.md
  7. 5 0
      .changeset/odd-boats-hear.md
  8. 5 0
      .changeset/orange-moose-run.md
  9. 5 0
      .changeset/polite-houses-raise.md
  10. 5 0
      .changeset/red-pens-punch.md
  11. 5 0
      .changeset/stale-pianos-crash.md
  12. 5 0
      .changeset/ten-houses-punch.md
  13. 0 1
      .changeset/thin-clouds-glow.md
  14. 1 1
      .gitignore
  15. 11 11
      core/package.json
  16. 1 0
      core/scss/_core.scss
  17. 1 0
      core/scss/ui/_avatars.scss
  18. 1 1
      core/scss/ui/_badges.scss
  19. 2 2
      core/scss/ui/_calendars.scss
  20. 11 0
      core/scss/ui/_forms.scss
  21. 3 3
      core/scss/ui/_nav.scss
  22. 101 0
      core/scss/ui/_segmented.scss
  23. 12 0
      core/scss/utils/_colors.scss
  24. 1 1
      core/scss/utils/_opacity.scss
  25. 26 32
      docs/ui/components/charts.mdx
  26. 201 0
      docs/ui/components/segmented-control.mdx
  27. 12 9
      package.json
  28. 180 89
      pnpm-lock.yaml
  29. 14 3
      preview/eleventy.config.mjs
  30. 13 13
      preview/package.json
  31. 10 0
      preview/pages/_data/menu.json
  32. 4 4
      preview/pages/_includes/cards/tables/progressbg.html
  33. 8 9
      preview/pages/_includes/cards/timeline.html
  34. 2 2
      preview/pages/_includes/layout/css.html
  35. 1 1
      preview/pages/_includes/layout/headers/profile.html
  36. 1 1
      preview/pages/_includes/layout/js.html
  37. 3 3
      preview/pages/_includes/layout/page-header.html
  38. 1 1
      preview/pages/_includes/ui/icon.html
  39. 28 0
      preview/pages/_includes/ui/nav-segmented.html
  40. 8 8
      preview/pages/_includes/ui/trending.html
  41. 1 1
      preview/pages/chat.html
  42. 0 153
      preview/pages/playground.html
  43. 3 3
      preview/pages/pricing-table.html
  44. 49 0
      preview/pages/scroll-spy.html
  45. 109 0
      preview/pages/segmented-control.html

+ 3 - 1
.changeset/config.json

@@ -6,5 +6,7 @@
   "linked": [],
   "access": "public",
   "baseBranch": "main",
-  "ignore": []
+  "ignore": [
+    "preview"
+  ]
 }

+ 5 - 0
.changeset/dry-rice-march.md

@@ -0,0 +1,5 @@
+---
+"@tabler/core": patch
+---
+
+Fix overflow of `label` in a `floating-input`

+ 5 - 0
.changeset/gorgeous-mugs-admire.md

@@ -0,0 +1,5 @@
+---
+"@tabler/core": patch
+---
+
+Refactor SCSS files to replace divide function with calc

+ 5 - 0
.changeset/grumpy-flowers-act.md

@@ -0,0 +1,5 @@
+---
+"@tabler/core": minor
+---
+
+Add segmented control component

+ 5 - 0
.changeset/large-walls-wave.md

@@ -0,0 +1,5 @@
+---
+"preview": patch
+---
+
+Fix timeline card layout and profile header styles

+ 5 - 0
.changeset/long-falcons-fetch.md

@@ -0,0 +1,5 @@
+---
+"@tabler/core": minor
+---
+
+Add Scroll Spy page

+ 5 - 0
.changeset/odd-boats-hear.md

@@ -0,0 +1,5 @@
+---
+
+---
+
+Fix apexcharts heatmap example in docs

+ 5 - 0
.changeset/orange-moose-run.md

@@ -0,0 +1,5 @@
+---
+"@tabler/core": minor
+---
+
+Update color utility classes and replace background colors in pricing table

+ 5 - 0
.changeset/polite-houses-raise.md

@@ -0,0 +1,5 @@
+---
+"preview": patch
+---
+
+Fix broken "top pages" table

+ 5 - 0
.changeset/red-pens-punch.md

@@ -0,0 +1,5 @@
+---
+"@tabler/core": patch
+---
+
+Fix negative margins in `.navbar-bordered` variant

+ 5 - 0
.changeset/stale-pianos-crash.md

@@ -0,0 +1,5 @@
+---
+"@tabler/core": "minor"
+---
+
+Add documentation for segmented control component

+ 5 - 0
.changeset/ten-houses-punch.md

@@ -0,0 +1,5 @@
+---
+"@tabler/core": patch
+---
+
+Fix `.avatar-upload` double borders 

+ 0 - 1
.changeset/thin-clouds-glow.md

@@ -1,5 +1,4 @@
 ---
-"preview": patch
 ---
 
 Update `robots.txt` handling and improve sitemap URL generation

+ 1 - 1
.gitignore

@@ -20,9 +20,9 @@ node_modules/
 /components/
 /percy.sh
 /preview/pages/playground.html
-/preview/pages/playground-*.html
 /preview/pages/screenshot.html
 /preview/pages/screenshot-*.html
+/preview/pages/playground-*.html
 /preview/pages/features.html
 
 .pnp.loader.mjs

+ 11 - 11
core/package.json

@@ -6,27 +6,27 @@
   "scripts": {
     "dev": "pnpm run watch",
     "build": "pnpm run clean && pnpm run css && pnpm run js && pnpm run copy",
-    "clean": "rm -rf dist/* demo",
+    "clean": "shx rm -rf dist demo",
     "css": "pnpm run css-compile && pnpm run css-prefix && pnpm run css-rtl && pnpm run css-minify && pnpm run css-banner",
     "css-compile": "sass scss/:dist/css/ --no-source-map --load-path=node_modules",
     "css-banner": "node build/add-banner.mjs",
-    "css-prefix": "postcss --config build/postcss.config.mjs --replace 'dist/css/*.css' '!dist/css/*.rtl*.css' '!dist/css/*.min.css'",
-    "css-rtl": "cross-env NODE_ENV=RTL postcss --config build/postcss.config.mjs --dir 'dist/css' --ext '.rtl.css' 'dist/css/*.css' '!dist/css/*.min.css' '!dist/css/*.rtl.css'",
+    "css-prefix": "postcss --config build/postcss.config.mjs --replace \"dist/css/*.css\" \"!dist/css/*.rtl*.css\" \"!dist/css/*.min.css\"",
+    "css-rtl": "cross-env NODE_ENV=RTL postcss --config build/postcss.config.mjs --dir \"dist/css\" --ext \".rtl.css\" \"dist/css/*.css\" \"!dist/css/*.min.css\" \"!dist/css/*.rtl.css\"",
     "css-minify": "pnpm run css-minify-main && pnpm run css-minify-rtl",
-    "css-minify-main": "cleancss -O1 --format breakWith=lf --with-rebase --source-map --source-map-inline-sources --output dist/css/ --batch --batch-suffix '.min' 'dist/css/*.css' '!dist/css/*.min.css' '!dist/css/*rtl*.css'",
-    "css-minify-rtl": "cleancss -O1 --format breakWith=lf --with-rebase --source-map --source-map-inline-sources --output dist/css/ --batch --batch-suffix '.min' 'dist/css/*rtl.css' '!dist/css/*.min.css'",
+    "css-minify-main": "cleancss -O1 --format breakWith=lf --with-rebase --source-map --source-map-inline-sources --output dist/css/ --batch --batch-suffix \".min\" \"dist/css/*.css\" \"!dist/css/*.min.css\" \"!dist/css/*rtl*.css\"",
+    "css-minify-rtl": "cleancss -O1 --format breakWith=lf --with-rebase --source-map --source-map-inline-sources --output dist/css/ --batch --batch-suffix \".min\" \"dist/css/*rtl.css\" \"!dist/css/*.min.css\"",
     "js": "pnpm run js-compile && pnpm run js-minify",
     "js-compile": "pnpm run js-compile-standalone && pnpm run js-compile-standalone-esm",
     "js-compile-standalone": "rollup --config build/rollup.config.mjs --sourcemap",
     "js-compile-standalone-esm": "rollup --environment ESM:true --config build/rollup.config.mjs --sourcemap",
     "js-minify": "pnpm run js-minify-standalone && pnpm run js-minify-standalone-esm",
-    "js-minify-standalone": "terser --compress passes=2 --mangle --comments '/^!/' --source-map 'content=dist/js/tabler.js.map,includeSources,url=tabler.min.js.map' --output dist/js/tabler.min.js dist/js/tabler.js",
-    "js-minify-standalone-esm": "terser --compress passes=2 --mangle --comments '/^!/' --source-map 'content=dist/js/tabler.esm.js.map,includeSources,url=tabler.esm.min.js.map' --output dist/js/tabler.esm.min.js dist/js/tabler.esm.js",
+    "js-minify-standalone": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/js/tabler.js.map,includeSources,url=tabler.min.js.map\" --output dist/js/tabler.min.js dist/js/tabler.js",
+    "js-minify-standalone-esm": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/js/tabler.esm.js.map,includeSources,url=tabler.esm.min.js.map\" --output dist/js/tabler.esm.min.js dist/js/tabler.esm.js",
     "copy": "pnpm run copy-img",
-    "copy-img": "cp -r img dist/img",
-    "watch": "pnpm run watch-css & pnpm run watch-js",
-    "watch-css": "nodemon --watch scss/ --ext scss --exec 'pnpm run css-compile && pnpm run css-prefix'",
-    "watch-js": "nodemon --watch js/ --ext js --exec 'pnpm run js-compile'",
+    "copy-img": "shx mkdir -p dist/img && shx cp -rf img/* dist/img",
+    "watch": "concurrently \"pnpm run watch-css\" \"pnpm run watch-js\"",
+    "watch-css": "nodemon --watch scss/ --ext scss --exec \"pnpm run css-compile && pnpm run css-prefix\"",
+    "watch-js": "nodemon --watch js/ --ext js --exec \"pnpm run js-compile\"",
     "bundlewatch": "bundlewatch",
     "format:check": "prettier --check src/**/*.{js,scss} --cache",
     "format:write": "prettier --write src/**/*.{js,scss} --cache"

+ 1 - 0
core/scss/_core.scss

@@ -49,6 +49,7 @@
 @import "ui/ribbons";
 @import "ui/markdown";
 @import "ui/placeholder";
+@import "ui/segmented";
 @import "ui/steps";
 @import "ui/status";
 @import "ui/switch-icon";

+ 1 - 0
core/scss/ui/_avatars.scss

@@ -90,6 +90,7 @@
   height: 4rem;
   border: var(--#{$prefix}border-width) dashed var(--#{$prefix}border-color);
   background: $form-check-input-bg;
+  box-shadow: none;
   flex-direction: column;
   @include transition(color $transition-time, background-color $transition-time);
 

+ 1 - 1
core/scss/ui/_badges.scss

@@ -5,7 +5,7 @@
   overflow: hidden;
   user-select: none;
   border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) transparent;
-  min-width: ($badge-padding-y * 2 ) + (divide($badge-font-size, 100%) * 1em);
+  min-width: 1.25rem;
   font-weight: $headings-font-weight;
   letter-spacing: .04em;
   vertical-align: bottom;

+ 2 - 2
core/scss/ui/_calendars.scss

@@ -28,8 +28,8 @@
 }
 
 .calendar-date {
-  flex: 0 0 divide(100%, 7);
-  max-width: divide(100%, 7);
+  flex: 0 0 calc(100% / 7);
+  max-width: calc(100% / 7);
   padding: .2rem;
   text-align: center;
   border: 0;

+ 11 - 0
core/scss/ui/_forms.scss

@@ -227,4 +227,15 @@ Upload files
 .form-file-button {
   margin-left: 0;
   border-left: 0;
+}
+
+/**
+Floating inputs
+ */
+// Fix for the bug in twbs/bootstrap v5.3.3. Issue #39080. Should be fixed in v5.3.4
+label[for="floating-input"] {
+  max-width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
 }

+ 3 - 3
core/scss/ui/_nav.scss

@@ -13,7 +13,7 @@
 
   .nav-link.active,
   .nav-item.show .nav-link {
-    font-weight: var(--#{$prefix}font-weight-bold);
+    font-weight: var(--#{$prefix}font-weight-medium);
   }
 
   &.nav-pills {
@@ -36,7 +36,7 @@
   .nav-link {
     padding-left: 0;
     padding-right: 0;
-    margin: 0 0 (- $nav-bordered-border-width);
+    margin: 0 0 calc(-1 * #{$nav-bordered-border-width});
     border: 0;
     border-bottom: $nav-bordered-link-active-border-width var(--#{$prefix}border-style) transparent;
   }
@@ -88,4 +88,4 @@
       justify-content: center;
     }
   }
-}
+}

+ 101 - 0
core/scss/ui/_segmented.scss

@@ -0,0 +1,101 @@
+.nav-segmented {
+  --#{$prefix}nav-bg: var(--#{$prefix}bg-surface-tertiary);
+  --#{$prefix}nav-padding: 2px;
+  --#{$prefix}nav-height: 2.5rem;
+  --#{$prefix}nav-gap: .25rem;
+  --#{$prefix}nav-active-bg: var(--#{$prefix}bg-surface);
+  --#{$prefix}nav-font-size: inherit;
+  --#{$prefix}nav-radius: 6px;
+
+
+  --#{$prefix}nav-link-disabled-color: var(--#{$prefix}disabled-color);
+  --#{$prefix}nav-link-gap: .25rem;
+  --#{$prefix}nav-link-padding-x: .75rem;
+  --#{$prefix}nav-link-icon-size: 1.25rem;
+  display: inline-flex;
+  flex-wrap: wrap;
+  gap: var(--#{$prefix}nav-gap);
+  padding: var(--#{$prefix}nav-padding);
+  list-style: none;
+  background: var(--#{$prefix}nav-bg);
+  border-radius: calc(var(--#{$prefix}nav-radius) + var(--#{$prefix}nav-padding));
+  box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .04);
+
+  .nav-link {
+    display: inline-flex;
+    gap: calc(.25rem + var(--#{$prefix}nav-link-gap));
+    align-items: center;
+    margin: 0;
+    font-size: var(--#{$prefix}nav-font-size);
+    min-width: calc(var(--#{$prefix}nav-height) - 2 * var(--#{$prefix}nav-padding)); 
+    height: calc(var(--#{$prefix}nav-height) - 2 * var(--#{$prefix}nav-padding));
+    padding: 0 calc(var(--#{$prefix}nav-link-padding-x) - 2px);
+    border: 1px solid transparent;
+    background: transparent;
+    color: var(--#{$prefix}secondary);
+    text-align: center;
+    text-decoration: none;
+    white-space: nowrap;
+    cursor: pointer;
+    transition: background-color $transition-time, color $transition-time;
+    border-radius: var(--#{$prefix}nav-radius);
+    flex-grow: 1;   
+    justify-content: center;
+
+    &:hover,
+    &.hover  {
+      background: rgba(0, 0, 0, .04);
+      color: var(--#{$prefix}body-color);
+    }
+
+    &.disabled,
+    &:disabled {
+      color: var(--#{$prefix}nav-link-disabled-color);
+      cursor: not-allowed;
+    }
+  }
+
+  .nav-link-input:checked + .nav-link,
+  .nav-link.active {
+    color: var(--#{$prefix}body-color);
+    background: var(--#{$prefix}nav-active-bg);
+    border-color: var(--#{$prefix}border-color);
+  }
+
+  .nav-link-input {
+    display: none;
+  }
+
+  .nav-link-icon {
+    width: var(--#{$prefix}nav-link-icon-size);
+    height: var(--#{$prefix}nav-link-icon-size);
+    margin: 0 -.25rem;
+    color: inherit;
+  }
+}
+
+.nav-segmented-vertical {
+  flex-direction: column;
+
+  .nav-link {
+    justify-content: flex-start;
+  }
+}
+
+.nav-sm {
+  --#{$prefix}nav-height: 2rem;
+  --#{$prefix}nav-font-size: var(--tblr-font-size-h5);
+  --#{$prefix}nav-radius: 4px;
+  --#{$prefix}nav-link-padding-x: .5rem;
+  --#{$prefix}nav-link-gap: .25rem;
+  --#{$prefix}nav-link-icon-size: 1rem;
+}
+
+.nav-lg {
+  --#{$prefix}nav-height: 3rem;
+  --#{$prefix}nav-font-size: var(--tblr-font-size-h3);
+  --#{$prefix}nav-radius: 8px;
+  --#{$prefix}nav-link-padding-x: 1rem;
+  --#{$prefix}nav-link-gap: .5rem;
+  --#{$prefix}nav-link-icon-size: 1.5rem;
+}

+ 12 - 0
core/scss/utils/_colors.scss

@@ -39,3 +39,15 @@
     color: $value !important;
   }
 }
+
+.bg-surface {
+  background-color: var(--#{$prefix}bg-surface) !important;
+}
+
+.bg-surface-secondary {
+  background-color: var(--#{$prefix}bg-surface-secondary) !important;
+}
+
+.bg-surface-tertiary {
+  background-color: var(--#{$prefix}bg-surface-tertiary) !important;
+}

+ 1 - 1
core/scss/utils/_opacity.scss

@@ -2,6 +2,6 @@
 
 @for $i from 0 through 20 {
   .opacity-#{$i * 5} {
-    opacity: divide($i * 5, 100) !important;
+    opacity: calc(#{$i * 5} / 100) !important;
   }
 }

+ 26 - 32
docs/ui/components/charts.mdx

@@ -352,10 +352,7 @@ Pie charts are a simple and effective way to visualize proportions and ratios. T
           horizontal: 8,
           vertical: 8
         },
-      },
-      tooltip: {
-        fillSeriesColor: false
-      },
+      }
     })).render();
   });
 </script>
@@ -368,51 +365,48 @@ Heatmaps provide a graphical representation of data where individual values are
 ```html example centered columns={2} height="25rem" libs="apexcharts"
 <div class="card">
   <div class="card-body">
-    <div id="chart-demo-pie" class="chart-lg"></div>
+    <div id="chart-demo-heatmap" class="chart-lg"></div>
   </div>
 </div>
 <script>
   document.addEventListener("DOMContentLoaded", function() {
-    window.ApexCharts && (new ApexCharts(document.getElementById('chart-demo-pie'), {
+    window.ApexCharts && (new ApexCharts(document.getElementById('chart-demo-heatmap'), {
       chart: {
-        type: "donut",
+        type: "heatmap",
         fontFamily: 'inherit',
         height: 240,
-        sparkline: {
-          enabled: true
-        },
         animations: {
           enabled: false
         },
+		  toolbar: {
+			 show: false
+		  }
       },
-      fill: {
-        opacity: 1,
-      },
-      series: [44, 55, 12, 2],
-      labels: ["Direct", "Affilliate", "E-mail", "Other"],
       tooltip: {
         theme: 'dark'
       },
-      grid: {
-        strokeDashArray: 4,
+      fill: {
+        opacity: 1,
       },
-      colors: [tabler.getColor("primary"), tabler.getColor("primary", 0.8), tabler.getColor("primary", 0.6), tabler.getColor("gray-300")],
-      legend: {
-        show: true,
-        position: 'bottom',
-        offsetY: 12,
-        markers: {
-          width: 10,
-          height: 10,
-          radius: 100,
-        },
-        itemMargin: {
-          horizontal: 8,
-          vertical: 8
+       series: [
+        { name: 'New York', data: [{ x: 'Monday', y: 22 }, { x: 'Tuesday', y: 24 }, { x: 'Wednesday', y: 19 }, { x: 'Thursday', y: 23 }, { x: 'Friday', y: 25 }, { x: 'Saturday', y: 27 }, { x: 'Sunday', y: 26 }] },
+        { name: 'Los Angeles', data: [{ x: 'Monday', y: 28 }, { x: 'Tuesday', y: 30 }, { x: 'Wednesday', y: 27 }, { x: 'Thursday', y: 29 }, { x: 'Friday', y: 31 }, { x: 'Saturday', y: 32 }, { x: 'Sunday', y: 33 }] },
+        { name: 'Chicago', data: [{ x: 'Monday', y: 18 }, { x: 'Tuesday', y: 20 }, { x: 'Wednesday', y: 17 }, { x: 'Thursday', y: 19 }, { x: 'Friday', y: 21 }, { x: 'Saturday', y: 22 }, { x: 'Sunday', y: 23 }] },
+        { name: 'Houston', data: [{ x: 'Monday', y: 25 }, { x: 'Tuesday', y: 27 }, { x: 'Wednesday', y: 24 }, { x: 'Thursday', y: 26 }, { x: 'Friday', y: 28 }, { x: 'Saturday', y: 29 }, { x: 'Sunday', y: 30 }] },
+        { name: 'Phoenix', data: [{ x: 'Monday', y: 33 }, { x: 'Tuesday', y: 35 }, { x: 'Wednesday', y: 32 }, { x: 'Thursday', y: 34 }, { x: 'Friday', y: 36 }, { x: 'Saturday', y: 37 }, { x: 'Sunday', y: 38 }] },
+        { name: 'Philadelphia', data: [{ x: 'Monday', y: 20 }, { x: 'Tuesday', y: 22 }, { x: 'Wednesday', y: 19 }, { x: 'Thursday', y: 21 }, { x: 'Friday', y: 23 }, { x: 'Saturday', y: 24 }, { x: 'Sunday', y: 25 }] }
+      ],
+      colors: [tabler.getColor("primary")],
+      dataLabels: {
+        enabled: false
+      },
+      xaxis: {
+        tooltip: {
+          enabled: false
         },
       },
-      tooltip: {
-        fillSeriesColor: false
+      title: {
+        text: 'Average Temperature by Day and City',
       },
     })).render();
   });

+ 201 - 0
docs/ui/components/segmented-control.mdx

@@ -0,0 +1,201 @@
+---
+title: Segmented Control
+summary: A segmented control is a set of two or more segments, each of which functions as a mutually exclusive button. A segmented control is used to display a set of mutually exclusive options.
+---
+
+To create a segmented control, use the `nav` element with the `nav-segmented` class. Inside the `nav` element, add `button` or `a` elements with the `nav-link` class. The `nav-link` class is used to style the buttons as links. 
+
+```html
+<nav class="nav nav-segmented" role="tablist">
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="true" aria-current="page">
+		First
+	</button>
+	...
+</nav>
+```
+
+See the example below to see how the segmented control looks.
+
+```html example centered background="white"
+<nav class="nav nav-segmented" role="tablist">
+	<button class="nav-link active" role="tab" data-bs-toggle="tab" aria-selected="true" aria-current="page">
+		First
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		Second
+	</button>
+	<button class="nav-link" disabled role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		Disabled
+	</button>
+</nav>
+```
+
+## Full width
+
+To make the segmented control full width, add the `w-100` class to the `nav` element. It will take up the full width of its parent container.
+
+```html
+<nav class="nav nav-segmented w-100" role="tablist">
+	...
+</nav>
+```
+
+The results can be seen in the example below.
+
+```html example vcentered background="white"
+<nav class="nav nav-segmented w-100" role="tablist">
+	<button class="nav-link active" role="tab" data-bs-toggle="tab" aria-selected="true" aria-current="page">
+		Daily
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		Weekly
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		Monthly
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		Quarterly
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		Yearly
+	</button>
+</nav>
+```
+
+## With emojis
+
+You can also use emojis in the segmented control. To do this, add the emoji inside the `button` element.
+
+```html example centered background="white"
+<nav class="nav nav-segmented nav-1" role="tablist">
+	<button class="nav-link active" role="tab" data-bs-toggle="tab" aria-selected="true" aria-current="page">
+		👦
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		👦🏿
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		👦🏾
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		👦🏽
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		👦🏼
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		👦🏻
+	</button>
+</nav>
+```
+
+## With icons
+
+You can also use icons in the segmented control. To do this, add the icon inside the `button` element.
+
+
+```html example centered background="white"
+<nav class="nav nav-segmented" role="tablist">
+	<button class="nav-link active" role="tab" data-bs-toggle="tab" aria-selected="true" aria-current="page">
+		<!-- Download SVG icon from http://tabler.io/icons/icon/list -->
+		<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon nav-link-icon icon-2"><path d="M9 6l11 0"></path><path d="M9 12l11 0"></path><path d="M9 18l11 0"></path><path d="M5 6l0 .01"></path><path d="M5 12l0 .01"></path><path d="M5 18l0 .01"></path></svg>
+		List
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+	<!-- Download SVG icon from http://tabler.io/icons/icon/layout -->
+	<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon nav-link-icon icon-2"><path d="M4 4m0 2a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v1a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z"></path><path d="M4 13m0 2a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v3a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z"></path><path d="M14 4m0 2a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z"></path></svg>
+		Kanban
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		<!-- Download SVG icon from http://tabler.io/icons/icon/calendar -->
+		<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon nav-link-icon icon-2"><path d="M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12z"></path><path d="M16 3v4"></path><path d="M8 3v4"></path><path d="M4 11h16"></path><path d="M11 15h1"></path><path d="M12 15v3"></path></svg>
+		Calendar
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		<!-- Download SVG icon from http://tabler.io/icons/icon/files -->
+		<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon nav-link-icon icon-2"><path d="M15 3v4a1 1 0 0 0 1 1h4"></path><path d="M18 17h-7a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h4l5 5v7a2 2 0 0 1 -2 2z"></path><path d="M16 17v2a2 2 0 0 1 -2 2h-7a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h2"></path></svg>
+		Files
+	</button>
+</nav>
+```
+
+## Vertical direction
+
+To create a vertical segmented control, add the `nav-segmented-vertical` class to the `nav` element.
+
+```html
+<nav class="nav nav-segmented-vertical" role="tablist">
+	...
+</nav>
+```
+
+The results can be seen in the example below.
+
+```html example centered background="white"
+<nav class="nav nav-segmented nav-segmented-vertical" role="tablist">
+		<button class="nav-link active" role="tab" data-bs-toggle="tab" aria-selected="true" aria-current="page">
+	<!-- Download SVG icon from http://tabler.io/icons/icon/list -->
+	<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon nav-link-icon icon-2"><path d="M9 6l11 0"></path><path d="M9 12l11 0"></path><path d="M9 18l11 0"></path><path d="M5 6l0 .01"></path><path d="M5 12l0 .01"></path><path d="M5 18l0 .01"></path></svg>
+				List
+		</button>
+		<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+	<!-- Download SVG icon from http://tabler.io/icons/icon/layout -->
+	<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon nav-link-icon icon-2"><path d="M4 4m0 2a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v1a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z"></path><path d="M4 13m0 2a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v3a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z"></path><path d="M14 4m0 2a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2z"></path></svg>
+				Kanban
+		</button>
+		<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+	<!-- Download SVG icon from http://tabler.io/icons/icon/calendar -->
+	<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon nav-link-icon icon-2"><path d="M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12z"></path><path d="M16 3v4"></path><path d="M8 3v4"></path><path d="M4 11h16"></path><path d="M11 15h1"></path><path d="M12 15v3"></path></svg>
+				Calendar
+		</button>
+		<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+	<!-- Download SVG icon from http://tabler.io/icons/icon/files -->
+	<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon nav-link-icon icon-2"><path d="M15 3v4a1 1 0 0 0 1 1h4"></path><path d="M18 17h-7a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h4l5 5v7a2 2 0 0 1 -2 2z"></path><path d="M16 17v2a2 2 0 0 1 -2 2h-7a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h2"></path></svg>
+				Files
+		</button>
+</nav>
+```
+
+## Sizes 
+
+You can also change the size of the segmented control. To do this, add the `nav-sm` or `nv-lg` class to the `nav` element. The `nav-sm` class will make the segmented control smaller, while the `nav-lg` class will make it larger.
+
+```html
+<nav class="nav nav-segmented nav-sm" role="tablist">
+	...
+</nav>
+```
+
+The results can be seen in the examples below.
+
+```html example vertical centered background="white" separated
+<nav class="nav nav-segmented nav-sm" role="tablist">
+	<button class="nav-link active" role="tab" data-bs-toggle="tab" aria-selected="true" aria-current="page">
+		List
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		Kanban
+	</button>
+	<button class="nav-link disabled" role="tab" data-bs-toggle="tab" aria-selected="false" aria-disabled="true" tabindex="-1">
+		Calendar
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		Files
+	</button>
+</nav>
+
+<nav class="nav nav-segmented nav-lg" role="tablist">
+	<button class="nav-link active" role="tab" data-bs-toggle="tab" aria-selected="true" aria-current="page">
+		List
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		Kanban
+	</button>
+	<button class="nav-link disabled" role="tab" data-bs-toggle="tab" aria-selected="false" aria-disabled="true" tabindex="-1">
+		Calendar
+	</button>
+	<button class="nav-link" role="tab" data-bs-toggle="tab" aria-selected="false" tabindex="-1">
+		Files
+	</button>
+</nav>
+```

+ 12 - 9
package.json

@@ -13,26 +13,29 @@
   },
   "packageManager": "[email protected]",
   "devDependencies": {
+    "@changesets/changelog-github": "^0.5.0",
+    "@changesets/cli": "^2.27.12",
     "@rollup/plugin-babel": "^6.0.4",
     "@rollup/plugin-commonjs": "^28.0.2",
     "@rollup/plugin-node-resolve": "^16.0.0",
     "@rollup/plugin-replace": "^6.0.2",
     "autoprefixer": "^10.4.20",
     "bundlewatch": "^0.4.0",
+    "clean-css-cli": "^5.6.3",
+    "concurrently": "^9.1.2",
     "cross-env": "^7.0.3",
+    "glob": "^11.0.1",
+    "js-beautify": "^1.15.1",
     "nodemon": "^3.1.9",
+    "pnpm": "9.15.4",
     "postcss": "^8.5.1",
     "postcss-cli": "^11.0.0",
-    "rollup": "4.34.0",
+    "prettier": "^3.4.2",
+    "rollup": "4.34.4",
     "rtlcss": "^4.3.0",
     "sass": "1.71.0",
-    "clean-css-cli": "^5.6.3",
-    "terser": "^5.37.0",
-    "@changesets/changelog-github": "^0.5.0",
-    "@changesets/cli": "^2.27.12",
-    "glob": "^11.0.1",
-    "js-beautify": "^1.15.1",
-    "prettier": "^3.4.2",
-    "turbo": "^2.4.0"
+    "terser": "^5.38.1",
+    "turbo": "^2.4.0",
+    "shx": "^0.3.4"
   }
 }

+ 180 - 89
pnpm-lock.yaml

@@ -16,16 +16,16 @@ importers:
         version: 2.27.12
       '@rollup/plugin-babel':
         specifier: ^6.0.4
-        version: 6.0.4(@babel/[email protected])([email protected].0)
+        version: 6.0.4(@babel/[email protected])([email protected].4)
       '@rollup/plugin-commonjs':
         specifier: ^28.0.2
-        version: 28.0.2([email protected].0)
+        version: 28.0.2([email protected].4)
       '@rollup/plugin-node-resolve':
         specifier: ^16.0.0
-        version: 16.0.0([email protected].0)
+        version: 16.0.0([email protected].4)
       '@rollup/plugin-replace':
         specifier: ^6.0.2
-        version: 6.0.2([email protected].0)
+        version: 6.0.2([email protected].4)
       autoprefixer:
         specifier: ^10.4.20
         version: 10.4.20([email protected])
@@ -35,6 +35,9 @@ importers:
       clean-css-cli:
         specifier: ^5.6.3
         version: 5.6.3
+      concurrently:
+        specifier: ^9.1.2
+        version: 9.1.2
       cross-env:
         specifier: ^7.0.3
         version: 7.0.3
@@ -47,6 +50,9 @@ importers:
       nodemon:
         specifier: ^3.1.9
         version: 3.1.9
+      pnpm:
+        specifier: 9.15.4
+        version: 9.15.4
       postcss:
         specifier: ^8.5.1
         version: 8.5.1
@@ -57,17 +63,20 @@ importers:
         specifier: ^3.4.2
         version: 3.4.2
       rollup:
-        specifier: 4.34.0
-        version: 4.34.0
+        specifier: 4.34.4
+        version: 4.34.4
       rtlcss:
         specifier: ^4.3.0
         version: 4.3.0
       sass:
         specifier: 1.71.0
         version: 1.71.0
+      shx:
+        specifier: ^0.3.4
+        version: 0.3.4
       terser:
-        specifier: ^5.37.0
-        version: 5.37.0
+        specifier: ^5.38.1
+        version: 5.38.1
       turbo:
         specifier: ^2.4.0
         version: 2.4.0
@@ -88,8 +97,8 @@ importers:
   preview:
     dependencies:
       '@melloware/coloris':
-        specifier: ^0.19.1
-        version: 0.19.1
+        specifier: ^0.24.0
+        version: 0.24.0
       '@tabler/core':
         specifier: workspace:*
         version: link:../core
@@ -139,10 +148,10 @@ importers:
         specifier: ^4.3.1
         version: 4.3.1
       tinymce:
-        specifier: ^7.6.0
+        specifier: ^7.6.1
         version: 7.6.1
       tom-select:
-        specifier: ^2.4.1
+        specifier: ^2.4.2
         version: 2.4.2
       typed.js:
         specifier: ^2.1.0
@@ -741,8 +750,8 @@ packages:
       read-yaml-file: 1.1.0
     dev: true
 
-  /@melloware/coloris@0.19.1:
-    resolution: {integrity: sha512-7C1ue136iQw3UCLy5GoCxXR+u4F1eB0MMmpAwUH2okdQwmdjVNd+OmIQBKVDbM78lMFFJxzvtilWkYV/l8/4rw==}
+  /@melloware/coloris@0.24.0:
+    resolution: {integrity: sha512-9RGKHqZJsUSsxb/0xaBCK5OKywobiK/xRtV8f4KQDmviqmVfkMLR3kK4DRuTTLSFdSOqkV0OQ/Niitu+rlXXYw==}
     dev: false
 
   /@nodelib/[email protected]:
@@ -791,7 +800,7 @@ packages:
     resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
     dev: false
 
-  /@rollup/[email protected](@babel/[email protected])([email protected].0):
+  /@rollup/[email protected](@babel/[email protected])([email protected].4):
     resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
@@ -806,13 +815,13 @@ packages:
     dependencies:
       '@babel/core': 7.26.7
       '@babel/helper-module-imports': 7.25.9
-      '@rollup/pluginutils': 5.1.4([email protected].0)
-      rollup: 4.34.0
+      '@rollup/pluginutils': 5.1.4([email protected].4)
+      rollup: 4.34.4
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@rollup/[email protected]([email protected].0):
+  /@rollup/[email protected]([email protected].4):
     resolution: {integrity: sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==}
     engines: {node: '>=16.0.0 || 14 >= 14.17'}
     peerDependencies:
@@ -821,17 +830,17 @@ packages:
       rollup:
         optional: true
     dependencies:
-      '@rollup/pluginutils': 5.1.4([email protected].0)
+      '@rollup/pluginutils': 5.1.4([email protected].4)
       commondir: 1.0.1
       estree-walker: 2.0.2
       fdir: 6.4.3([email protected])
       is-reference: 1.2.1
       magic-string: 0.30.17
       picomatch: 4.0.2
-      rollup: 4.34.0
+      rollup: 4.34.4
     dev: true
 
-  /@rollup/[email protected]([email protected].0):
+  /@rollup/[email protected]([email protected].4):
     resolution: {integrity: sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
@@ -840,15 +849,15 @@ packages:
       rollup:
         optional: true
     dependencies:
-      '@rollup/pluginutils': 5.1.4([email protected].0)
+      '@rollup/pluginutils': 5.1.4([email protected].4)
       '@types/resolve': 1.20.2
       deepmerge: 4.3.1
       is-module: 1.0.0
       resolve: 1.22.10
-      rollup: 4.34.0
+      rollup: 4.34.4
     dev: true
 
-  /@rollup/[email protected]([email protected].0):
+  /@rollup/[email protected]([email protected].4):
     resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
@@ -857,12 +866,12 @@ packages:
       rollup:
         optional: true
     dependencies:
-      '@rollup/pluginutils': 5.1.4([email protected].0)
+      '@rollup/pluginutils': 5.1.4([email protected].4)
       magic-string: 0.30.17
-      rollup: 4.34.0
+      rollup: 4.34.4
     dev: true
 
-  /@rollup/[email protected]([email protected].0):
+  /@rollup/[email protected]([email protected].4):
     resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
@@ -874,155 +883,155 @@ packages:
       '@types/estree': 1.0.6
       estree-walker: 2.0.2
       picomatch: 4.0.2
-      rollup: 4.34.0
+      rollup: 4.34.4
     dev: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-Eeao7ewDq79jVEsrtWIj5RNqB8p2knlm9fhR6uJ2gqP7UfbLrTrxevudVrEPDM7Wkpn/HpRC2QfazH7MXLz3vQ==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-gGi5adZWvjtJU7Axs//CWaQbQd/vGy8KGcnEaCWiyCqxWYDxwIlAHFuSe6Guoxtd0SRvSfVTDMPd5H+4KE2kKA==}
     cpu: [arm]
     os: [android]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-yVh0Kf1f0Fq4tWNf6mWcbQBCLDpDrDEl88lzPgKhrgTcDrTtlmun92ywEF9dCjmYO3EFiSuJeeo9cYRxl2FswA==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-1aRlh1gqtF7vNPMnlf1vJKk72Yshw5zknR/ZAVh7zycRAGF2XBMVDAHmFQz/Zws5k++nux3LOq/Ejj1WrDR6xg==}
     cpu: [arm64]
     os: [android]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-gCs0ErAZ9s0Osejpc3qahTsqIPUDjSKIyxK/0BGKvL+Tn0n3Kwvj8BrCv7Y5sR1Ypz1K2qz9Ny0VvkVyoXBVUQ==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-drHl+4qhFj+PV/jrQ78p9ch6A0MfNVZScl/nBps5a7u01aGf/GuBRrHnRegA9bP222CBDfjYbFdjkIJ/FurvSQ==}
     cpu: [arm64]
     os: [darwin]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-aIB5Anc8hngk15t3GUkiO4pv42ykXHfmpXGS+CzM9CTyiWyT8HIS5ygRAy7KcFb/wiw4Br+vh1byqcHRTfq2tQ==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-hQqq/8QALU6t1+fbNmm6dwYsa0PDD4L5r3TpHx9dNl+aSEMnIksHZkSO3AVH+hBMvZhpumIGrTFj8XCOGuIXjw==}
     cpu: [x64]
     os: [darwin]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-kpdsUdMlVJMRMaOf/tIvxk8TQdzHhY47imwmASOuMajg/GXpw8GKNd8LNwIHE5Yd1onehNpcUB9jHY6wgw9nHQ==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-/L0LixBmbefkec1JTeAQJP0ETzGjFtNml2gpQXA8rpLo7Md+iXQzo9kwEgzyat5Q+OG/C//2B9Fx52UxsOXbzw==}
     cpu: [arm64]
     os: [freebsd]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-D0RDyHygOBCQiqookcPevrvgEarN0CttBecG4chOeIYCNtlKHmf5oi5kAVpXV7qs0Xh/WO2RnxeicZPtT50V0g==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-6Rk3PLRK+b8L/M6m/x6Mfj60LhAUcLJ34oPaxufA+CfqkUrDoUPQYFdRrhqyOvtOKXLJZJwxlOLbQjNYQcRQfw==}
     cpu: [x64]
     os: [freebsd]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-mCIw8j5LPDXmCOW8mfMZwT6F/Kza03EnSr4wGYEswrEfjTfVsFOxvgYfuRMxTuUF/XmRb9WSMD5GhCWDe2iNrg==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-kmT3x0IPRuXY/tNoABp2nDvI9EvdiS2JZsd4I9yOcLCCViKsP0gB38mVHOhluzx+SSVnM1KNn9k6osyXZhLoCA==}
     cpu: [arm]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-AwwldAu4aCJPob7zmjuDUMvvuatgs8B/QiVB0KwkUarAcPB3W+ToOT+18TQwY4z09Al7G0BvCcmLRop5zBLTag==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-3iSA9tx+4PZcJH/Wnwsvx/BY4qHpit/u2YoZoXugWVfc36/4mRkgGEoRbRV7nzNBSCOgbWMeuQ27IQWgJ7tRzw==}
     cpu: [arm]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-e7kDUGVP+xw05pV65ZKb0zulRploU3gTu6qH1qL58PrULDGxULIS0OSDQJLH7WiFnpd3ZKUU4VM3u/Z7Zw+e7Q==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-7CwSJW+sEhM9sESEk+pEREF2JL0BmyCro8UyTq0Kyh0nu1v0QPNY3yfLPFKChzVoUmaKj8zbdgBxUhBRR+xGxg==}
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-SXYJw3zpwHgaBqTXeAZ31qfW/v50wq4HhNVvKFhRr5MnptRX2Af4KebLWR1wpxGJtLgfS2hEPuALRIY3LPAAcA==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-GZdafB41/4s12j8Ss2izofjeFXRAAM7sHCb+S4JsI9vaONX/zQ8cXd87B9MRU/igGAJkKvmFmJJBeeT9jJ5Cbw==}
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-e5XiCinINCI4RdyU3sFyBH4zzz7LiQRvHqDtRe9Dt8o/8hTBaYpdPimayF00eY2qy5j4PaaWK0azRgUench6WQ==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-uuphLuw1X6ur11675c2twC6YxbzyLSpWggvdawTUamlsoUv81aAXRMPBC1uvQllnBGls0Qt5Siw8reSIBnbdqQ==}
     cpu: [loong64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-3SWN3e0bAsm9ToprLFBSro8nJe6YN+5xmB11N4FfNf92wvLye/+Rh5JGQtKOpwLKt6e61R1RBc9g+luLJsc23A==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-KvLEw1os2gSmD6k6QPCQMm2T9P2GYvsMZMRpMz78QpSoEevHbV/KOUbI/46/JRalhtSAYZBYLAnT9YE4i/l4vg==}
     cpu: [ppc64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-B1Oqt3GLh7qmhvfnc2WQla4NuHlcxAD5LyueUi5WtMc76ZWY+6qDtQYqnxARx9r+7mDGfamD+8kTJO0pKUJeJA==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-wcpCLHGM9yv+3Dql/CI4zrY2mpQ4WFergD3c9cpRowltEh5I84pRT/EuHZsG0In4eBPPYthXnuR++HrFkeqwkA==}
     cpu: [riscv64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-UfUCo0h/uj48Jq2lnhX0AOhZPSTAq3Eostas+XZ+GGk22pI+Op1Y6cxQ1JkUuKYu2iU+mXj1QjPrZm9nNWV9rg==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-nLbfQp2lbJYU8obhRQusXKbuiqm4jSJteLwfjnunDT5ugBKdxqw1X9KWwk8xp1OMC6P5d0WbzxzhWoznuVK6XA==}
     cpu: [s390x]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-chZLTUIPbgcpm+Z7ALmomXW8Zh+wE2icrG+K6nt/HenPLmtwCajhQC5flNSk1Xy5EDMt/QAOz2MhzfOfJOLSiA==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-JGejzEfVzqc/XNiCKZj14eb6s5w8DdWlnQ5tWUbs99kkdvfq9btxxVX97AaxiUX7xJTKFA0LwoS0KU8C2faZRg==}
     cpu: [x64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-jo0UolK70O28BifvEsFD/8r25shFezl0aUk2t0VJzREWHkq19e+pcLu4kX5HiVXNz5qqkD+aAq04Ct8rkxgbyQ==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-/iFIbhzeyZZy49ozAWJ1ZR2KW6ZdYUbQXLT4O5n1cRZRoTpwExnHLjlurDXXPKEGxiAg0ujaR9JDYKljpr2fDg==}
     cpu: [x64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-Vmg0NhAap2S54JojJchiu5An54qa6t/oKT7LmDaWggpIcaiL8WcWHEN6OQrfTdL6mQ2GFyH7j2T5/3YPEDOOGA==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-qORc3UzoD5UUTneiP2Afg5n5Ti1GAW9Gp5vHPxzvAFFA3FBaum9WqGvYXGf+c7beFdOKNos31/41PRMUwh1tpA==}
     cpu: [arm64]
     os: [win32]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-CV2aqhDDOsABKHKhNcs1SZFryffQf8vK2XrxP6lxC99ELZAdvsDgPklIBfd65R8R+qvOm1SmLaZ/Fdq961+m7A==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-5g7E2PHNK2uvoD5bASBD9aelm44nf1w4I5FEI7MPHLWcCSrR8JragXZWgKPXk5i2FU3JFfa6CGZLw2RrGBHs2Q==}
     cpu: [ia32]
     os: [win32]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/[email protected].0:
-    resolution: {integrity: sha512-g2ASy1QwHP88y5KWvblUolJz9rN+i4ZOsYzkEwcNfaNooxNUXG+ON6F5xFo0NIItpHqxcdAyls05VXpBnludGw==}
+  /@rollup/[email protected].4:
+    resolution: {integrity: sha512-p0scwGkR4kZ242xLPBuhSckrJ734frz6v9xZzD+kHVYRAkSUmdSLCIJRfql6H5//aF8Q10K+i7q8DiPfZp0b7A==}
     cpu: [x64]
     os: [win32]
     requiresBuild: true
@@ -1526,6 +1535,20 @@ packages:
     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==}
+    engines: {node: '>=18'}
+    hasBin: true
+    dependencies:
+      chalk: 4.1.2
+      lodash: 4.17.21
+      rxjs: 7.8.1
+      shell-quote: 1.8.2
+      supports-color: 8.1.1
+      tree-kill: 1.2.2
+      yargs: 17.7.2
+    dev: true
+
   /[email protected]:
     resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
     dependencies:
@@ -2281,6 +2304,11 @@ packages:
     resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==}
+    engines: {node: '>= 0.10'}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
     dev: true
@@ -2575,6 +2603,10 @@ packages:
     resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
     dev: true
@@ -2988,6 +3020,12 @@ packages:
       url-polyfill: 1.1.12
     dev: false
 
+  /[email protected]:
+    resolution: {integrity: sha512-stwg4vxys+GISEWbNzWaMgZGY+VielHkx0ssKd2OjgSRSDw6u0B4nP1Xi/Ni+2uoJhsF8Dh9dnku1uI+o7G2oA==}
+    engines: {node: '>=18.12'}
+    hasBin: true
+    dev: true
+
   /[email protected]([email protected]):
     resolution: {integrity: sha512-xMITAI7M0u1yolVcXJ9XTZiO9aO49mcoKQy6pCDFdMh9kGqhzLVpWxeD/32M/QBmkhcGypZFFOLNLmIW4Pg4RA==}
     engines: {node: '>=18'}
@@ -3208,6 +3246,13 @@ packages:
       picomatch: 2.3.1
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
+    engines: {node: '>= 0.10'}
+    dependencies:
+      resolve: 1.22.10
+    dev: true
+
   /[email protected]:
     resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
 
@@ -3270,32 +3315,32 @@ packages:
       glob: 10.4.5
     dev: true
 
-  /[email protected].0:
-    resolution: {integrity: sha512-+4C/cgJ9w6sudisA0nZz0+O7lTP9a3CzNLsoDwaRumM8QHwghUsu6tqHXiTmNUp/rqNiM14++7dkzHDyCRs0Jg==}
+  /[email protected].4:
+    resolution: {integrity: sha512-spF66xoyD7rz3o08sHP7wogp1gZ6itSq22SGa/IZTcUDXDlOyrShwMwkVSB+BUxFRZZCUYqdb3KWDEOMVQZxuw==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
     dependencies:
       '@types/estree': 1.0.6
     optionalDependencies:
-      '@rollup/rollup-android-arm-eabi': 4.34.0
-      '@rollup/rollup-android-arm64': 4.34.0
-      '@rollup/rollup-darwin-arm64': 4.34.0
-      '@rollup/rollup-darwin-x64': 4.34.0
-      '@rollup/rollup-freebsd-arm64': 4.34.0
-      '@rollup/rollup-freebsd-x64': 4.34.0
-      '@rollup/rollup-linux-arm-gnueabihf': 4.34.0
-      '@rollup/rollup-linux-arm-musleabihf': 4.34.0
-      '@rollup/rollup-linux-arm64-gnu': 4.34.0
-      '@rollup/rollup-linux-arm64-musl': 4.34.0
-      '@rollup/rollup-linux-loongarch64-gnu': 4.34.0
-      '@rollup/rollup-linux-powerpc64le-gnu': 4.34.0
-      '@rollup/rollup-linux-riscv64-gnu': 4.34.0
-      '@rollup/rollup-linux-s390x-gnu': 4.34.0
-      '@rollup/rollup-linux-x64-gnu': 4.34.0
-      '@rollup/rollup-linux-x64-musl': 4.34.0
-      '@rollup/rollup-win32-arm64-msvc': 4.34.0
-      '@rollup/rollup-win32-ia32-msvc': 4.34.0
-      '@rollup/rollup-win32-x64-msvc': 4.34.0
+      '@rollup/rollup-android-arm-eabi': 4.34.4
+      '@rollup/rollup-android-arm64': 4.34.4
+      '@rollup/rollup-darwin-arm64': 4.34.4
+      '@rollup/rollup-darwin-x64': 4.34.4
+      '@rollup/rollup-freebsd-arm64': 4.34.4
+      '@rollup/rollup-freebsd-x64': 4.34.4
+      '@rollup/rollup-linux-arm-gnueabihf': 4.34.4
+      '@rollup/rollup-linux-arm-musleabihf': 4.34.4
+      '@rollup/rollup-linux-arm64-gnu': 4.34.4
+      '@rollup/rollup-linux-arm64-musl': 4.34.4
+      '@rollup/rollup-linux-loongarch64-gnu': 4.34.4
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.34.4
+      '@rollup/rollup-linux-riscv64-gnu': 4.34.4
+      '@rollup/rollup-linux-s390x-gnu': 4.34.4
+      '@rollup/rollup-linux-x64-gnu': 4.34.4
+      '@rollup/rollup-linux-x64-musl': 4.34.4
+      '@rollup/rollup-win32-arm64-msvc': 4.34.4
+      '@rollup/rollup-win32-ia32-msvc': 4.34.4
+      '@rollup/rollup-win32-x64-msvc': 4.34.4
       fsevents: 2.3.3
     dev: true
 
@@ -3316,6 +3361,12 @@ packages:
       queue-microtask: 1.2.3
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+    dependencies:
+      tslib: 2.8.1
+    dev: true
+
   /[email protected]:
     resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
     dev: true
@@ -3398,6 +3449,30 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==}
+    engines: {node: '>= 0.4'}
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==}
+    engines: {node: '>=4'}
+    hasBin: true
+    dependencies:
+      glob: 7.2.3
+      interpret: 1.4.0
+      rechoir: 0.6.2
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==}
+    engines: {node: '>=6'}
+    hasBin: true
+    dependencies:
+      minimist: 1.2.8
+      shelljs: 0.8.5
+    dev: true
+
   /[email protected]:
     resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
     engines: {node: '>=14'}
@@ -3579,6 +3654,13 @@ packages:
       has-flag: 4.0.0
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+    engines: {node: '>=10'}
+    dependencies:
+      has-flag: 4.0.0
+    dev: true
+
   /[email protected]:
     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
     engines: {node: '>= 0.4'}
@@ -3589,8 +3671,8 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
-  /[email protected]7.0:
-    resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==}
+  /[email protected]8.1:
+    resolution: {integrity: sha512-GWANVlPM/ZfYzuPHjq0nxT+EbOEDDN3Jwhwdg1D8TU8oSkktp8w64Uq4auuGLxFSoNTRDncTq2hQHX1Ld9KHkA==}
     engines: {node: '>=10'}
     hasBin: true
     dependencies:
@@ -3651,6 +3733,15 @@ packages:
     resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
     dev: true
 
+  /[email protected]:
+    resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
+    hasBin: true
+    dev: true
+
+  /[email protected]:
+    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+    dev: true
+
   /[email protected]:
     resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
     dependencies:

+ 14 - 3
preview/eleventy.config.mjs

@@ -8,7 +8,7 @@ import { sync } from 'glob';
  */
 const getCopyList = () => {
 	let copy = {
-		"node_modules/@tabler/core/dist": "core",
+		"node_modules/@tabler/core/dist": "dist",
 		"pages/favicon.ico": "favicon.ico",
 		"static": "static",
 	}
@@ -50,8 +50,8 @@ export default function (eleventyConfig) {
 	eleventyConfig.setLayoutsDirectory("_layouts");
 	eleventyConfig.setIncludesDirectory("_includes");
 
-	eleventyConfig.addWatchTarget("../core/dist/**");
-	eleventyConfig.setWatchThrottleWaitTime(100);
+	// eleventyConfig.addWatchTarget("../core/dist/**");
+	// eleventyConfig.setWatchThrottleWaitTime(100);
 
 	eleventyConfig.addPassthroughCopy(getCopyList());
 	eleventyConfig.setServerPassthroughCopyBehavior("passthrough");
@@ -66,6 +66,13 @@ export default function (eleventyConfig) {
 		dynamicPartials: true,
 		jekyllWhere: true,
 	});
+	/**
+	 * Server
+	 */
+	if (process.env.ELEVENTY_RUN_MODE === "serve") {
+		eleventyConfig.setServerPassthroughCopyBehavior("passthrough");
+	}
+
 
 	/**
 	 * Data
@@ -422,6 +429,10 @@ export default function (eleventyConfig) {
 		}
 	});
 
+	eleventyConfig.addFilter("contains", (items, item) => {
+		return items && Array.isArray(items) && items.includes(item);
+	});
+
 	eleventyConfig.addFilter("concat_objects", function (object, object2) {
 		if (
 			object &&

+ 13 - 13
preview/package.json

@@ -4,20 +4,20 @@
   "scripts": {
     "build": "pnpm run clean && pnpm run css && pnpm run js && pnpm run html",
     "dev": "pnpm run clean && pnpm run watch",
-    "watch": "pnpm run watch-html & pnpm run watch-css & pnpm run watch-js",
-    "watch-html": "NODE_ENV=development eleventy --serve --port=3000 --incremental",
-    "watch-js": "nodemon --watch js/ --ext js --exec 'pnpm run js'",
-    "watch-css": "nodemon --watch scss/ --ext scss --exec 'pnpm run css'",
+    "watch": "concurrently \"pnpm run watch-html\" \"pnpm run watch-css\" \"pnpm run watch-js\"",
+    "watch-html": "cross-env NODE_ENV=development eleventy --serve --port=3000 --incremental",
+    "watch-js": "nodemon --watch js/ --ext js --exec \"pnpm run js\"",
+    "watch-css": "nodemon --watch scss/ --ext scss --exec \"pnpm run css\"",
     "css": "pnpm run css-compile && pnpm run css-prefix && pnpm run css-minify",
     "css-compile": "sass scss/:dist/preview/css/ --no-source-map --load-path=node_modules",
-    "css-prefix": "postcss --config build/postcss.config.mjs --replace 'dist/preview/css/*.css' '!dist/preview/css/*.rtl*.css' '!dist/preview/css/*.min.css'",
-    "css-minify": "cleancss -O1 --format breakWith=lf --with-rebase --source-map --source-map-inline-sources --output dist/preview/css/ --batch --batch-suffix '.min' 'dist/preview/css/*.css' '!dist/preview/css/*.min.css' '!dist/preview/css/*rtl*.css'",
+    "css-prefix": "postcss --config build/postcss.config.mjs --replace \"dist/preview/css/*.css\" \"!dist/preview/css/*.rtl*.css\" \"!dist/preview/css/*.min.css\"",
+    "css-minify": "cleancss -O1 --format breakWith=lf --with-rebase --source-map --source-map-inline-sources --output dist/preview/css/ --batch --batch-suffix \".min\" \"dist/preview/css/*.css\" \"!dist/preview/css/*.min.css\" \"!dist/preview/css/*rtl*.css\"",
     "js": "pnpm run js-compile && pnpm run js-minify",
     "js-compile": "rollup --config build/rollup.config.mjs --sourcemap",
     "js-minify": "pnpm run js-minify-demo && pnpm run js-minify-theme",
-    "js-minify-demo": "terser --compress passes=2 --mangle --comments '/^!/' --source-map 'content=dist/preview/js/demo.js.map,includeSources,url=demo.min.js.map' --output dist/preview/js/demo.min.js dist/preview/js/demo.js",
-    "js-minify-theme": "terser --compress passes=2 --mangle --comments '/^!/' --source-map 'content=dist/preview/js/demo-theme.js.map,includeSources,url=demo-theme.min.js.map' --output dist/preview/js/demo-theme.min.js dist/preview/js/demo-theme.js", 
-    "clean": "rm -rf dist demo",
+    "js-minify-demo": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/preview/js/demo.js.map,includeSources,url=demo.min.js.map\" --output dist/preview/js/demo.min.js dist/preview/js/demo.js",
+    "js-minify-theme": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/preview/js/demo-theme.js.map,includeSources,url=demo-theme.min.js.map\" --output dist/preview/js/demo-theme.min.js dist/preview/js/demo-theme.js", 
+    "clean": "shx rm -rf dist demo",
     "html": "eleventy",
     "svg-optimize": "svgo -f svg/brand --pretty",
     "unused-files": "node build/unused-files.mjs",
@@ -29,13 +29,13 @@
     "zip": "mkdir -p packages-zip && zip -r packages-zip/tabler-$(node -p \"require('./package.json').version\").zip demo/*"
   },
   "dependencies": {
+    "@tabler/core": "workspace:*",
     "@tabler/icons": "^3.29.0",
-    "@melloware/coloris": "^0.19.1",
+    "@melloware/coloris": "^0.24.0",
     "apexcharts": "^4.4.0",
-    "@tabler/core": "workspace:*",
     "star-rating.js": "^4.3.1",
-    "tinymce": "^7.6.0",
-    "tom-select": "^2.4.1",
+    "tinymce": "^7.6.1",
+    "tom-select": "^2.4.2",
     "typed.js": "^2.1.0",
     "imask": "^7.6.1",
     "jsvectormap": "^1.6.0",

+ 10 - 0
preview/pages/_data/menu.json

@@ -193,6 +193,16 @@
         "url": "placeholder.html",
         "title": "Placeholder"
       },
+      "segmented-control": {
+        "title": "Segmented control",
+        "url": "segmented-control.html",
+        "badge": "New"
+      },
+      "scroll-spy": {
+        "title": "Scroll spy",
+        "url": "scroll-spy.html",
+        "badge": "New"
+      },
       "social": {
         "title": "Social icons",
         "url": "social-icons.html"

+ 4 - 4
preview/pages/_includes/cards/tables/progressbg.html

@@ -10,15 +10,15 @@
 			</tr>
 			</thead>
 			<tbody>
-			{% for page in pages %}
+			{% for url in urls %}
 			<tr>
 				<td>
 					<div class="progressbg">
-						{% include "ui/progress.html" value=page.bounce class="progressbg-progress" color="primary-lt" %}
-						<div class="progressbg-text">{{ page.uri }}</div>
+						{% include "ui/progress.html" value=url.bounce class="progressbg-progress" color="primary-lt" %}
+						<div class="progressbg-text">{{ url.uri }}</div>
 					</div>
 				</td>
-				<td class="w-1 fw-bold text-end">{{ page.visitors }}</td>
+				<td class="w-1 fw-bold text-end">{{ url.visitors }}</td>
 			</tr>
 			{% endfor %}
 			</tbody>

+ 8 - 9
preview/pages/_includes/cards/timeline.html

@@ -58,18 +58,17 @@
 		<div class="card timeline-event-card">
 			<div class="card-body">
 				<div class="text-secondary float-end">3 days ago</div>
-				<h4>+2 New photos</h4>
+				<h4>+3 New photos</h4>
 				<div class="mt-3">
 					<div class="row g-2">
-						<div class="col-6">
-							<div class="media media-2x1 rounded">
-								<a class="media-content" style="background-image: url({% include "ui/photo.html" id=6 %})"></a>
-							</div>
+						<div class="col-4">
+							{% include "ui/photo.html" id=6 class="rounded" %}
 						</div>
-						<div class="col-6">
-							<div class="media media-2x1 rounded">
-								<a class="media-content" style="background-image: url({% include "ui/photo.html" id=7 %})"></a>
-							</div>
+						<div class="col-4">
+							{% include "ui/photo.html" id=7 class="rounded" %}
+						</div>
+						<div class="col-4">
+							{% include "ui/photo.html" id=8 class="rounded" %}
 						</div>
 					</div>
 				</div>

+ 2 - 2
preview/pages/_includes/layout/css.html

@@ -14,10 +14,10 @@
 	{% endfor %}
 {% endif %}
 
-<link href="{{ page | relative }}/core/css/tabler{% if layout-rtl %}.rtl{% endif %}{% if environment != 'development' %}.min{% endif %}.css{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" rel="stylesheet"/>
+<link href="{{ page | relative }}/dist/css/tabler{% if layout-rtl %}.rtl{% endif %}{% if environment != 'development' %}.min{% endif %}.css{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" rel="stylesheet"/>
 
 {% for plugin in site.tablerCssPlugins %}
-	<link href="{{ page | relative }}/core/css/{{ plugin }}{% if layout-rtl %}.rtl{% endif %}{% if environment != 'development' %}.min{% endif %}.css{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" rel="stylesheet"/>
+	<link href="{{ page | relative }}/dist/css/{{ plugin }}{% if layout-rtl %}.rtl{% endif %}{% if environment != 'development' %}.min{% endif %}.css{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" rel="stylesheet"/>
 {% endfor %}
 
 <link href="{{ page | relative }}/preview/css/demo{% if layout-rtl %}.rtl{% endif %}{% if environment != 'development' %}.min{% endif %}.css{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" rel="stylesheet"/>

+ 1 - 1
preview/pages/_includes/layout/headers/profile.html

@@ -7,7 +7,7 @@
 				{% include "ui/avatar.html" person=person rounded=true size="lg" %}
 			</div>
 			<div class="col">
-				<h1 class="fw-bold">{{ person.full_name }}</h1>
+				<h1 class="fw-bold m-0">{{ person.full_name }}</h1>
 				<div class="my-2">Unemployed. Building a $1M solo business while traveling the world. Currently at $400k/yr.
 				</div>
 

+ 1 - 1
preview/pages/_includes/layout/js.html

@@ -16,7 +16,7 @@
 
 <!-- Tabler Core -->
 
-<script src="{{ page | relative }}/core/js/tabler{% if environment != 'development' %}.min{% endif %}.js{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" defer></script>
+<script src="{{ page | relative }}/dist/js/tabler{% if environment != 'development' %}.min{% endif %}.js{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" defer></script>
 <script src="{{ page | relative }}/preview/js/demo{% if environment != 'development' %}.min{% endif %}.js{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" defer></script>
 
 

+ 3 - 3
preview/pages/_includes/layout/page-header.html

@@ -3,7 +3,7 @@
 {% assign actions = page-header-actions | default: layout.page-header-actions %}
 {% assign pretitle = page-header-pretitle | default: layout.page-header-pretitle %}
 {% assign class = page-header-class | default: layout.page-header-class %}
-{% assign icon = page-header-icon | default: layout.page-header-icon %}
+{% assign page-icon = page-header-icon | default: layout.page-header-icon %}
 
 {% if page-header-file %}
 	{% include "layout/headers/{{ page-header-file }}.html" %}
@@ -20,8 +20,8 @@
 				</div>
 				{% endif %}
 				<h2 class="page-title">
-					{% if icon %}
-						{% include "ui/icon.html" icon=icon %}
+					{% if page-icon %}
+						{% include "ui/icon.html" icon=page-icon %}
 					{% endif %}
 					{{ page-header }}
 				</h2>

+ 1 - 1
preview/pages/_includes/ui/icon.html

@@ -23,7 +23,7 @@
 
 {% if site.useIconfont %}
 	<i class="icon ti ti-{{ icon-name }}{% if include.color %} {{ include.color }}{% endif %}{% if include.class %} {{ include.class }}{% endif %}"></i>
-{% else %}
+{% elsif icons[icon-name] %}
 	<!-- Download SVG icon from http://tabler.io/icons/icon/{{ icon-name }} -->
 	{% assign svg-icon = icons[icon-name].svg[icon-type] | default: '' %}
 	{% assign svg-icon = svg-icon | replace: '<path stroke="none" d="M0 0h24v24H0z" fill="none"/>', '' %}

+ 28 - 0
preview/pages/_includes/ui/nav-segmented.html

@@ -0,0 +1,28 @@
+{% assign segmented-items = include.items | default: "" | split: "," %}
+{% assign segmented-icons = include.icons | default: "" | split: "," %}
+{% assign segmented-disabled = include.disabled | default: "" | split: "," %}
+{% assign segmented-hover = include.hover | default: "" %}
+
+{% assign segmented-items-count = segmented-items | size %}
+{% assign segmented-icons-count = segmented-icons | size %}
+{% assign segmented-all-count = segmented-items-count %}
+
+{% if segmented-icons-count > segmented-all-count %}{% assign segmented-all-count = segmented-icons-count %}{% endif %}
+
+<nav class="nav nav-segmented{% if include.vertical %} nav-segmented-vertical{% endif %}{% if include.size %} nav-{{ include.size }}{% endif %}{% if include.full-width %} w-100{% endif %}{% if include.class %} {{ include.class }}{% endif %}" role="tablist">
+	{% for i in (1..segmented-all-count) %}
+		{% assign index = forloop.index | append: "" %}
+		{% assign disabled = segmented-disabled | contains: index %}
+
+		{% if include.name %}<input type="radio" class="nav-link-input" name="segmented" id="segmented-{{include.name }}-{{ index }}" {% if forloop.index == 1 %}checked{% endif %} />{% endif %}
+
+		<{% if include.name %}label for="segmented-{{include.name }}-{{ index }}"{% else %}button{% endif %} class="nav-link{% if forloop.index == 1 %}{% unless include.name %} active{% endunless %}{% endif %}{% if disabled %} disabled{% endif %}{% if segmented-hover == index %} hover{% endif %}" role="tab"{% unless include.name %} data-bs-toggle="tab"{% endunless %} aria-selected="{% if forloop.index == 1 %}true{% else %}false{% endif %}" {% if disabled %} aria-disabled="true"{% endif %}{% if forloop.index == 1 %} aria-current="page"{% endif %}>
+			{% if segmented-icons[forloop.index0] %}
+				{% include "ui/icon.html" icon=segmented-icons[forloop.index0] class="nav-link-icon" %}
+			{% endif %}
+			{% if segmented-items[forloop.index0] %}
+				{{ segmented-items[forloop.index0] }}
+			{% endif %}
+		</{% if include.name %}label{% else %}button{% endif %}>
+	{% endfor %}
+</nav>

+ 8 - 8
preview/pages/_includes/ui/trending.html

@@ -1,15 +1,15 @@
 {% assign value = include.value | default: 25 %}
 {% if value > 0 %}
-   {% assign color = 'green' %}
-   {% assign icon = 'trending-up' %}
+   {% assign trending-color = 'green' %}
+   {% assign trending-icon = 'trending-up' %}
 {% elsif value == 0 %}
-   {% assign color = 'yellow' %}
-   {% assign icon = 'minus' %}
+   {% assign trending-color = 'yellow' %}
+   {% assign trending-icon = 'minus' %}
 {% else %}
-   {% assign color = 'red' %}
-   {% assign icon = 'trending-down' %}
+   {% assign trending-color = 'red' %}
+   {% assign trending-icon = 'trending-down' %}
 {% endif %}
 
-<span class="text-{{ color }} d-inline-flex align-items-center lh-1{% if include.class %} {{ include.class }}{% endif %}">
-   {{ value }}% {% include "ui/icon.html" icon=icon class="ms-1" %}
+<span class="text-{{ trending-color }} d-inline-flex align-items-center lh-1{% if include.class %} {{ include.class }}{% endif %}">
+   {{ value }}% {% include "ui/icon.html" icon=trending-icon class="ms-1" %}
 </span>

+ 1 - 1
preview/pages/chat.html

@@ -1,5 +1,5 @@
 ---
-title: Playground
+title: Chat
 page-header: Chat
 page-menu: extra.chat
 layout: default

+ 0 - 153
preview/pages/playground.html

@@ -1,153 +0,0 @@
----
-layout: default
-permalink: playground.html 
----
-
-<div class="container-xl">
-      <div class="page-header d-print-none mb-4">
-        <div class="row align-items-center">
-          <div class="col">
-            <div class="page-pretitle"></div>
-            <div class="d-flex align-items-center">
-              <img
-                src="https://hebbkx1anhila5yf.public.blob.vercel-storage.com/chips-b5dF2YPuqsOD3mhXWZ7cLs6YW8B5QM.png"
-                alt="Tabler Logo"
-                class="h-8 me-2" 
-              />
-              <h2 class="page-title">tabler</h2>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <div class="row row-deck row-cards">
-        <div class="col-sm-6 col-lg-6">
-          <div class="card">
-            <div class="card-body">
-              <div class="d-flex align-items-center">
-                <div class="subheader">Sales</div>
-                <div class="ms-auto lh-1">
-                  <div class="text-success d-inline-flex align-items-center lh-1">
-                    1%{" "}
-                    <svg
-                      xmlns="http://www.w3.org/2000/svg"
-                      class="icon ms-1"
-                      width="24"
-                      height="24"
-                      viewBox="0 0 24 24"
-                      strokeWidth="2"
-                      stroke="currentColor"
-                      fill="none"
-                      strokeLinecap="round"
-                      strokeLinejoin="round"
-                    >
-                      <path stroke="none" d="M0 0h24v24H0z" fill="none" />
-                      <path d="M3 17l6 -6l4 4l8 -8" />
-                      <path d="M14 7l7 0l0 7" />
-                    </svg>
-                  </div>
-                </div>
-              </div>
-              <div class="d-flex align-items-baseline">
-                <div class="h1 mb-0 me-2">132</div>
-                <div class="me-auto">
-                  <span class="text-muted">12 waiting payments</span>
-                </div>
-              </div>
-            </div>
-          </div>
-        </div>
-        <div class="col-sm-6 col-lg-6">
-          <div class="card">
-            <div class="card-body">
-              <div class="d-flex align-items-center">
-                <div class="subheader">Orders</div>
-                <div class="ms-auto lh-1">
-                  <div class="text-muted d-inline-flex align-items-center lh-1">
-                    0% <span class="ms-1">─</span>
-                  </div>
-                </div>
-              </div>
-              <div class="d-flex align-items-baseline">
-                <div class="h1 mb-0 me-2">78</div>
-                <div class="me-auto">
-                  <span class="text-muted">32 shipped</span>
-                </div>
-              </div>
-            </div> 
-          </div>
-        </div>
-        <div class="col-sm-6 col-lg-6">
-          <div class="card">
-            <div class="card-body">
-              <div class="d-flex align-items-center">
-                <div class="subheader">Shares</div>
-                <div class="ms-auto lh-1">
-                  <div class="text-danger d-inline-flex align-items-center lh-1">
-                    4%{" "}
-                    <svg
-                      xmlns="http://www.w3.org/2000/svg"
-                      class="icon ms-1"
-                      width="24"
-                      height="24"
-                      viewBox="0 0 24 24"
-                      strokeWidth="2"
-                      stroke="currentColor"
-                      fill="none"
-                      strokeLinecap="round"
-                      strokeLinejoin="round"
-                    >
-                      <path stroke="none" d="M0 0h24v24H0z" fill="none" />
-                      <path d="M3 7l6 6l4 -4l8 8" />
-                      <path d="M14 17l7 0l0 -7" />
-                    </svg>
-                  </div>
-                </div>
-              </div>
-              <div class="d-flex align-items-baseline">
-                <div class="h1 mb-0 me-2">623</div>
-                <div class="me-auto">
-                  <span class="text-muted">16 today</span>
-                </div>
-              </div>
-            </div>
-          </div>
-        </div>
-        <div class="col-sm-6 col-lg-6">
-          <div class="card">
-            <div class="card-body">
-              <div class="d-flex align-items-center">
-                <div class="subheader">Likes</div>
-                <div class="ms-auto lh-1">
-                  <div class="text-success d-inline-flex align-items-center lh-1">
-                    8%{" "}
-                    <svg
-                      xmlns="http://www.w3.org/2000/svg"
-                      class="icon ms-1"
-                      width="24"
-                      height="24"
-                      viewBox="0 0 24 24"
-                      strokeWidth="2"
-                      stroke="currentColor"
-                      fill="none"
-                      strokeLinecap="round"
-                      strokeLinejoin="round"
-                    >
-                      <path stroke="none" d="M0 0h24v24H0z" fill="none" />
-                      <path d="M3 17l6 -6l4 4l8 -8" />
-                      <path d="M14 7l7 0l0 7" />
-                    </svg>
-                  </div>
-                </div>
-              </div>
-              <div class="d-flex align-items-baseline">
-                <div class="h1 mb-0 me-2">132</div>
-                <div class="me-auto">
-                  <span class="text-muted">21 today</span>
-                </div>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>

+ 3 - 3
preview/pages/pricing-table.html

@@ -35,7 +35,7 @@ permalink: pricing-table.html
 				</tr>
 				</thead>
 				<tbody>
-				<tr class="bg-light">
+				<tr class="bg-surface-tertiary">
 					 <th colspan="4" class="subheader">Features</th>
 				</tr>
 				<tr>
@@ -56,7 +56,7 @@ permalink: pricing-table.html
 					 <td class="text-center">{% include "ui/icon.html" icon="x" class="text-red" %}</td>
 					 <td class="text-center">{% include "ui/icon.html" icon="check" class="text-green" %}</td>
 				</tr>
-				<tr class="bg-light">
+				<tr class="bg-surface-tertiary">
 					 <th colspan="4" class="subheader">Reporting</th>
 				</tr>
 				<tr>
@@ -71,7 +71,7 @@ permalink: pricing-table.html
 					 <td class="text-center">{% include "ui/icon.html" icon="check" class="text-green" %}</td>
 					 <td class="text-center">{% include "ui/icon.html" icon="check" class="text-green" %}</td>
 				</tr>
-				<tr class="bg-light">
+				<tr class="bg-surface-tertiary">
 					 <th colspan="4" class="subheader">Support</th>
 				</tr>
 				<tr>

+ 49 - 0
preview/pages/scroll-spy.html

@@ -0,0 +1,49 @@
+---
+title: Scroll Spy
+layout: default
+permalink: scroll-spy.html
+page-header: Scroll Spy
+---
+
+{% assign headers = "Home,Profile,Messages,Settings,About,Contact,Services,Team,Work" | split: "," %}
+
+<div class="row g-5">
+	<div class="col-sm-2">
+		<div class="sticky-top">
+			<h3>Menu</h3>
+			<nav class="nav nav-vertical nav-pills" id="pills">
+				{% for header in headers %}
+				<a class="nav-link" href="#pills-{{ header | slugify }}">{{ header }}</a>
+				{% endfor %}
+			</nav>
+		</div>
+	</div>
+	<div class="col-sm" data-bs-spy="scroll" data-bs-target="#pills" data-bs-offset="0">
+		<div class="card card-lg">
+			<div class="card-body">
+				{% for header in headers %}
+				<h3 id="pills-{{ header | slugify }}">{{ header }}</h3>
+				<p class="mb-6">
+					Lorem ipsum dolor sit amet, consectetur adipisicing elit. A accusantium, alias autem beatae blanditiis corporis debitis eligendi, enim error excepturi exercitationem odit porro quasi reiciendis saepe sapiente veritatis? Aliquam
+					assumenda beatae, cumque delectus dolorem enim, eveniet facere fugit harum illum iure magnam nemo neque nisi omnis, pariatur tenetur vel? Accusantium aut cum deleniti dolor doloribus eum, molestiae nulla officiis quasi. At
+					cupiditate dolor explicabo id nesciunt placeat unde voluptates. Asperiores cum doloremque esse fugit labore quia reprehenderit similique. Architecto est ipsum maiores odio perferendis quibusdam tempore velit? Accusantium aliquid
+					consequatur corporis dignissimos distinctio eos eum fugiat impedit nam obcaecati officiis, porro, quia quibusdam repellendus sapiente suscipit temporibus ullam velit vitae voluptates? Aliquam consectetur consequatur consequuntur
+					deleniti dicta dolores ducimus, excepturi ipsam iure molestias necessitatibus numquam optio quaerat quasi quo repudiandae sed. Ad aliquam animi beatae culpa delectus esse excepturi in incidunt ipsam iusto labore laboriosam minima,
+					nam, nemo nisi nobis, nulla praesentium provident quae quaerat qui quia quibusdam quis quisquam quos repellendus sint suscipit tempora vero vitae! Animi assumenda dolorum eaque, explicabo laborum officia praesentium quia
+					repudiandae. Aliquam asperiores cupiditate deserunt nobis nostrum reprehenderit voluptates? Dolorem doloremque ducimus magni, maxime sint tenetur totam. Accusamus atque beatae consequatur corporis, dignissimos dolore dolores
+					dolorum earum error eum eveniet, facere impedit incidunt minima molestias nemo non nostrum placeat quasi qui ratione repudiandae suscipit tenetur ullam vel velit voluptatibus. Accusantium alias assumenda blanditiis consectetur
+					cupiditate delectus dolor dolores dolorum, ducimus eaque enim, error esse eum fugiat fugit id ipsam ipsum laboriosam laudantium minus modi molestias mollitia necessitatibus nihil odio officia praesentium quaerat quis quisquam quos
+					reiciendis tempora tempore ut velit vitae voluptas voluptatem! Accusantium adipisci architecto assumenda atque aut consectetur consequuntur cum, deserunt doloribus ea excepturi exercitationem expedita explicabo facere fuga fugit
+					impedit iste iusto laboriosam molestiae nihil officiis perferendis porro possimus provident quae quaerat qui quibusdam quos reiciendis repellendus vel vero, voluptatem! Ab amet aperiam assumenda aut error eveniet, id inventore
+					laudantium molestias mollitia natus neque nulla officiis, porro quam quas quisquam repellendus repudiandae saepe sapiente ut voluptas, voluptate. Ab ad alias, aliquam atque consequatur culpa deserunt distinctio eius, enim est ex
+					exercitationem facere facilis itaque magni maiores modi nemo neque perferendis placeat quam quas quia quis quod quos reiciendis sequi sunt tempore vero vitae! Earum explicabo nam quaerat quam quos sed voluptatem. Asperiores
+					debitis dolorum, eaque eligendi optio ullam velit? Aperiam beatae cumque earum et explicabo maxime modi molestias odit, omnis placeat quasi quibusdam, ratione sapiente vel voluptas? A, aliquid beatae dolore eaque eos excepturi
+					expedita facere facilis fugit ipsam iure molestiae molestias natus necessitatibus, nesciunt nulla, numquam obcaecati officia officiis pariatur quaerat quas quisquam rerum sapiente veniam. A aperiam beatae distinctio et illum
+					laboriosam necessitatibus obcaecati porro sed vero. Accusantium at aut consequatur corporis culpa cupiditate delectus dolores eius eligendi, enim error esse est, et excepturi fugit id ipsam ipsum itaque modi mollitia
+					necessitatibus neque non nulla obcaecati officia placeat qui quia saepe sit temporibus totam ut voluptas voluptatibus? Ad consectetur eos est illum laboriosam minus molestiae officia placeat quas tenetur.
+				</p>
+				{% endfor %}
+			</div>
+		</div>
+	</div>
+</div>

+ 109 - 0
preview/pages/segmented-control.html

@@ -0,0 +1,109 @@
+---
+layout: default
+title: Segmented control
+permalink: /segmented-control.html
+page-header: Segmented control
+page-menu: base.segmented-control
+---
+
+<div class="row row-cards">
+	<div class="col-md-6">
+		<div class="card">
+			<div class="card-body">
+				{% include "ui/nav-segmented.html" items="1,2,3,4" %}
+			</div>
+		</div>
+	</div>
+	<div class="col-md-6">
+		<div class="card">
+			<div class="card-body">
+				{% include "ui/nav-segmented.html" items="👦,👦🏿,👦🏾,👦🏽,👦🏼,👦🏻" %}
+			</div>
+		</div>
+	</div>
+	<div class="col-md-6">
+		<div class="card">
+			<div class="card-body">
+				{% include "ui/nav-segmented.html" icons="home,star,clock,ghost,bold,italic,underline" %}
+			</div>
+		</div>
+	</div>
+	<div class="col-md-6">
+		<div class="card">
+			<div class="card-body">
+				{% include "ui/nav-segmented.html" items="List,Kanban,Calendar,Files" icons="list,layout,calendar,files" %}
+			</div>
+		</div>
+	</div>
+	<div class="col-md-6">
+		<div class="card">
+			<div class="card-body">
+				{% include "ui/nav-segmented.html" items="List,Kanban,Calendar,Files" icons="list,layout,calendar,files" vertical %}
+			</div>
+		</div>
+	</div>
+	<div class="col-md-6">
+		<div class="card">
+			<div class="card-body">
+				{% include "ui/nav-segmented.html" icons="home,star,clock,ghost,bold,italic,underline" vertical disabled="3" %}
+			</div>
+		</div>
+	</div>
+	<div class="col-md-6">
+		<div class="card">
+			<div class="card-body">
+				{% include "ui/nav-segmented.html" items="Daily,Weekly,Monthly,Quarterly,Yearly" disabled="4,5" %}
+			</div>
+		</div>
+	</div>
+	<div class="col-md-6">
+		<div class="card">
+			<div class="card-body">
+				{% include "ui/nav-segmented.html" items="Daily,Weekly,Monthly,Quarterly,Yearly" vertical=true %}
+			</div>
+		</div>
+	</div>
+	<div class="col-md-6">
+		<div class="card">
+			<div class="card-body">
+				{% include "ui/nav-segmented.html" items="Daily,Weekly,Monthly,Quarterly,Yearly" name="checkbox" %}
+			</div>
+		</div>
+	</div>
+	<div class="col-md-6">
+		<div class="card">
+			<div class="card-body">
+				{% include "ui/nav-segmented.html" items="Daily,Weekly,Monthly,Quarterly,Yearly" full-width=true %}
+			</div>
+		</div>
+	</div>
+	<div class="col-md-6">
+		<div class="card">
+			<div class="card-body">
+				<div class="space-y">
+					<div>{% include "ui/nav-segmented.html" items="Overview,Analytics,Reports,Notifications" full-width=true %}</div>
+					<div>{% include "ui/nav-segmented.html" items="Account,Password" full-width=true %}</div>
+				</div>
+			</div>
+		</div>
+	</div>
+	<div class="col-md-6">
+		<div class="card">
+			<div class="card-body">
+				<div class="space-y">
+					<div>{% include "ui/nav-segmented.html" items="List,Kanban,Calendar,Files" disabled="3,5" size="sm" %}</div>
+					<div>{% include "ui/nav-segmented.html" items="List,Kanban,Calendar,Files" disabled="3,5" %}</div>
+					<div>{% include "ui/nav-segmented.html" items="List,Kanban,Calendar,Files" disabled="3,5" size="lg" %}</div>
+
+					<div>{% include "ui/nav-segmented.html" items="List,Kanban,Calendar,Files" icons="list,layout,calendar,files" disabled="3,5" size="sm" %}</div>
+					<div>{% include "ui/nav-segmented.html" items="List,Kanban,Calendar,Files" icons="list,layout,calendar,files" disabled="3,5" %}</div>
+					<div>{% include "ui/nav-segmented.html" items="List,Kanban,Calendar,Files" icons="list,layout,calendar,files" disabled="3,5" size="lg" %}</div>
+					
+					<div>{% include "ui/nav-segmented.html" icons="list,layout,calendar,files" disabled="3,5" size="sm" %}</div>
+					<div>{% include "ui/nav-segmented.html" icons="list,layout,calendar,files" disabled="3,5" %}</div>
+					<div>{% include "ui/nav-segmented.html" icons="list,layout,calendar,files" disabled="3,5" size="lg" %}</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>