cm-admin 1.1.9 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/app/assets/javascripts/cm_admin/scaffolds.js +6 -0
  4. data/app/assets/javascripts/cm_admin/shared_scaffolds.js +97 -81
  5. data/app/assets/stylesheets/cm_admin/base/form.scss +31 -225
  6. data/app/assets/stylesheets/cm_admin/base/navbar.scss +1 -1
  7. data/app/assets/stylesheets/cm_admin/base/scaffold.scss +8 -5
  8. data/app/assets/stylesheets/cm_admin/base/show.scss +15 -22
  9. data/app/assets/stylesheets/cm_admin/base/table.scss +6 -0
  10. data/app/assets/stylesheets/cm_admin/components/_buttons.scss +1 -1
  11. data/app/assets/stylesheets/cm_admin/components/_modal.scss +7 -30
  12. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_accordion.scss +158 -0
  13. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_alert.scss +68 -0
  14. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_badge.scss +38 -0
  15. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_breadcrumb.scss +40 -0
  16. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_button-group.scss +142 -0
  17. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_buttons.scss +207 -0
  18. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_card.scss +239 -0
  19. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_carousel.scss +244 -0
  20. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_close.scss +63 -0
  21. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_containers.scss +41 -0
  22. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_dropdown.scss +250 -0
  23. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_forms.scss +9 -0
  24. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_functions.scss +302 -0
  25. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_grid.scss +39 -0
  26. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_helpers.scss +12 -0
  27. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_images.scss +42 -0
  28. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_list-group.scss +197 -0
  29. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_maps.scss +174 -0
  30. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_mixins.scss +42 -0
  31. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_modal.scss +237 -0
  32. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_nav.scss +197 -0
  33. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_navbar.scss +289 -0
  34. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_offcanvas.scss +146 -0
  35. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_pagination.scss +109 -0
  36. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_placeholders.scss +51 -0
  37. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_popover.scss +196 -0
  38. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_progress.scss +68 -0
  39. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_reboot.scss +610 -0
  40. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_root.scss +184 -0
  41. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_spinners.scss +85 -0
  42. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_tables.scss +171 -0
  43. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_toasts.scss +73 -0
  44. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_tooltip.scss +119 -0
  45. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_transitions.scss +27 -0
  46. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_type.scss +106 -0
  47. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_utilities.scss +806 -0
  48. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_variables-dark.scss +85 -0
  49. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_variables.scss +1745 -0
  50. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/bootstrap-grid.scss +62 -0
  51. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/bootstrap-reboot.scss +10 -0
  52. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/bootstrap-utilities.scss +19 -0
  53. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/bootstrap.scss +52 -0
  54. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_floating-labels.scss +95 -0
  55. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-check.scss +188 -0
  56. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-control.scss +214 -0
  57. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-range.scss +91 -0
  58. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-select.scss +80 -0
  59. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-text.scss +11 -0
  60. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_input-group.scss +132 -0
  61. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_labels.scss +36 -0
  62. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_validation.scss +12 -0
  63. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_clearfix.scss +3 -0
  64. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_color-bg.scss +7 -0
  65. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_colored-links.scss +30 -0
  66. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  67. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_icon-link.scss +25 -0
  68. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_position.scss +36 -0
  69. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_ratio.scss +26 -0
  70. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_stacks.scss +15 -0
  71. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  72. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  73. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  74. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_vr.scss +8 -0
  75. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_alert.scss +18 -0
  76. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_backdrop.scss +14 -0
  77. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_banner.scss +7 -0
  78. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_border-radius.scss +78 -0
  79. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  80. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  81. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_buttons.scss +70 -0
  82. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_caret.scss +69 -0
  83. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_clearfix.scss +9 -0
  84. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_color-mode.scss +21 -0
  85. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  86. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_container.scss +11 -0
  87. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_deprecate.scss +10 -0
  88. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_forms.scss +153 -0
  89. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_gradients.scss +47 -0
  90. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_grid.scss +151 -0
  91. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_image.scss +16 -0
  92. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_list-group.scss +26 -0
  93. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_lists.scss +7 -0
  94. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_pagination.scss +10 -0
  95. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_reset-text.scss +17 -0
  96. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_resize.scss +6 -0
  97. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_table-variants.scss +24 -0
  98. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  99. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_transition.scss +26 -0
  100. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_utilities.scss +97 -0
  101. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_visually-hidden.scss +33 -0
  102. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/jasmine.js +16 -0
  103. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
  104. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
  105. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
  106. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/sass-true/register.js +14 -0
  107. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/sass-true/runner.js +17 -0
  108. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
  109. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/utilities/_api.scss +47 -0
  110. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/vendor/_rfs.scss +348 -0
  111. data/app/controllers/cm_admin/resource_controller.rb +22 -5
  112. data/app/helpers/cm_admin/application_helper.rb +4 -4
  113. data/app/views/cm_admin/main/_actions_dropdown.html.slim +2 -2
  114. data/app/views/cm_admin/main/_custom_action_modal_form.html.slim +6 -0
  115. data/app/views/cm_admin/main/_nested_fields.html.slim +36 -17
  116. data/app/views/cm_admin/main/_nested_table_form.html.slim +17 -8
  117. data/app/views/cm_admin/main/_nested_table_section.html.slim +17 -0
  118. data/app/views/cm_admin/main/_show_section.html.slim +10 -0
  119. data/app/views/cm_admin/main/_tabs.html.slim +1 -1
  120. data/app/views/cm_admin/main/_top_navbar.html.slim +9 -3
  121. data/app/views/cm_admin/main/associated_show.html.slim +5 -4
  122. data/app/views/cm_admin/main/edit.html.slim +18 -18
  123. data/app/views/cm_admin/main/history.html.slim +3 -3
  124. data/app/views/cm_admin/main/import_form.html.slim +1 -1
  125. data/app/views/cm_admin/main/new.html.slim +17 -17
  126. data/app/views/cm_admin/main/show.html.slim +10 -10
  127. data/app/views/layouts/_custom_action_modal.html.slim +11 -0
  128. data/app/views/layouts/_custom_action_modals.html.slim +13 -9
  129. data/app/views/layouts/_destroy_action_modal.html.slim +16 -0
  130. data/app/views/layouts/cm_admin.html.slim +5 -5
  131. data/config/routes.rb +1 -3
  132. data/lib/cm_admin/model.rb +1 -0
  133. data/lib/cm_admin/models/custom_action.rb +6 -0
  134. data/lib/cm_admin/models/dsl_method.rb +9 -4
  135. data/lib/cm_admin/models/field.rb +2 -1
  136. data/lib/cm_admin/models/form_field.rb +2 -1
  137. data/lib/cm_admin/models/row.rb +40 -0
  138. data/lib/cm_admin/models/section.rb +20 -3
  139. data/lib/cm_admin/version.rb +1 -1
  140. data/lib/cm_admin/view_helpers/field_display_helper.rb +3 -3
  141. data/lib/cm_admin/view_helpers/form_field_helper.rb +40 -14
  142. data/lib/cm_admin/view_helpers/form_helper.rb +59 -22
  143. data/lib/cm_admin/view_helpers/page_info_helper.rb +4 -4
  144. data/lib/cm_admin/view_helpers.rb +1 -1
  145. metadata +107 -2
@@ -0,0 +1,393 @@
1
+ $prefix: bs-;
2
+ $enable-important-utilities: false;
3
+
4
+ // Important: Do not import rfs to check that the mixin just calls the appropriate functions from it
5
+ @import "../../mixins/utilities";
6
+
7
+ @mixin test-generate-utility($params...) {
8
+ @include assert() {
9
+ @include output() {
10
+ @include generate-utility($params...);
11
+ }
12
+
13
+ @include expect() {
14
+ @content;
15
+ }
16
+ }
17
+ }
18
+
19
+ @include describe(generate-utility) {
20
+ @include it("generates a utility class for each value") {
21
+ @include test-generate-utility(
22
+ (
23
+ property: "padding",
24
+ values: (small: .5rem, large: 2rem)
25
+ )
26
+ ) {
27
+ .padding-small {
28
+ padding: .5rem;
29
+ }
30
+
31
+ .padding-large {
32
+ padding: 2rem;
33
+ }
34
+ }
35
+ }
36
+
37
+ @include describe("global $enable-important-utilities: true") {
38
+ @include it("sets !important") {
39
+ $enable-important-utilities: true !global;
40
+
41
+ @include test-generate-utility(
42
+ (
43
+ property: "padding",
44
+ values: (small: .5rem, large: 2rem)
45
+ )
46
+ ) {
47
+ .padding-small {
48
+ padding: .5rem !important;
49
+ }
50
+
51
+ .padding-large {
52
+ padding: 2rem !important;
53
+ }
54
+ }
55
+
56
+ $enable-important-utilities: false !global;
57
+ }
58
+ }
59
+
60
+ @include describe("$utility") {
61
+ @include describe("values") {
62
+ @include it("supports null keys") {
63
+ @include test-generate-utility(
64
+ (
65
+ property: "padding",
66
+ values: (null: 1rem, small: .5rem, large: 2rem)
67
+ ),
68
+ ) {
69
+ .padding {
70
+ padding: 1rem;
71
+ }
72
+
73
+ .padding-small {
74
+ padding: .5rem;
75
+ }
76
+
77
+ .padding-large {
78
+ padding: 2rem;
79
+ }
80
+ }
81
+ }
82
+
83
+ @include it("ignores null values") {
84
+ @include test-generate-utility(
85
+ (
86
+ property: "padding",
87
+ values: (small: null, large: 2rem)
88
+ )
89
+ ) {
90
+ .padding-large {
91
+ padding: 2rem;
92
+ }
93
+ }
94
+ }
95
+
96
+ @include it("supports lists") {
97
+ @include test-generate-utility(
98
+ (
99
+ property: "padding",
100
+ values: 1rem 2rem
101
+ )
102
+ ) {
103
+ .padding-1rem {
104
+ padding: 1rem;
105
+ }
106
+
107
+ .padding-2rem {
108
+ padding: 2rem;
109
+ }
110
+ }
111
+ }
112
+
113
+ @include it("supports single values") {
114
+ @include test-generate-utility(
115
+ (
116
+ property: padding,
117
+ values: 1rem
118
+ )
119
+ ) {
120
+ .padding-1rem {
121
+ padding: 1rem;
122
+ }
123
+ }
124
+ }
125
+ }
126
+
127
+ @include describe("class & property") {
128
+ @include it("adds each property to the declaration") {
129
+ @include test-generate-utility(
130
+ (
131
+ class: padding-x,
132
+ property: padding-inline-start padding-inline-end,
133
+ values: 1rem
134
+ )
135
+ ) {
136
+ .padding-x-1rem {
137
+ padding-inline-start: 1rem;
138
+ padding-inline-end: 1rem;
139
+ }
140
+ }
141
+ }
142
+
143
+ @include it("uses the first property as class name") {
144
+ @include test-generate-utility(
145
+ (
146
+ property: padding-inline-start padding-inline-end,
147
+ values: 1rem
148
+ )
149
+ ) {
150
+ .padding-inline-start-1rem {
151
+ padding-inline-start: 1rem;
152
+ padding-inline-end: 1rem;
153
+ }
154
+ }
155
+ }
156
+
157
+ @include it("supports a null class to create classes straight from the values") {
158
+ @include test-generate-utility(
159
+ (
160
+ property: visibility,
161
+ class: null,
162
+ values: (
163
+ visible: visible,
164
+ invisible: hidden,
165
+ )
166
+ )
167
+ ) {
168
+ .visible {
169
+ visibility: visible;
170
+ }
171
+
172
+ .invisible {
173
+ visibility: hidden;
174
+ }
175
+ }
176
+ }
177
+ }
178
+
179
+ @include describe("state") {
180
+ @include it("Generates selectors for each states") {
181
+ @include test-generate-utility(
182
+ (
183
+ property: padding,
184
+ values: 1rem,
185
+ state: hover focus,
186
+ )
187
+ ) {
188
+ .padding-1rem {
189
+ padding: 1rem;
190
+ }
191
+
192
+ .padding-1rem-hover:hover {
193
+ padding: 1rem;
194
+ }
195
+
196
+ .padding-1rem-focus:focus {
197
+ padding: 1rem;
198
+ }
199
+ }
200
+ }
201
+ }
202
+
203
+ @include describe("css-var"){
204
+ @include it("sets a CSS variable instead of the property") {
205
+ @include test-generate-utility(
206
+ (
207
+ property: padding,
208
+ css-variable-name: padding,
209
+ css-var: true,
210
+ values: 1rem 2rem
211
+ )
212
+ ) {
213
+ .padding-1rem {
214
+ --bs-padding: 1rem;
215
+ }
216
+
217
+ .padding-2rem {
218
+ --bs-padding: 2rem;
219
+ }
220
+ }
221
+ }
222
+
223
+ @include it("defaults to class") {
224
+ @include test-generate-utility(
225
+ (
226
+ property: padding,
227
+ class: padding,
228
+ css-var: true,
229
+ values: 1rem 2rem
230
+ )
231
+ ) {
232
+ .padding-1rem {
233
+ --bs-padding: 1rem;
234
+ }
235
+
236
+ .padding-2rem {
237
+ --bs-padding: 2rem;
238
+ }
239
+ }
240
+ }
241
+ }
242
+
243
+ @include describe("local-vars") {
244
+ @include it("generates the listed variables") {
245
+ @include test-generate-utility(
246
+ (
247
+ property: color,
248
+ class: desaturated-color,
249
+ local-vars: (
250
+ color-opacity: 1,
251
+ color-saturation: .25
252
+ ),
253
+ values: (
254
+ blue: hsla(192deg, var(--bs-color-saturation), 0, var(--bs-color-opacity))
255
+ )
256
+ )
257
+ ) {
258
+ .desaturated-color-blue {
259
+ --bs-color-opacity: 1;
260
+ // Sass compilation will put a leading zero so we want to keep that one
261
+ // stylelint-disable-next-line stylistic/number-leading-zero
262
+ --bs-color-saturation: 0.25;
263
+ color: hsla(192deg, var(--bs-color-saturation), 0, var(--bs-color-opacity));
264
+ }
265
+ }
266
+ }
267
+ }
268
+
269
+ @include describe("css-var & state") {
270
+ @include it("Generates a rule with for each state with a CSS variable") {
271
+ @include test-generate-utility(
272
+ (
273
+ property: padding,
274
+ css-var: true,
275
+ css-variable-name: padding,
276
+ values: 1rem,
277
+ state: hover focus,
278
+ )
279
+ ) {
280
+ .padding-1rem {
281
+ --bs-padding: 1rem;
282
+ }
283
+
284
+ .padding-1rem-hover:hover {
285
+ --bs-padding: 1rem;
286
+ }
287
+
288
+ .padding-1rem-focus:focus {
289
+ --bs-padding: 1rem;
290
+ }
291
+ }
292
+ }
293
+ }
294
+
295
+ @include describe("rtl") {
296
+ @include it("sets up RTLCSS for removal when false") {
297
+ @include test-generate-utility(
298
+ (
299
+ property: padding,
300
+ values: 1rem,
301
+ rtl: false
302
+ )
303
+ ) {
304
+ /* rtl:begin:remove */
305
+
306
+ .padding-1rem {
307
+ padding: 1rem;
308
+ }
309
+
310
+ /* rtl:end:remove */
311
+
312
+ }
313
+ }
314
+ }
315
+
316
+ @include describe("rfs") {
317
+ @include it("sets the fluid value when not inside media query") {
318
+ @include test-generate-utility(
319
+ (
320
+ property: padding,
321
+ values: 1rem,
322
+ rfs: true
323
+ )
324
+ ) {
325
+ .padding-1rem {
326
+ padding: rfs-fluid-value(1rem);
327
+ }
328
+ }
329
+ }
330
+
331
+ @include it("sets the value when inside the media query") {
332
+ @include test-generate-utility(
333
+ (
334
+ property: padding,
335
+ values: 1rem,
336
+ rfs: true
337
+ ),
338
+ $is-rfs-media-query: true
339
+ ) {
340
+ .padding-1rem {
341
+ padding: rfs-value(1rem);
342
+ }
343
+ }
344
+ }
345
+ }
346
+ }
347
+
348
+ @include describe("$infix") {
349
+ @include it("inserts the given infix") {
350
+ @include test-generate-utility(
351
+ (
352
+ property: "padding",
353
+ values: (null: 1rem, small: .5rem, large: 2rem)
354
+ ),
355
+ $infix: -sm
356
+ ) {
357
+ .padding-sm {
358
+ padding: 1rem;
359
+ }
360
+
361
+ .padding-sm-small {
362
+ padding: .5rem;
363
+ }
364
+
365
+ .padding-sm-large {
366
+ padding: 2rem;
367
+ }
368
+ }
369
+ }
370
+
371
+ @include it("strips leading - if class is null") {
372
+ @include test-generate-utility(
373
+ (
374
+ property: visibility,
375
+ class: null,
376
+ values: (
377
+ visible: visible,
378
+ invisible: hidden,
379
+ )
380
+ ),
381
+ -sm
382
+ ) {
383
+ .sm-visible {
384
+ visibility: visible;
385
+ }
386
+
387
+ .sm-invisible {
388
+ visibility: hidden;
389
+ }
390
+ }
391
+ }
392
+ }
393
+ }
@@ -0,0 +1,14 @@
1
+ 'use strict'
2
+
3
+ const path = require('node:path')
4
+
5
+ const runnerPath = path.join(__dirname, 'runner').replace(/\\/g, '/')
6
+
7
+ require.extensions['.scss'] = (module, filename) => {
8
+ const normalizedFilename = filename.replace(/\\/g, '/')
9
+
10
+ return module._compile(`
11
+ const runner = require('${runnerPath}')
12
+ runner('${normalizedFilename}', { describe, it })
13
+ `, filename)
14
+ }
@@ -0,0 +1,17 @@
1
+ 'use strict'
2
+
3
+ const fs = require('node:fs')
4
+ const path = require('node:path')
5
+ const { runSass } = require('sass-true')
6
+
7
+ module.exports = (filename, { describe, it }) => {
8
+ const data = fs.readFileSync(filename, 'utf8')
9
+ const TRUE_SETUP = '$true-terminal-output: false; @import "true";'
10
+ const sassString = TRUE_SETUP + data
11
+
12
+ runSass(
13
+ { describe, it, sourceType: 'string' },
14
+ sassString,
15
+ { loadPaths: [path.dirname(filename)] }
16
+ )
17
+ }
@@ -0,0 +1,75 @@
1
+ @import "../../functions";
2
+ @import "../../variables";
3
+ @import "../../variables-dark";
4
+ @import "../../maps";
5
+ @import "../../mixins";
6
+
7
+ $utilities: ();
8
+
9
+ @include describe("utilities/api") {
10
+ @include it("generates utilities for each breakpoints") {
11
+ $utilities: (
12
+ margin: (
13
+ property: margin,
14
+ values: auto
15
+ ),
16
+ padding: (
17
+ property: padding,
18
+ responsive: true,
19
+ values: 1rem
20
+ ),
21
+ font-size: (
22
+ property: font-size,
23
+ values: (large: 1.25rem),
24
+ print: true
25
+ )
26
+ ) !global;
27
+
28
+ $grid-breakpoints: (
29
+ xs: 0,
30
+ sm: 333px,
31
+ md: 666px
32
+ ) !global;
33
+
34
+ @include assert() {
35
+ @include output() {
36
+ @import "../../utilities/api";
37
+ }
38
+
39
+ @include expect() {
40
+ // margin is not set to responsive
41
+ .margin-auto {
42
+ margin: auto !important;
43
+ }
44
+
45
+ // padding is, though
46
+ .padding-1rem {
47
+ padding: 1rem !important;
48
+ }
49
+
50
+ .font-size-large {
51
+ font-size: 1.25rem !important;
52
+ }
53
+
54
+ @media (min-width: 333px) {
55
+ .padding-sm-1rem {
56
+ padding: 1rem !important;
57
+ }
58
+ }
59
+
60
+ @media (min-width: 666px) {
61
+ .padding-md-1rem {
62
+ padding: 1rem !important;
63
+ }
64
+ }
65
+
66
+ @media print {
67
+ .font-size-print-large {
68
+ font-size: 1.25rem !important;
69
+ }
70
+ }
71
+ }
72
+
73
+ }
74
+ }
75
+ }
@@ -0,0 +1,47 @@
1
+ // Loop over each breakpoint
2
+ @each $breakpoint in map-keys($grid-breakpoints) {
3
+
4
+ // Generate media query if needed
5
+ @include media-breakpoint-up($breakpoint) {
6
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
7
+
8
+ // Loop over each utility property
9
+ @each $key, $utility in $utilities {
10
+ // The utility can be disabled with `false`, thus check if the utility is a map first
11
+ // Only proceed if responsive media queries are enabled or if it's the base media query
12
+ @if type-of($utility) == "map" and (map-get($utility, responsive) or $infix == "") {
13
+ @include generate-utility($utility, $infix);
14
+ }
15
+ }
16
+ }
17
+ }
18
+
19
+ // RFS rescaling
20
+ @media (min-width: $rfs-mq-value) {
21
+ @each $breakpoint in map-keys($grid-breakpoints) {
22
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
23
+
24
+ @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {
25
+ // Loop over each utility property
26
+ @each $key, $utility in $utilities {
27
+ // The utility can be disabled with `false`, thus check if the utility is a map first
28
+ // Only proceed if responsive media queries are enabled or if it's the base media query
29
+ @if type-of($utility) == "map" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == "") {
30
+ @include generate-utility($utility, $infix, true);
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
36
+
37
+
38
+ // Print utilities
39
+ @media print {
40
+ @each $key, $utility in $utilities {
41
+ // The utility can be disabled with `false`, thus check if the utility is a map first
42
+ // Then check if the utility needs print styles
43
+ @if type-of($utility) == "map" and map-get($utility, print) == true {
44
+ @include generate-utility($utility, "-print");
45
+ }
46
+ }
47
+ }