| $prefix: bs-; |
| $enable-important-utilities: false; |
| |
| // Important: Do not import rfs to check that the mixin just calls the appropriate functions from it |
| @import "../../mixins/utilities"; |
| |
| @mixin test-generate-utility($params...) { |
| @include assert() { |
| @include output() { |
| @include generate-utility($params...); |
| } |
| |
| @include expect() { |
| @content; |
| } |
| } |
| } |
| |
| @include describe(generate-utility) { |
| @include it("generates a utility class for each value") { |
| @include test-generate-utility( |
| ( |
| property: "padding", |
| values: (small: .5rem, large: 2rem) |
| ) |
| ) { |
| .padding-small { |
| padding: .5rem; |
| } |
| |
| .padding-large { |
| padding: 2rem; |
| } |
| } |
| } |
| |
| @include describe("global $enable-important-utilities: true") { |
| @include it("sets !important") { |
| $enable-important-utilities: true !global; |
| |
| @include test-generate-utility( |
| ( |
| property: "padding", |
| values: (small: .5rem, large: 2rem) |
| ) |
| ) { |
| .padding-small { |
| padding: .5rem !important; |
| } |
| |
| .padding-large { |
| padding: 2rem !important; |
| } |
| } |
| |
| $enable-important-utilities: false !global; |
| } |
| } |
| |
| @include describe("$utility") { |
| @include describe("values") { |
| @include it("supports null keys") { |
| @include test-generate-utility( |
| ( |
| property: "padding", |
| values: (null: 1rem, small: .5rem, large: 2rem) |
| ), |
| ) { |
| .padding { |
| padding: 1rem; |
| } |
| |
| .padding-small { |
| padding: .5rem; |
| } |
| |
| .padding-large { |
| padding: 2rem; |
| } |
| } |
| } |
| |
| @include it("ignores null values") { |
| @include test-generate-utility( |
| ( |
| property: "padding", |
| values: (small: null, large: 2rem) |
| ) |
| ) { |
| .padding-large { |
| padding: 2rem; |
| } |
| } |
| } |
| |
| @include it("supports lists") { |
| @include test-generate-utility( |
| ( |
| property: "padding", |
| values: 1rem 2rem |
| ) |
| ) { |
| .padding-1rem { |
| padding: 1rem; |
| } |
| |
| .padding-2rem { |
| padding: 2rem; |
| } |
| } |
| } |
| |
| @include it("supports single values") { |
| @include test-generate-utility( |
| ( |
| property: padding, |
| values: 1rem |
| ) |
| ) { |
| .padding-1rem { |
| padding: 1rem; |
| } |
| } |
| } |
| } |
| |
| @include describe("class & property") { |
| @include it("adds each property to the declaration") { |
| @include test-generate-utility( |
| ( |
| class: padding-x, |
| property: padding-inline-start padding-inline-end, |
| values: 1rem |
| ) |
| ) { |
| .padding-x-1rem { |
| padding-inline-start: 1rem; |
| padding-inline-end: 1rem; |
| } |
| } |
| } |
| |
| @include it("uses the first property as class name") { |
| @include test-generate-utility( |
| ( |
| property: padding-inline-start padding-inline-end, |
| values: 1rem |
| ) |
| ) { |
| .padding-inline-start-1rem { |
| padding-inline-start: 1rem; |
| padding-inline-end: 1rem; |
| } |
| } |
| } |
| |
| @include it("supports a null class to create classes straight from the values") { |
| @include test-generate-utility( |
| ( |
| property: visibility, |
| class: null, |
| values: ( |
| visible: visible, |
| invisible: hidden, |
| ) |
| ) |
| ) { |
| .visible { |
| visibility: visible; |
| } |
| |
| .invisible { |
| visibility: hidden; |
| } |
| } |
| } |
| } |
| |
| @include describe("state") { |
| @include it("Generates selectors for each states") { |
| @include test-generate-utility( |
| ( |
| property: padding, |
| values: 1rem, |
| state: hover focus, |
| ) |
| ) { |
| .padding-1rem { |
| padding: 1rem; |
| } |
| |
| .padding-1rem-hover:hover { |
| padding: 1rem; |
| } |
| |
| .padding-1rem-focus:focus { |
| padding: 1rem; |
| } |
| } |
| } |
| } |
| |
| @include describe("css-var"){ |
| @include it("sets a CSS variable instead of the property") { |
| @include test-generate-utility( |
| ( |
| property: padding, |
| css-variable-name: padding, |
| css-var: true, |
| values: 1rem 2rem |
| ) |
| ) { |
| .padding-1rem { |
| --bs-padding: 1rem; |
| } |
| |
| .padding-2rem { |
| --bs-padding: 2rem; |
| } |
| } |
| } |
| |
| @include it("defaults to class") { |
| @include test-generate-utility( |
| ( |
| property: padding, |
| class: padding, |
| css-var: true, |
| values: 1rem 2rem |
| ) |
| ) { |
| .padding-1rem { |
| --bs-padding: 1rem; |
| } |
| |
| .padding-2rem { |
| --bs-padding: 2rem; |
| } |
| } |
| } |
| } |
| |
| @include describe("local-vars") { |
| @include it("generates the listed variables") { |
| @include test-generate-utility( |
| ( |
| property: color, |
| class: desaturated-color, |
| local-vars: ( |
| color-opacity: 1, |
| color-saturation: .25 |
| ), |
| values: ( |
| blue: hsla(192deg, var(--bs-color-saturation), 0, var(--bs-color-opacity)) |
| ) |
| ) |
| ) { |
| .desaturated-color-blue { |
| --bs-color-opacity: 1; |
| // Sass compilation will put a leading zero so we want to keep that one |
| // stylelint-disable-next-line @stylistic/number-leading-zero |
| --bs-color-saturation: 0.25; |
| color: hsla(192deg, var(--bs-color-saturation), 0, var(--bs-color-opacity)); |
| } |
| } |
| } |
| } |
| |
| @include describe("css-var & state") { |
| @include it("Generates a rule with for each state with a CSS variable") { |
| @include test-generate-utility( |
| ( |
| property: padding, |
| css-var: true, |
| css-variable-name: padding, |
| values: 1rem, |
| state: hover focus, |
| ) |
| ) { |
| .padding-1rem { |
| --bs-padding: 1rem; |
| } |
| |
| .padding-1rem-hover:hover { |
| --bs-padding: 1rem; |
| } |
| |
| .padding-1rem-focus:focus { |
| --bs-padding: 1rem; |
| } |
| } |
| } |
| } |
| |
| @include describe("rtl") { |
| @include it("sets up RTLCSS for removal when false") { |
| @include test-generate-utility( |
| ( |
| property: padding, |
| values: 1rem, |
| rtl: false |
| ) |
| ) { |
| /* rtl:begin:remove */ |
| |
| .padding-1rem { |
| padding: 1rem; |
| } |
| |
| /* rtl:end:remove */ |
| |
| } |
| } |
| } |
| |
| @include describe("rfs") { |
| @include it("sets the fluid value when not inside media query") { |
| @include test-generate-utility( |
| ( |
| property: padding, |
| values: 1rem, |
| rfs: true |
| ) |
| ) { |
| .padding-1rem { |
| padding: rfs-fluid-value(1rem); |
| } |
| } |
| } |
| |
| @include it("sets the value when inside the media query") { |
| @include test-generate-utility( |
| ( |
| property: padding, |
| values: 1rem, |
| rfs: true |
| ), |
| $is-rfs-media-query: true |
| ) { |
| .padding-1rem { |
| padding: rfs-value(1rem); |
| } |
| } |
| } |
| } |
| } |
| |
| @include describe("$infix") { |
| @include it("inserts the given infix") { |
| @include test-generate-utility( |
| ( |
| property: "padding", |
| values: (null: 1rem, small: .5rem, large: 2rem) |
| ), |
| $infix: -sm |
| ) { |
| .padding-sm { |
| padding: 1rem; |
| } |
| |
| .padding-sm-small { |
| padding: .5rem; |
| } |
| |
| .padding-sm-large { |
| padding: 2rem; |
| } |
| } |
| } |
| |
| @include it("strips leading - if class is null") { |
| @include test-generate-utility( |
| ( |
| property: visibility, |
| class: null, |
| values: ( |
| visible: visible, |
| invisible: hidden, |
| ) |
| ), |
| -sm |
| ) { |
| .sm-visible { |
| visibility: visible; |
| } |
| |
| .sm-invisible { |
| visibility: hidden; |
| } |
| } |
| } |
| } |
| } |