--- /dev/null
+#!/usr/bin/env node
+
+/*!
+ * Script to detect unused SCSS @use statements.
+ *
+ * Copyright 2017-2026 The Bootstrap Authors
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */
+
+import { readFileSync, readdirSync, existsSync } from 'node:fs'
+import path from 'node:path'
+
+const DISABLE_FILE = 'check-unused-imports-disable'
+const DISABLE_NEXT_LINE = 'check-unused-imports-disable-next-line'
+const DISABLE_LINE = 'check-unused-imports-disable-line'
+
+function findScssFiles(dirs) {
+ const files = []
+ for (const dir of dirs) {
+ const resolvedDir = path.resolve(dir)
+ if (!existsSync(resolvedDir)) {
+ throw new Error(`Directory does not exist: ${dir}`)
+ }
+
+ walk(resolvedDir, files)
+ }
+
+ return files.sort()
+}
+
+function walk(dir, results) {
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
+ const full = path.join(dir, entry.name)
+ if (entry.isDirectory()) {
+ walk(full, results)
+ } else if (entry.name.endsWith('.scss')) {
+ results.push(full)
+ }
+ }
+}
+
+function parseUseStatements(content) {
+ const lines = content.split('\n')
+ const uses = []
+
+ for (const line of lines) {
+ const trimmed = line.trim()
+ if (trimmed === '' || trimmed.startsWith('//')) {
+ if (trimmed.includes(DISABLE_FILE)) {
+ return []
+ }
+
+ continue
+ }
+
+ break
+ }
+
+ for (let i = 0; i < lines.length; i++) {
+ const trimmed = lines[i].trim()
+ if (!trimmed.startsWith('@use ')) {
+ continue
+ }
+
+ // Suppression comments
+ if (trimmed.includes(DISABLE_LINE)) {
+ continue
+ }
+
+ if (i > 0 && lines[i - 1].trim().includes(DISABLE_NEXT_LINE)) {
+ continue
+ }
+
+ if (/\bwith\s*\(/.test(trimmed)) {
+ continue
+ }
+
+ const match = trimmed.match(/^@use\s+["']([^"']+)["'](?:\s+as\s+(\*|[\w-]+))?/)
+ if (!match) {
+ continue
+ }
+
+ const modulePath = match[1]
+ const asClause = match[2]
+
+ let namespace
+ let isGlob = false
+
+ if (asClause === '*') {
+ isGlob = true
+ namespace = '*'
+ } else if (asClause) {
+ namespace = asClause
+ } else {
+ namespace = modulePath.split('/').at(-1).replace(/^_/, '')
+ }
+
+ uses.push({
+ line: i + 1,
+ modulePath,
+ namespace,
+ isGlob,
+ isBuiltin: modulePath.startsWith('sass:')
+ })
+ }
+
+ return uses
+}
+
+function resolveModule(modulePath, fromFile) {
+ if (modulePath.startsWith('sass:')) {
+ return null
+ }
+
+ const fromDir = path.dirname(fromFile)
+ const target = path.resolve(fromDir, modulePath)
+ const dir = path.dirname(target)
+ const base = path.basename(target)
+
+ const candidates = [
+ path.join(dir, `_${base}.scss`),
+ `${target}.scss`,
+ path.join(target, '_index.scss'),
+ path.join(target, 'index.scss')
+ ]
+
+ for (const c of candidates) {
+ if (existsSync(c)) {
+ return c
+ }
+ }
+
+ return null
+}
+
+const exportCache = new Map()
+
+function getModuleExports(filePath) {
+ if (!filePath || !existsSync(filePath)) {
+ return { variables: new Set(), mixins: new Set(), functions: new Set() }
+ }
+
+ const real = path.resolve(filePath)
+ if (exportCache.has(real)) {
+ return exportCache.get(real)
+ }
+
+ const exports = { variables: new Set(), mixins: new Set(), functions: new Set() }
+ exportCache.set(real, exports)
+
+ const content = readFileSync(real, 'utf8')
+ const lines = content.split('\n')
+
+ for (const line of lines) {
+ const v = line.match(/^\$([a-zA-Z][\w-]*)\s*:/)
+ if (v) {
+ exports.variables.add(v[1])
+ }
+
+ const m = line.match(/^@mixin\s+([a-zA-Z][\w-]*)/)
+ if (m) {
+ exports.mixins.add(m[1])
+ }
+
+ const f = line.match(/^@function\s+([a-zA-Z][\w-]*)/)
+ if (f) {
+ exports.functions.add(f[1])
+ }
+ }
+
+ for (const line of lines) {
+ const fwd = line.trim().match(/^@forward\s+["']([^"']+)["']/)
+ if (fwd) {
+ const resolved = resolveModule(fwd[1], real)
+ if (resolved) {
+ const fwdExports = getModuleExports(resolved)
+ for (const variable of fwdExports.variables) {
+ exports.variables.add(variable)
+ }
+
+ for (const mixin of fwdExports.mixins) {
+ exports.mixins.add(mixin)
+ }
+
+ for (const fn of fwdExports.functions) {
+ exports.functions.add(fn)
+ }
+ }
+ }
+ }
+
+ return exports
+}
+
+function escapeRegExp(s) {
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
+}
+
+function isNamespaceUsed(namespace, body) {
+ return new RegExp(`(?<![\\w-])${escapeRegExp(namespace)}\\.`).test(body)
+}
+
+function isGlobImportUsed(moduleExports, body) {
+ for (const name of moduleExports.variables) {
+ if (new RegExp(`\\$${escapeRegExp(name)}(?![\\w-])`).test(body)) {
+ return true
+ }
+ }
+
+ for (const name of moduleExports.mixins) {
+ if (new RegExp(`@include\\s+${escapeRegExp(name)}(?![\\w-])`).test(body)) {
+ return true
+ }
+ }
+
+ for (const name of moduleExports.functions) {
+ if (new RegExp(`(?<![\\w-])${escapeRegExp(name)}\\s*\\(`).test(body)) {
+ return true
+ }
+ }
+
+ return false
+}
+
+function getBody(content) {
+ const lines = content.split('\n')
+ const filtered = []
+ let inBlockComment = false
+
+ for (const line of lines) {
+ const trimmed = line.trim()
+ if (!inBlockComment && trimmed.startsWith('@use ')) {
+ continue
+ }
+
+ if (!inBlockComment && trimmed.startsWith('@forward ')) {
+ continue
+ }
+
+ let current = line
+ if (inBlockComment) {
+ const end = current.indexOf('*/')
+ if (end === -1) {
+ continue
+ }
+
+ current = current.slice(end + 2)
+ inBlockComment = false
+ }
+
+ for (;;) {
+ const start = current.indexOf('/*')
+ if (start === -1) {
+ break
+ }
+
+ const end = current.indexOf('*/', start + 2)
+ if (end === -1) {
+ current = current.slice(0, start)
+ inBlockComment = true
+ break
+ }
+
+ current = `${current.slice(0, start)}${current.slice(end + 2)}`
+ }
+
+ const singleCommentStart = current.indexOf('//')
+ if (singleCommentStart !== -1) {
+ current = current.slice(0, singleCommentStart)
+ }
+
+ filtered.push(current)
+ }
+
+ return filtered.join('\n')
+}
+
+function isUseUnused(use, body, file) {
+ if (use.isBuiltin) {
+ const name = use.modulePath.split(':')[1]
+ return !isNamespaceUsed(name, body)
+ }
+
+ if (!use.isGlob) {
+ return !isNamespaceUsed(use.namespace, body)
+ }
+
+ const resolved = resolveModule(use.modulePath, file)
+ if (!resolved) {
+ return false
+ }
+
+ const moduleExports = getModuleExports(resolved)
+ const hasExports =
+ moduleExports.variables.size > 0 ||
+ moduleExports.mixins.size > 0 ||
+ moduleExports.functions.size > 0
+
+ if (!hasExports) {
+ return false
+ }
+
+ return !isGlobImportUsed(moduleExports, body)
+}
+
+function main() {
+ const args = process.argv.slice(2)
+ if (args.length === 0) {
+ console.error('Usage: node check-unused-imports.mjs <dir1> [dir2] ...')
+ process.exit(2)
+ }
+
+ let files
+ try {
+ files = findScssFiles(args)
+ } catch (error) {
+ console.error(error.message)
+ process.exit(2)
+ }
+
+ let total = 0
+ for (const file of files) {
+ const content = readFileSync(file, 'utf8')
+ const uses = parseUseStatements(content)
+ if (uses.length === 0) {
+ continue
+ }
+
+ const body = getBody(content)
+ for (const use of uses) {
+ if (isUseUnused(use, body, file)) {
+ const rel = path.relative(process.cwd(), file)
+ console.log(`${rel}:${use.line}\tUnused @use "${use.modulePath}"`)
+ total++
+ }
+ }
+ }
+
+ if (total > 0) {
+ console.log(`\nFound ${total} unused @use statement${total === 1 ? '' : 's'}`)
+ process.exit(1)
+ }
+}
+
+main()
"css-docs": "node build/generate-utilities-json.mjs",
"css-lint": "npm-run-all --aggregate-output --continue-on-error --parallel css-lint-*",
"css-lint-stylelint": "stylelint \"**/*.{css,scss}\" --cache --cache-location .cache/.stylelintcache",
+ "css-lint-imports": "node build/check-unused-imports.mjs scss/ site/src/scss/",
"css-lint-vars": "fusv scss/ site/src/scss/",
"css-minify": "npm-run-all --aggregate-output --parallel css-minify-*",
"css-minify-main": "node build/css-minify.mjs",
-@use "sass:map";
-@use "config" as *;
-@use "variables" as *;
@use "functions" as *;
@use "mixins/border-radius" as *;
@use "mixins/transition" as *;
-@use "sass:map";
@use "config" as *;
@use "functions" as *;
-@use "theme" as *;
@use "variables" as *;
@use "mixins/border-radius" as *;
@use "mixins/tokens" as *;
@use "sass:map";
@use "functions" as *;
-@use "variables" as *;
-@use "theme" as *;
@use "mixins/border-radius" as *;
@use "mixins/transition" as *;
@use "mixins/tokens" as *;
-@use "sass:map";
-@use "colors" as *;
@use "functions" as *;
-@use "variables" as *;
-@use "theme" as *;
@use "mixins/border-radius" as *;
@use "mixins/gradients" as *;
@use "mixins/tokens" as *;
-@use "sass:map";
-@use "sass:string";
-@use "config" as *;
-@use "variables" as *;
@use "functions" as *;
@use "mixins/border-radius" as *;
@use "mixins/transition" as *;
-@use "sass:map";
@use "config" as *;
@use "functions" as *;
@use "variables" as *;
@include border-bottom-radius(var(--card-inner-border-radius));
}
-
.card-row {
flex-direction: row;
-@use "sass:map";
@use "config" as *;
@use "colors" as *;
@use "functions" as *;
-@use "variables" as *;
@use "mixins/transition" as *;
-@use "mixins/gradients" as *;
@use "mixins/color-mode" as *;
@use "mixins/tokens" as *;
transform: translateX(-100%);
}
-
//
// Alternate transitions
//
}
}
-
//
// Left/right controls for nav
//
}
}
-
// Optional captions
//
//
-@use "sass:map";
-@use "colors" as *;
@use "functions" as *;
-@use "variables" as *;
-@use "theme" as *;
@use "mixins/border-radius" as *;
@use "mixins/focus-ring" as *;
@use "mixins/tokens" as *;
-@use "config" as *;
-
// stylelint-disable hue-degree-notation, @stylistic/number-leading-zero
// Easily convert colors to oklch() with https://oklch.com/
// stylelint-disable selector-max-attribute, property-disallowed-list, selector-no-qualifying-type -- VCP uses extensive data attributes and requires direct border-radius properties for range selection
-@use "sass:map";
-@use "config" as *;
-@use "colors" as *;
@use "functions" as *;
@use "variables" as *;
@use "mixins/border-radius" as *;
}
}
-
[data-vc="content"] {
display: flex;
flex-grow: 1;
background-color: var(--datepicker-day-today-bg);
}
-
// Outside month
[data-vc-date-month="next"] [data-vc-date-btn],
[data-vc-date-month="prev"] [data-vc-date-btn] {
-@use "sass:map";
@use "config" as *;
-@use "colors" as *;
@use "functions" as *;
@use "variables" as *;
@use "mixins/border-radius" as *;
@use "mixins/box-shadow" as *;
@use "mixins/gradients" as *;
@use "mixins/tokens" as *;
-@use "mixins/transition" as *;
$dropdown-tokens: () !default;
@use "sass:map";
-@use "colors" as *;
-@use "theme" as *;
@use "config" as *;
@use "functions" as *;
@use "variables" as *;
}
}
-
// Flush list items
//
// Remove borders and border-radius to keep list group items edge-to-edge. Most
-@use "sass:map";
-@use "config" as *;
@use "functions" as *;
@use "variables" as *;
@use "mixins/border-radius" as *;
}
}
-
//
// Pills
//
}
}
-
//
// Underline
//
}
}
-
//
// Justified variants
//
}
}
-
// Tabbable tabs
//
// Hide tabbable panes to start, show them when `.active`
@use "sass:map";
@use "config" as *;
-@use "colors" as *;
@use "functions" as *;
@use "variables" as *;
@use "layout/breakpoints" as *;
}
}
-
// Navbar brand
//
// Used for brand, project, or site names.
}
}
-
// Navbar nav
//
// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).
// }
}
-
// Navbar text
//
//
}
}
-
// Responsive navbar
//
// Custom styles for responsive collapsing and toggling of navbar contents.
-@use "sass:map";
-@use "config" as *;
@use "functions" as *;
-@use "variables" as *;
@use "mixins/lists" as *;
@use "mixins/border-radius" as *;
@use "mixins/focus-ring" as *;
}
}
-
//
// Sizing
//
-@use "sass:map";
@use "colors" as *;
-@use "config" as *;
@use "functions" as *;
-@use "variables" as *;
@use "mixins/tokens" as *;
$placeholder-tokens: () !default;
-@use "sass:map";
@use "config" as *;
@use "functions" as *;
@use "variables" as *;
-@use "sass:map";
@use "config" as *;
-@use "colors" as *;
@use "functions" as *;
-@use "variables" as *;
@use "mixins/transition" as *;
@use "mixins/gradients" as *;
@use "mixins/border-radius" as *;
);
// scss-docs-end progress-tokens
-
// Disable animation if transitions are disabled
@layer components {
-@use "sass:meta";
@use "sass:map";
@use "colors" as *;
-@use "config" as *;
@use "functions" as *;
@use "variables" as *;
@use "theme" as *;
// @use "maps" as *;
-@use "mixins/color-mode" as *;
@use "mixins/tokens" as *;
@use "forms/form-variables" as *;
-@use "sass:map";
@use "config" as *;
@use "functions" as *;
-@use "variables" as *;
@use "mixins/tokens" as *;
// stylelint-disable custom-property-no-missing-var-function
@use "sass:map";
@use "config" as *;
@use "functions" as *;
-@use "variables" as *;
@use "layout/breakpoints" as *;
@use "mixins/border-radius" as *;
-@use "mixins/box-shadow" as *;
-@use "mixins/gradients" as *;
@use "mixins/tokens" as *;
-@use "mixins/transition" as *;
$stepper-tokens: () !default;
text-align: center;
text-decoration: none;
-
// The counter
&::before {
position: relative;
@use "sass:meta";
@use "sass:map";
-@use "config" as *;
-@use "colors" as *;
@function theme-color-values($key) {
$result: ();
-@use "sass:map";
@use "config" as *;
@use "functions" as *;
@use "variables" as *;
-@use "sass:map";
@use "config" as *;
@use "functions" as *;
@use "variables" as *;
@use "mixins/border-radius" as *;
-@use "mixins/deprecate" as *;
@use "mixins/reset-text" as *;
@use "mixins/tokens" as *;
-
$tooltip-tokens: () !default;
// scss-docs-start tooltip-tokens
-@use "config" as *;
@use "variables" as *;
@use "mixins/transition" as *;
@use "sass:map";
@use "config" as *;
-@use "colors" as *;
@use "variables" as *;
@use "functions" as *;
@use "theme" as *;
-@use "sass:color";
-@use "sass:map";
-@use "sass:string";
@use "colors" as *;
@use "config" as *;
@use "functions" as *;
$paragraph-margin-bottom: 1rem !default;
-
// Components
//
// Define common padding and border radius sizes and more.
$file: "Grid"
);
-@use "sass:map";
-@use "colors" as *;
@use "config" as *;
-@use "variables" as *;
@use "functions" as *;
// @use "maps" as *;
)
);
+// check-unused-imports-disable-next-line — side-effect import: generates utility CSS.
@use "utilities/api";
-@use "../config" as *;
-@use "../variables" as *;
@use "../mixins/border-radius" as *;
-@use "../mixins/box-shadow" as *;
@layer components {
// Make the div behave like a button
-@use "sass:color";
@use "sass:list";
@use "sass:map";
@use "sass:meta";
@use "sass:string";
-@use "../colors" as *;
@use "../config" as *;
-@use "../theme" as *;
-@use "../variables" as *;
@use "../functions" as *;
@use "../mixins/border-radius" as *;
@use "../mixins/box-shadow" as *;
@use "../mixins/focus-ring" as *;
-@use "../mixins/gradients" as *;
@use "../mixins/tokens" as *;
@use "../mixins/transition" as *;
// scss-docs-end btn-variants
// stylelint-enable custom-property-no-missing-var-function, scss/dollar-variable-default
-
//
// Base styles
//
}
}
-
// Main button style generator mixin
// Generate button variant classes (e.g., .btn-solid, .btn-outline, etc.)
// scss-docs-start btn-variant-mixin
}
}
-
&:hover {
@each $property, $value in map.get($button-variants, $variant, "hover") {
@if $value == "transparent" {
// No need for an active state here
}
-
//
// Button Sizes
//
-@use "sass:map";
-@use "../config" as *;
-@use "../colors" as *;
-@use "../variables" as *;
@use "../functions" as *;
@use "../mixins/border-radius" as *;
-@use "../mixins/color-mode" as *;
@use "../mixins/focus-ring" as *;
@use "../mixins/tokens" as *;
-@use "sass:map";
-@use "../config" as *;
@use "../functions" as *;
-@use "../variables" as *;
@use "../mixins/image" as *;
@use "../mixins/border-radius" as *;
@use "../mixins/box-shadow" as *;
-@use "sass:map";
-@use "../config" as *;
@use "../functions" as *;
@use "../mixins/tokens" as *;
@use "../mixins/transition" as *;
-@use "sass:map";
@use "../colors" as *;
@use "../config" as *;
@use "../functions" as *;
//
// Normalize is licensed MIT. https://github.com/necolas/normalize.css
-
// Document
//
// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.
box-sizing: border-box;
}
-
// Root
//
// Ability to the value of the root font sizes, affecting the value of `rem`.
}
}
-
// Body
//
// 1. Remove the margin in all browsers.
border-block-start: var(--border-width) solid var(--hr-border-color);
}
-
// Typography
//
// 1. Remove top margins from headings
font-size: $h6-font-size;
}
-
// Reset margins on paragraphs
//
// Similarly, the top margin on `<p>`s get reset. However, we also reset the
margin-bottom: $paragraph-margin-bottom;
}
-
// Abbreviations
//
// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.
text-decoration-skip-ink: none; // 3
}
-
// Address
address {
line-height: inherit;
}
-
// Lists
ol,
margin-bottom: .5rem;
}
-
// Blockquote
blockquote {
}
}
-
// Strong
//
// Add the correct font weight in Chrome, Edge, and Safari
font-weight: $font-weight-bolder;
}
-
// Small
//
// Add the correct font size in all browsers
font-size: var(--small-font-size, var(--font-size-sm));
}
-
// Mark
mark,
background-color: var(--mark-bg);
}
-
// Sub and Sup
//
// Prevent `sub` and `sup` elements from affecting the line height in
sub { bottom: -.25em; }
sup { top: -.5em; }
-
// Links
a {
}
}
-
// Code
pre,
}
}
-
// Figures
//
// Apply a consistent margin strategy (matches our type styles).
margin: 0 0 1rem;
}
-
// Images and content
img,
vertical-align: middle;
}
-
// Tables
//
// Prevent double borders
border-width: 0;
}
-
// Forms
//
// 1. Allow labels to use `margin` for spacing.
padding: 0;
}
-
// 1. Inherit font family and line height for file input buttons
// 2. Correct the inability to style clickable types in iOS and Safari.
cursor: pointer;
}
-
// Progress
//
// Add the correct vertical alignment in Chrome, Firefox, and Opera.
vertical-align: baseline;
}
-
// Hidden attribute
//
// Always hide an element with the `hidden` HTML attribute.
-@use "sass:color";
@use "sass:map";
@use "../config" as *;
-@use "../colors" as *;
-@use "../theme" as *;
@use "../variables" as *;
@use "../functions" as *;
@use "../layout/breakpoints" as *;
caption-side: top;
}
-
//
// Condensed table w/ half padding
//
}
}
-
// Border versions
//
// Add or remove borders all around the table and between all the columns.
-@use "sass:map";
-@use "../config" as *;
@use "../functions" as *;
-@use "../variables" as *;
@use "../mixins/lists" as *;
@use "../mixins/tokens" as *;
}
}
-
//
// Misc
//
-@use "../config" as *;
-@use "../colors" as *;
-@use "../variables" as *;
@use "../functions" as *;
-@use "sass:map";
-@use "../mixins/border-radius" as *;
-@use "../mixins/color-mode" as *;
@use "../mixins/focus-ring" as *;
@use "../mixins/tokens" as *;
-@use "../mixins/transition" as *;
-@use "form-variables" as *;
// stylelint-disable custom-property-no-missing-var-function
$check-tokens: () !default;
-@use "sass:map";
-@use "../config" as *;
-@use "../variables" as *;
@use "../functions" as *;
-@use "../theme" as *;
@use "../mixins/border-radius" as *;
-@use "../mixins/box-shadow" as *;
@use "../mixins/focus-ring" as *;
@use "../mixins/tokens" as *;
-@use "../mixins/transition" as *;
-@use "form-variables" as *;
$chip-input-tokens: () !default;
-@use "sass:map";
-@use "sass:math";
-@use "../config" as *;
-@use "../colors" as *;
-@use "../variables" as *;
@use "../functions" as *;
@use "../mixins/border-radius" as *;
@use "../mixins/tokens" as *;
@use "../mixins/transition" as *;
-@use "form-variables" as *;
$form-floating-tokens: () !default;
-@use "sass:map";
-@use "../config" as *;
-@use "../variables" as *;
@use "../functions" as *;
-@use "../mixins/border-radius" as *;
-@use "../mixins/box-shadow" as *;
@use "../mixins/focus-ring" as *;
@use "../mixins/tokens" as *;
-@use "../mixins/transition" as *;
-@use "form-variables" as *;
$form-adorn-tokens: () !default;
-@use "sass:map";
-@use "sass:math";
-@use "../config" as *;
-@use "../variables" as *;
@use "../functions" as *;
@use "../mixins/border-radius" as *;
@use "../mixins/box-shadow" as *;
-@use "../mixins/color-mode" as *;
@use "../mixins/focus-ring" as *;
@use "../mixins/gradients" as *;
@use "../mixins/tokens" as *;
@use "../mixins/transition" as *;
-@use "form-variables" as *;
$form-control-tokens: () !default;
-@use "../config" as *;
@use "../colors" as *;
-@use "../variables" as *;
@use "../functions" as *;
@use "../mixins/border-radius" as *;
@use "../mixins/box-shadow" as *;
@use "../mixins/transition" as *;
@use "../mixins/gradients" as *;
@use "../mixins/tokens" as *;
-@use "sass:map";
-@use "form-variables" as *;
$range-tokens: () !default;
&:focus {
outline: 0;
-
// Pseudo-elements must be split across multiple rulesets to have an effect.
&::-webkit-slider-thumb {
@include focus-ring(true);
-@use "sass:map";
-@use "../config" as *;
@use "../functions" as *;
@use "../mixins/tokens" as *;
-@use "../config" as *;
-@use "../colors" as *;
-@use "../variables" as *;
-
// scss-docs-start form-feedback-variables
$form-feedback-margin-top: .5rem !default;
$form-feedback-font-size: var(--font-size-xs) !default;
@use "sass:map";
@use "sass:string";
-@use "../config" as *;
-@use "../colors" as *;
-@use "../variables" as *;
@use "../functions" as *;
@use "../mixins/border-radius" as *;
@use "../mixins/tokens" as *;
}
}
-
// Textual addons
//
// Serves as a catch-all element for any text or radio/checkbox input you wish
@include border-radius(var(--btn-input-border-radius));
}
-
// Sizing
//
// Remix the default form control sizing classes into new ones for easier
-@use "sass:map";
-@use "../variables" as *;
@use "../functions" as *;
-@use "form-variables" as *;
$form-label-tokens: () !default;
-@use "../config" as *;
-@use "../variables" as *;
@use "../functions" as *;
-@use "sass:map";
-@use "form-variables" as *;
@use "../mixins/border-radius" as *;
@use "../mixins/tokens" as *;
-@use "../config" as *;
-@use "../colors" as *;
-@use "../variables" as *;
@use "../functions" as *;
-@use "sass:map";
-@use "../mixins/border-radius" as *;
-@use "../mixins/color-mode" as *;
@use "../mixins/focus-ring" as *;
@use "../mixins/tokens" as *;
-@use "../mixins/transition" as *;
-@use "form-variables" as *;
// stylelint-disable custom-property-no-missing-var-function
$radio-tokens: () !default;
@use "sass:list";
-@use "sass:map";
-@use "../config" as *;
-@use "../variables" as *;
@use "../functions" as *;
@use "../mixins/border-radius" as *;
@use "../mixins/tokens" as *;
@use "../mixins/transition" as *;
-@use "form-variables" as *;
// stylelint-disable custom-property-no-missing-var-function
$strength-tokens: () !default;
-@use "../config" as *;
@use "../colors" as *;
-@use "../variables" as *;
@use "../functions" as *;
-@use "sass:map";
-@use "../mixins/border-radius" as *;
-@use "../mixins/box-shadow" as *;
-@use "../mixins/color-mode" as *;
@use "../mixins/focus-ring" as *;
@use "../mixins/tokens" as *;
-@use "../mixins/transition" as *;
-@use "form-variables" as *;
// stylelint-disable custom-property-no-missing-var-function
$switch-tokens: () !default;
@use "../variables" as *;
@use "../functions" as *;
@use "../mixins/border-radius" as *;
-@use "../mixins/box-shadow" as *;
@use "../mixins/focus-ring" as *;
@use "form-variables" as *;
@use "../tooltip" as *; // bring in tooltip variables
-@use "../config" as *;
-
@layer helpers {
.focus-ring:focus-visible {
outline: var(--focus-ring);
-@use "../config" as *;
@use "../variables" as *;
@use "../mixins/transition" as *;
-@use "../variables" as *;
-
@layer helpers {
.vr {
display: inline-block;
-@use "sass:map";
@use "../config" as *;
@use "../mixins/grid" as *;
-@use "breakpoints" as *;
// mdo-do
// - check gap utilities as replacement for gutter classes from v5
@use "sass:math";
@use "sass:meta";
@use "../config" as *;
-@use "../variables" as *;
// stylelint-disable property-disallowed-list
// Single side border-radius
@use "../config" as *;
-@use "../variables" as *;
// scss-docs-start caret-variables
$caret-width: .3em !default;
-@use "../config" as *;
-@use "../variables" as *;
-
@mixin focus-ring($offset: false, $color: null) {
@if $color != null {
outline: var(--focus-ring-width) solid #{$color};
-@use "../variables" as *;
-
@mixin reset-text {
font-family: var(--body-font-family);
// We deliberately do NOT reset font-size or overflow-wrap / word-wrap.
@use "sass:list";
@use "sass:map";
@use "sass:meta";
-@use "sass:string";
-@use "../config" as *;
// stylelint-disable scss/dollar-variable-pattern
+// check-unused-imports-disable — test infrastructure imports.
@use "../../functions" as *;
@use "../../variables" as *;
@use "../../mixins" as *;
+// check-unused-imports-disable — test infrastructure imports.
$color-mode-type: media-query;
$true-terminal-output: false;
+// check-unused-imports-disable — test infrastructure imports.
@use "../../variables" as *;
@use "../../functions" as *;
@use "../../mixins/utilities" as *;
+// check-unused-imports-disable — test infrastructure imports.
@use "../../functions";
@use "../../variables";
@use "../../maps";
@use "sass:map";
@use "sass:meta";
@use "../config" as *;
-@use "../variables" as *;
@use "../layout/breakpoints" as *;
@use "../mixins/utilities" as *;
@use "../utilities" as *;
}
}
-
// Print utilities
@media print {
@each $key, $utility in $utilities {
-@use "../../../scss/layout/breakpoints" as *;
@use "../../../scss/mixins/border-radius" as *;
// stylelint-disable declaration-no-important, selector-max-id
-@use "../../../scss/config" as *;
-@use "../../../scss/variables" as *;
@use "../../../scss/mixins/transition" as *;
@layer custom {
-@use "../../../scss/config" as *;
@use "../../../scss/colors" as *;
@use "../../../scss/layout/breakpoints" as *;
@use "variables" as *;
}
}
-
//
// Color swatches
//
-@use "../../../scss/config" as *;
-@use "../../../scss/colors" as *;
@use "../../../scss/mixins/border-radius" as *;
@use "variables" as *;
@use "../../../scss/variables" as *;
@use "../../../scss/layout/breakpoints" as *;
@use "../../../scss/mixins/border-radius" as *;
-@use "../../../scss/mixins/box-shadow" as *;
@use "variables" as *;
//
}
}
-
.bd-example-offcanvas {
.offcanvas {
position: static;
-@use "sass:color";
-@use "../../../scss/colors" as *;
-@use "../../../scss/config" as *;
-@use "../../../scss/variables" as *;
@use "../../../scss/layout/breakpoints" as *;
//
-@use "../../../scss/config" as *;
-@use "../../../scss/colors" as *;
@use "../../../scss/mixins/border-radius" as *;
@use "../../../scss/mixins/transition" as *;
@use "sass:math";
-@use "../../../scss/config" as *;
-@use "../../../scss/colors" as *;
-@use "../../../scss/variables" as *;
@use "../../../scss/layout/breakpoints" as *;
@use "../../../scss/mixins/border-radius" as *;
@use "../../../scss/mixins/transition" as *;
-@use "../../../scss/mixins/color-mode" as *;
@layer custom {
.bd-masthead {
@use "../../../scss/config" as *;
@use "../../../scss/colors" as *;
-@use "../../../scss/functions" as *;
@use "../../../scss/mixins" as *;
@use "../../../scss/variables" as *;
@use "../../../scss/layout/breakpoints" as *;
-@use "variables" as *;
-@use "../../../scss/colors" as *;
@use "../../../scss/layout/breakpoints" as *;
@use "../../../scss/mixins/color-mode" as *;
@use "../../../scss/mixins/border-radius" as *;
-@use "../../../scss/mixins/focus-ring" as *;
// stylelint-disable selector-class-pattern
-@use "../../../scss/variables" as *;
@use "../../../scss/layout/breakpoints" as *;
-@use "../../../scss/mixins/border-radius" as *;
-@use "../../../scss/mixins/focus-ring" as *;
@layer custom {
.bd-sidebar {
-@use "sass:color";
-@use "../../../scss/config" as *;
-@use "../../../scss/colors" as *;
-@use "../../../scss/variables" as *;
@use "../../../scss/mixins/border-radius" as *;
-@use "../../../scss/mixins/color-mode" as *;
@use "../../../scss/mixins/transition" as *;
// Shell prompt colors for light mode
@use "sass:color";
-@use "../../../scss/config" as *;
-@use "../../../scss/colors" as *;
-@use "../../../scss/functions" as *;
-@use "../../../scss/mixins/color-mode" as *;
// Local docs variables
$bd-purple: #4c0bce;
+// check-unused-imports-disable — all @use statements load component CSS (side-effect imports).
+
/* Bootstrap Docs (https://getbootstrap.com/)
* Copyright 2011-2026 The Bootstrap Authors
* Licensed under the Creative Commons Attribution 3.0 Unported License.
+// check-unused-imports-disable — side-effect CSS imports.
+
/*!
* Bootstrap Docs (https://getbootstrap.com/)
* Copyright 2024-2026 The Bootstrap Authors