From 100a37b38e719801a0b46f408e58df5eb64ed8a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Kuna?= <1282324+codecalm@users.noreply.github.com> Date: Sun, 15 Feb 2026 14:47:40 +0100 Subject: [PATCH] Add background pattern utilities and patterns demo page (#2615) --- .changeset/background-pattern-utilities.md | 7 + core/package.json | 8 +- core/scss/_core.scss | 1 + core/scss/ui/_patterns.scss | 240 ++++++++++++++++++ .../ui/utilities/background-patterns.md | 159 ++++++++++++ preview/pages/patterns.html | 58 +++++ shared/data/menu.json | 5 + shared/includes/docs/example.html | 4 +- shared/layouts/docs/default.html | 16 +- 9 files changed, 489 insertions(+), 9 deletions(-) create mode 100644 .changeset/background-pattern-utilities.md create mode 100644 core/scss/ui/_patterns.scss create mode 100644 docs/content/ui/utilities/background-patterns.md create mode 100644 preview/pages/patterns.html diff --git a/.changeset/background-pattern-utilities.md b/.changeset/background-pattern-utilities.md new file mode 100644 index 000000000..a6467691d --- /dev/null +++ b/.changeset/background-pattern-utilities.md @@ -0,0 +1,7 @@ +--- +"@tabler/core": minor +"@tabler/preview": minor +"@tabler/docs": patch +--- + +Added background pattern utilities and documentation, including updated preview demos. diff --git a/core/package.json b/core/package.json index ff4d4825f..6f4ffd680 100644 --- a/core/package.json +++ b/core/package.json @@ -82,19 +82,19 @@ "files": [ { "path": "./dist/css/tabler.css", - "maxSize": "75 kB" + "maxSize": "76 kB" }, { "path": "./dist/css/tabler.min.css", - "maxSize": "70 kB" + "maxSize": "71 kB" }, { "path": "./dist/css/tabler.rtl.css", - "maxSize": "75 kB" + "maxSize": "76 kB" }, { "path": "./dist/css/tabler.rtl.min.css", - "maxSize": "70 kB" + "maxSize": "71 kB" }, { "path": "./dist/css/tabler-flags.css", diff --git a/core/scss/_core.scss b/core/scss/_core.scss index c83ee038f..9f8712c39 100644 --- a/core/scss/_core.scss +++ b/core/scss/_core.scss @@ -67,6 +67,7 @@ @import 'ui/offcanvas'; @import 'ui/chat'; @import 'ui/signature'; +@import 'ui/patterns'; @import 'helpers/index'; diff --git a/core/scss/ui/_patterns.scss b/core/scss/ui/_patterns.scss new file mode 100644 index 000000000..601801535 --- /dev/null +++ b/core/scss/ui/_patterns.scss @@ -0,0 +1,240 @@ +.bg-pattern-diagonal { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-size: .5rem; + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + background-image: repeating-linear-gradient(-45deg, var(--#{$prefix}pattern-fill) 0 1px, transparent 0 50%); + background-clip: padding-box; + background-size: var(--#{$prefix}pattern-size) var(--#{$prefix}pattern-size); + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-diagonal-2 { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-size: .5rem; + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + background-image: repeating-linear-gradient(45deg, var(--#{$prefix}pattern-fill) 0 1px, transparent 0 50%); + background-clip: padding-box; + background-size: var(--#{$prefix}pattern-size) var(--#{$prefix}pattern-size); + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-dots { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-size: 5px; + --#{$prefix}pattern-dot: .5px; + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 20%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + background-image: radial-gradient(circle, var(--#{$prefix}pattern-fill) var(--#{$prefix}pattern-dot), transparent var(--#{$prefix}pattern-dot)), + radial-gradient(circle, var(--#{$prefix}pattern-fill) var(--#{$prefix}pattern-dot), transparent var(--#{$prefix}pattern-dot)); + background-position: 0 0, + calc(var(--#{$prefix}pattern-size) / 2) calc(var(--#{$prefix}pattern-size) / 2); + background-size: var(--#{$prefix}pattern-size) var(--#{$prefix}pattern-size); + background-clip: padding-box; + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-rectangles { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 3%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + --#{$prefix}pattern-size: .5rem; + background-image: repeating-linear-gradient(45deg, var(--#{$prefix}pattern-fill) 25%, transparent 25%, transparent 75%, var(--#{$prefix}pattern-fill) 75%, var(--#{$prefix}pattern-fill)), + repeating-linear-gradient(45deg, var(--#{$prefix}pattern-fill) 25%, transparent 25%, transparent 75%, var(--#{$prefix}pattern-fill) 75%, var(--#{$prefix}pattern-fill)); + background-position: -1px -1px, + calc(var(--#{$prefix}pattern-size) - 1px) calc(var(--#{$prefix}pattern-size) - 1px); + background-size: calc(var(--#{$prefix}pattern-size) * 2) calc(var(--#{$prefix}pattern-size) * 2); + background-clip: padding-box; + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-lines { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 6%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + --#{$prefix}pattern-size: .5rem; + background-size: var(--#{$prefix}pattern-size) var(--#{$prefix}pattern-size); + background-image: repeating-linear-gradient(0deg, var(--#{$prefix}pattern-fill), var(--#{$prefix}pattern-fill) 1px, transparent 1px, transparent); + background-position: -1px -1px; + background-clip: padding-box; + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-lines-vertical { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 6%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + --#{$prefix}pattern-size: .5rem; + background-size: var(--#{$prefix}pattern-size) var(--#{$prefix}pattern-size); + background-image: repeating-linear-gradient(90deg, var(--#{$prefix}pattern-fill), var(--#{$prefix}pattern-fill) 1px, transparent 1px, transparent); + background-position: -1px -1px; + background-clip: padding-box; + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-grid { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 6%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + --#{$prefix}pattern-size: .5rem; + background-image: linear-gradient(to right, var(--#{$prefix}pattern-fill) 1px, transparent 1px), + linear-gradient(to bottom, var(--#{$prefix}pattern-fill) 1px, transparent 1px); + background-size: calc(var(--#{$prefix}pattern-size) * 2) calc(var(--#{$prefix}pattern-size) * 2); + background-position: -1px -1px, -1px -1px; + background-clip: padding-box; + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-grid-diagonal { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + --#{$prefix}pattern-size: .5rem; + background-image: linear-gradient(45deg, transparent 49%, var(--#{$prefix}pattern-fill) 49%, var(--#{$prefix}pattern-fill) 51%, transparent 51%), + linear-gradient(-45deg, transparent 49%, var(--#{$prefix}pattern-fill) 49%, var(--#{$prefix}pattern-fill) 51%, transparent 51%); + background-size: calc(var(--#{$prefix}pattern-size) * 2) calc(var(--#{$prefix}pattern-size) * 2); + background-position: center center; + background-clip: padding-box; + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-blueprint { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-size: .5rem; + --#{$prefix}pattern-line: color-mix(in oklch, var(--#{$prefix}pattern-color) 6%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + background-image: linear-gradient(var(--#{$prefix}pattern-line) 2px, transparent 2px), + linear-gradient(90deg, var(--#{$prefix}pattern-line) 2px, transparent 2px), + linear-gradient(var(--#{$prefix}pattern-line) 1px, transparent 1px), + linear-gradient(90deg, var(--#{$prefix}pattern-line) 1px, transparent 1px); + background-size: calc(var(--#{$prefix}pattern-size) * 10) calc(var(--#{$prefix}pattern-size) * 10), + calc(var(--#{$prefix}pattern-size) * 10) calc(var(--#{$prefix}pattern-size) * 10), + calc(var(--#{$prefix}pattern-size) * 2) calc(var(--#{$prefix}pattern-size) * 2), + calc(var(--#{$prefix}pattern-size) * 2) calc(var(--#{$prefix}pattern-size) * 2); + background-position: -3px -3px, -3px -3px, -2px -2px, -2px -2px; + background-clip: padding-box; + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-cross-dots { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-size: .5rem; + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + background-image: radial-gradient(var(--#{$prefix}pattern-fill) 1px, transparent 1px), + radial-gradient(var(--#{$prefix}pattern-fill) 1px, transparent 1px); + background-size: calc(var(--#{$prefix}pattern-size) * 2) calc(var(--#{$prefix}pattern-size) * 2); + background-position: 0 0, + var(--#{$prefix}pattern-size) var(--#{$prefix}pattern-size); + background-clip: padding-box; + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-circles { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-size: .5rem; + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + background-image: radial-gradient(circle at center top, transparent 9%, var(--#{$prefix}pattern-fill) 10%, var(--#{$prefix}pattern-fill) 15%, transparent 16%), + radial-gradient(circle at center bottom, transparent 9%, var(--#{$prefix}pattern-fill) 10%, var(--#{$prefix}pattern-fill) 15%, transparent 16%), + radial-gradient(circle at right center, transparent 9%, var(--#{$prefix}pattern-fill) 10%, var(--#{$prefix}pattern-fill) 15%, transparent 16%), + radial-gradient(circle at left center, transparent 9%, var(--#{$prefix}pattern-fill) 10%, var(--#{$prefix}pattern-fill) 15%, transparent 16%); + background-position: 0 0; + background-size: calc(var(--#{$prefix}pattern-size) * 3) calc(var(--#{$prefix}pattern-size) * 3); + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-diagonal-stripes { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-size: .5rem; + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 5%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + background-image: repeating-linear-gradient(45deg, + transparent, + transparent var(--#{$prefix}pattern-size), + var(--#{$prefix}pattern-fill) var(--#{$prefix}pattern-size), + var(--#{$prefix}pattern-fill) calc(2 * var(--#{$prefix}pattern-size))); + background-repeat: no-repeat; + background-clip: padding-box; + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-diagonal-stripes-2 { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-size: .5rem; + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 5%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + background-image: repeating-linear-gradient(-45deg, + transparent, + transparent var(--#{$prefix}pattern-size), + var(--#{$prefix}pattern-fill) var(--#{$prefix}pattern-size), + var(--#{$prefix}pattern-fill) calc(2 * var(--#{$prefix}pattern-size))); + background-repeat: no-repeat; + background-clip: padding-box; + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-zigzag { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-size: .5rem; + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 5%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + background: linear-gradient(135deg, var(--#{$prefix}pattern-fill) 25%, transparent 25%) calc(-1 * var(--#{$prefix}pattern-size)) 0, + linear-gradient(225deg, var(--#{$prefix}pattern-fill) 25%, transparent 25%) calc(-1 * var(--#{$prefix}pattern-size)) 0, + linear-gradient(315deg, var(--#{$prefix}pattern-fill) 25%, transparent 25%), + linear-gradient(45deg, var(--#{$prefix}pattern-fill) 25%, transparent 25%); + background-size: calc(2 * var(--#{$prefix}pattern-size)) calc(2 * var(--#{$prefix}pattern-size)); + background-clip: padding-box; + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-vertical-stripes { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-size: .5rem; + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 5%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + background-image: repeating-linear-gradient(90deg, + transparent, + transparent var(--#{$prefix}pattern-size), + var(--#{$prefix}pattern-fill) var(--#{$prefix}pattern-size), + var(--#{$prefix}pattern-fill) calc(2 * var(--#{$prefix}pattern-size))); + background-clip: padding-box; + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +.bg-pattern-horizontal-stripes { + --#{$prefix}pattern-color: var(--#{$prefix}body-color); + --#{$prefix}pattern-size: .5rem; + --#{$prefix}pattern-fill: color-mix(in oklch, var(--#{$prefix}pattern-color) 5%, transparent); + --#{$prefix}pattern-border: color-mix(in oklch, var(--#{$prefix}pattern-color) 10%, transparent); + background-image: repeating-linear-gradient(0deg, + transparent, + transparent var(--#{$prefix}pattern-size), + var(--#{$prefix}pattern-fill) var(--#{$prefix}pattern-size), + var(--#{$prefix}pattern-fill) calc(2 * var(--#{$prefix}pattern-size))); + background-position: -1px -1px; + background-clip: padding-box; + border: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}pattern-border); +} + +// Color variants +@each $color, $value in $theme-colors { + .bg-pattern-#{$color} { + --#{$prefix}pattern-color: #{$value}; + } +} + +// Sizes +$sizes: ( + 'sm': .25rem, + 'md': .5rem, + 'lg': .75rem, + 'xl': 1rem, +); + +@each $size, $value in $sizes { + .bg-pattern-#{$size} { + --#{$prefix}pattern-size: #{$value}; + } +} \ No newline at end of file diff --git a/docs/content/ui/utilities/background-patterns.md b/docs/content/ui/utilities/background-patterns.md new file mode 100644 index 000000000..e71ecae81 --- /dev/null +++ b/docs/content/ui/utilities/background-patterns.md @@ -0,0 +1,159 @@ +--- +title: Background patterns +summary: Use background pattern utilities to add subtle textures to elements. Combine pattern type, color, and size modifiers for different visual effects. +description: Add decorative background patterns with utility classes. +added-in: "1.4.0" +source-css: "ui/_patterns.scss" +--- + +{% assign patterns = "diagonal,diagonal-2,dots,rectangles,lines,lines-vertical,grid,grid-diagonal,blueprint,circles,diagonal-stripes,diagonal-stripes-2,zigzag,vertical-stripes,horizontal-stripes" | split: "," %} + +## Overview + +Background pattern utilities let you apply decorative, repeatable textures to elements like cards, sections, and placeholders. +Start with a pattern type class, then optionally combine it with color and size modifiers. + +```html +
+ + +``` + +## Pattern types + +Use one of the available pattern classes to define the shape and direction of the texture: + +{% for pattern in patterns %} +- `.bg-pattern-{{ pattern }}` +{%- endfor %} + +Here are the available pattern types: + +{% capture html -%} +.bg-pattern-{{ pattern }}
+ .bg-pattern-{{ color[0] }}
+ .bg-pattern-sm
+ .bg-pattern-md
+ .bg-pattern-lg
+ .bg-pattern-xl
+ .{{ pattern }}
+ .bg-pattern-{{ color[0] }}
+ .bg-pattern-{{ size }}
+ {{ summary }}