_utilities.test.scss 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. $prefix: bs-;
  2. $enable-important-utilities: false;
  3. // Important: Do not import rfs to check that the mixin just calls the appropriate functions from it
  4. @import "../../mixins/utilities";
  5. @mixin test-generate-utility($params...) {
  6. @include assert() {
  7. @include output() {
  8. @include generate-utility($params...);
  9. }
  10. @include expect() {
  11. @content;
  12. }
  13. }
  14. }
  15. @include describe(generate-utility) {
  16. @include it("generates a utility class for each value") {
  17. @include test-generate-utility(
  18. (
  19. property: "padding",
  20. values: (small: .5rem, large: 2rem)
  21. )
  22. ) {
  23. .padding-small {
  24. padding: .5rem;
  25. }
  26. .padding-large {
  27. padding: 2rem;
  28. }
  29. }
  30. }
  31. @include describe("global $enable-important-utilities: true") {
  32. @include it("sets !important") {
  33. $enable-important-utilities: true !global;
  34. @include test-generate-utility(
  35. (
  36. property: "padding",
  37. values: (small: .5rem, large: 2rem)
  38. )
  39. ) {
  40. .padding-small {
  41. padding: .5rem !important;
  42. }
  43. .padding-large {
  44. padding: 2rem !important;
  45. }
  46. }
  47. $enable-important-utilities: false !global;
  48. }
  49. }
  50. @include describe("$utility") {
  51. @include describe("values") {
  52. @include it("supports null keys") {
  53. @include test-generate-utility(
  54. (
  55. property: "padding",
  56. values: (null: 1rem, small: .5rem, large: 2rem)
  57. ),
  58. ) {
  59. .padding {
  60. padding: 1rem;
  61. }
  62. .padding-small {
  63. padding: .5rem;
  64. }
  65. .padding-large {
  66. padding: 2rem;
  67. }
  68. }
  69. }
  70. @include it("ignores null values") {
  71. @include test-generate-utility(
  72. (
  73. property: "padding",
  74. values: (small: null, large: 2rem)
  75. )
  76. ) {
  77. .padding-large {
  78. padding: 2rem;
  79. }
  80. }
  81. }
  82. @include it("supports lists") {
  83. @include test-generate-utility(
  84. (
  85. property: "padding",
  86. values: 1rem 2rem
  87. )
  88. ) {
  89. .padding-1rem {
  90. padding: 1rem;
  91. }
  92. .padding-2rem {
  93. padding: 2rem;
  94. }
  95. }
  96. }
  97. @include it("supports single values") {
  98. @include test-generate-utility(
  99. (
  100. property: padding,
  101. values: 1rem
  102. )
  103. ) {
  104. .padding-1rem {
  105. padding: 1rem;
  106. }
  107. }
  108. }
  109. }
  110. @include describe("class & property") {
  111. @include it("adds each property to the declaration") {
  112. @include test-generate-utility(
  113. (
  114. class: padding-x,
  115. property: padding-inline-start padding-inline-end,
  116. values: 1rem
  117. )
  118. ) {
  119. .padding-x-1rem {
  120. padding-inline-start: 1rem;
  121. padding-inline-end: 1rem;
  122. }
  123. }
  124. }
  125. @include it("uses the first property as class name") {
  126. @include test-generate-utility(
  127. (
  128. property: padding-inline-start padding-inline-end,
  129. values: 1rem
  130. )
  131. ) {
  132. .padding-inline-start-1rem {
  133. padding-inline-start: 1rem;
  134. padding-inline-end: 1rem;
  135. }
  136. }
  137. }
  138. @include it("supports a null class to create classes straight from the values") {
  139. @include test-generate-utility(
  140. (
  141. property: visibility,
  142. class: null,
  143. values: (
  144. visible: visible,
  145. invisible: hidden,
  146. )
  147. )
  148. ) {
  149. .visible {
  150. visibility: visible;
  151. }
  152. .invisible {
  153. visibility: hidden;
  154. }
  155. }
  156. }
  157. }
  158. @include describe("state") {
  159. @include it("Generates selectors for each states") {
  160. @include test-generate-utility(
  161. (
  162. property: padding,
  163. values: 1rem,
  164. state: hover focus,
  165. )
  166. ) {
  167. .padding-1rem {
  168. padding: 1rem;
  169. }
  170. .padding-1rem-hover:hover {
  171. padding: 1rem;
  172. }
  173. .padding-1rem-focus:focus {
  174. padding: 1rem;
  175. }
  176. }
  177. }
  178. }
  179. @include describe("css-var"){
  180. @include it("sets a CSS variable instead of the property") {
  181. @include test-generate-utility(
  182. (
  183. property: padding,
  184. css-variable-name: padding,
  185. css-var: true,
  186. values: 1rem 2rem
  187. )
  188. ) {
  189. .padding-1rem {
  190. --bs-padding: 1rem;
  191. }
  192. .padding-2rem {
  193. --bs-padding: 2rem;
  194. }
  195. }
  196. }
  197. @include it("defaults to class") {
  198. @include test-generate-utility(
  199. (
  200. property: padding,
  201. class: padding,
  202. css-var: true,
  203. values: 1rem 2rem
  204. )
  205. ) {
  206. .padding-1rem {
  207. --bs-padding: 1rem;
  208. }
  209. .padding-2rem {
  210. --bs-padding: 2rem;
  211. }
  212. }
  213. }
  214. }
  215. @include describe("local-vars") {
  216. @include it("generates the listed variables") {
  217. @include test-generate-utility(
  218. (
  219. property: color,
  220. class: desaturated-color,
  221. local-vars: (
  222. color-opacity: 1,
  223. color-saturation: .25
  224. ),
  225. values: (
  226. blue: hsla(192deg, var(--bs-color-saturation), 0, var(--bs-color-opacity))
  227. )
  228. )
  229. ) {
  230. .desaturated-color-blue {
  231. --bs-color-opacity: 1;
  232. // Sass compilation will put a leading zero so we want to keep that one
  233. // stylelint-disable-next-line @stylistic/number-leading-zero
  234. --bs-color-saturation: 0.25;
  235. color: hsla(192deg, var(--bs-color-saturation), 0, var(--bs-color-opacity));
  236. }
  237. }
  238. }
  239. }
  240. @include describe("css-var & state") {
  241. @include it("Generates a rule with for each state with a CSS variable") {
  242. @include test-generate-utility(
  243. (
  244. property: padding,
  245. css-var: true,
  246. css-variable-name: padding,
  247. values: 1rem,
  248. state: hover focus,
  249. )
  250. ) {
  251. .padding-1rem {
  252. --bs-padding: 1rem;
  253. }
  254. .padding-1rem-hover:hover {
  255. --bs-padding: 1rem;
  256. }
  257. .padding-1rem-focus:focus {
  258. --bs-padding: 1rem;
  259. }
  260. }
  261. }
  262. }
  263. @include describe("rtl") {
  264. @include it("sets up RTLCSS for removal when false") {
  265. @include test-generate-utility(
  266. (
  267. property: padding,
  268. values: 1rem,
  269. rtl: false
  270. )
  271. ) {
  272. /* rtl:begin:remove */
  273. .padding-1rem {
  274. padding: 1rem;
  275. }
  276. /* rtl:end:remove */
  277. }
  278. }
  279. }
  280. @include describe("rfs") {
  281. @include it("sets the fluid value when not inside media query") {
  282. @include test-generate-utility(
  283. (
  284. property: padding,
  285. values: 1rem,
  286. rfs: true
  287. )
  288. ) {
  289. .padding-1rem {
  290. padding: rfs-fluid-value(1rem);
  291. }
  292. }
  293. }
  294. @include it("sets the value when inside the media query") {
  295. @include test-generate-utility(
  296. (
  297. property: padding,
  298. values: 1rem,
  299. rfs: true
  300. ),
  301. $is-rfs-media-query: true
  302. ) {
  303. .padding-1rem {
  304. padding: rfs-value(1rem);
  305. }
  306. }
  307. }
  308. }
  309. }
  310. @include describe("$infix") {
  311. @include it("inserts the given infix") {
  312. @include test-generate-utility(
  313. (
  314. property: "padding",
  315. values: (null: 1rem, small: .5rem, large: 2rem)
  316. ),
  317. $infix: -sm
  318. ) {
  319. .padding-sm {
  320. padding: 1rem;
  321. }
  322. .padding-sm-small {
  323. padding: .5rem;
  324. }
  325. .padding-sm-large {
  326. padding: 2rem;
  327. }
  328. }
  329. }
  330. @include it("strips leading - if class is null") {
  331. @include test-generate-utility(
  332. (
  333. property: visibility,
  334. class: null,
  335. values: (
  336. visible: visible,
  337. invisible: hidden,
  338. )
  339. ),
  340. -sm
  341. ) {
  342. .sm-visible {
  343. visibility: visible;
  344. }
  345. .sm-invisible {
  346. visibility: hidden;
  347. }
  348. }
  349. }
  350. }
  351. }