@carbon/grid 10.41.0 → 10.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,343 +5,466 @@
5
5
  // LICENSE file in the root directory of this source tree.
6
6
  //
7
7
 
8
- @use 'sass:meta';
9
- @use "sass:math";
10
-
8
+ @use 'sass:list';
11
9
  @use 'sass:map';
10
+ @use 'sass:math';
11
+ @use 'sass:meta';
12
12
  @use 'config' as *;
13
13
  @use 'breakpoint' as *;
14
14
 
15
- @mixin css-grid() {
16
- display: grid;
17
- max-width: 99rem;
18
- padding-right: calc(var(--cds-grid-margin) + var(--cds-grid-gutter) / 2);
19
- padding-left: calc(var(--cds-grid-margin) + var(--cds-grid-gutter) / 2);
20
- margin-right: auto;
21
- margin-left: auto;
22
- column-gap: var(--cds-grid-gutter);
23
- grid-template-columns: repeat(
24
- var(--cds-grid-columns),
25
- minmax(0, var(--cds-grid-column-size))
26
- );
27
- }
28
-
29
- @mixin subgrid() {
30
- display: grid;
31
- column-gap: var(--cds-grid-gutter);
32
- grid-template-columns: repeat(
33
- var(--cds-grid-columns),
34
- minmax(0, var(--cds-grid-column-size))
35
- );
36
- }
37
-
38
- :root {
39
- --cds-grid-columns: 4;
40
- --cds-grid-column-size: 1fr;
41
- --cds-grid-gutter: 2rem;
42
- // Used to configure appropriate margins for condensed subgrids inside wide grids
43
- --cds-grid-gutter-wide: 2rem;
44
- --cds-grid-hang: 1rem;
45
- --cds-grid-margin: 0;
46
-
47
- @include breakpoint(md) {
48
- --cds-grid-columns: 8;
49
- --cds-grid-margin: 1rem;
15
+ /// Emit all the styles related to the CSS Grid, these include:
16
+ /// - The base grid class
17
+ /// - The various grid modes
18
+ /// - The ability to specifiy column span
19
+ /// - The ability to specifiy column start,end position
20
+ /// - Support for subgrid
21
+ /// - Support for hanging content on a grid column
22
+ /// - Support for controlling grid gutter on a cell basis
23
+ /// - Support for specifying content alignment
24
+ ///
25
+ ///
26
+ /// In general, this mixin is structured in a way to emit the fewest CSS styles
27
+ /// as possible. To do this, we will (as much as possible) not emit a value if
28
+ /// one is already defined at a previous breakpoint.
29
+ ///
30
+ /// In addition, this mixin will break down emitting styles into several stages:
31
+ /// 1. Emit styles for the smallest breakpoint without any breakpoint. By
32
+ /// default, these styles will be on
33
+ /// 2. For every other breakpoint, wrap it in a breakpoint so that it only is
34
+ /// triggered when that breakpoint is applied
35
+ /// 3. In situations where it is appropriate, we also will emit "unconditional"
36
+ /// selectors that will always apply. For example, if you wanted a column to
37
+ /// always span four columns
38
+ @mixin css-grid($breakpoints: $grid-breakpoints) {
39
+ /// The :root selector is responsible for setting several top-level CSS Custom
40
+ /// Properties, including the overall grid gutter, grid column count, and grid
41
+ /// margin
42
+ :root {
43
+ --cds-grid-gutter: #{$grid-gutter};
44
+
45
+ // Iterate through the grid breakpoints and only emit the grid-columns and
46
+ // grid-margin CSS Custom Properties if they've changed from the previous
47
+ // breakpoint. By default, we emit the smallest breakpoint values on the
48
+ // :root selector
49
+ @each $key, $value in $breakpoints {
50
+ @if is-smallest-breakpoint($key, $breakpoints) {
51
+ --cds-grid-columns: #{get-column-count($breakpoints, $key)};
52
+ --cds-grid-margin: #{get-margin($breakpoints, $key)};
53
+ } @else {
54
+ $previous-breakpoint: breakpoint-prev($key, $breakpoints);
55
+ $changes: ();
56
+
57
+ @if get-column-count($breakpoints, $key) !=
58
+ get-column-count($breakpoints, $previous-breakpoint)
59
+ {
60
+ $changes: map.set(
61
+ $changes,
62
+ grid-columns,
63
+ get-column-count($breakpoints, $key)
64
+ );
65
+ }
66
+
67
+ @if get-margin($breakpoints, $key) !=
68
+ get-margin($breakpoints, $previous-breakpoint)
69
+ {
70
+ $changes: map.set(
71
+ $changes,
72
+ grid-margin,
73
+ get-margin($breakpoints, $key)
74
+ );
75
+ }
76
+
77
+ @include breakpoint($key) {
78
+ @each $name, $value in $changes {
79
+ --cds-#{$name}: #{$value};
80
+ }
81
+ }
82
+ }
83
+ }
50
84
  }
51
85
 
52
- @include breakpoint(lg) {
53
- --cds-grid-columns: 16;
86
+ // -----------------------------------------------------------------------------
87
+ // Base CSS Grid
88
+ // -----------------------------------------------------------------------------
89
+ .#{$prefix}--css-grid {
90
+ --cds-grid-gutter-start: calc(var(--cds-grid-gutter) / 2);
91
+ --cds-grid-gutter-end: calc(var(--cds-grid-gutter) / 2);
92
+ // We split out a separate "column hang" since "gutter-start" is set
93
+ // dynamically and could be 0
94
+ --cds-grid-column-hang: calc(var(--cds-grid-gutter) / 2);
95
+
96
+ display: grid;
97
+ max-width: get-grid-width(
98
+ $breakpoints,
99
+ largest-breakpoint-name($breakpoints)
100
+ );
101
+ padding-right: var(--cds-grid-margin);
102
+ padding-left: var(--cds-grid-margin);
103
+ margin-right: auto;
104
+ margin-left: auto;
105
+ grid-template-columns: repeat(var(--cds-grid-columns), minmax(0, 1fr));
54
106
  }
55
107
 
56
- @include breakpoint(max) {
57
- --cds-grid-margin: 1.5rem;
108
+ // -----------------------------------------------------------------------------
109
+ // Full width
110
+ // -----------------------------------------------------------------------------
111
+ .#{$prefix}--css-grid--full-width {
112
+ max-width: 100%;
58
113
  }
59
- }
60
114
 
61
- .#{$prefix}--css-grid {
62
- @include css-grid();
63
- }
64
-
65
- .#{$prefix}--css-grid--12 {
66
- @include css-grid();
67
- @include breakpoint(lg) {
68
- --cds-grid-columns: 12;
115
+ // -----------------------------------------------------------------------------
116
+ // Column
117
+ // -----------------------------------------------------------------------------
118
+
119
+ // Add gutter to columns in a CSS Grid. Unfortunately, we cannot use
120
+ // `grid-gap`, `column-gap`, etc. as we need to conditionally remove leading
121
+ // and trailing gutter from a column.
122
+ .#{$prefix}--css-grid-column {
123
+ // grid-mode-start, grid-mode-end are meant to capture the "grid settings"
124
+ // so that subgrids can correctly fit in parent grids by reverting the
125
+ // grid's outer padding
126
+ --cds-grid-mode-start: var(--cds-grid-gutter-start);
127
+ --cds-grid-mode-end: var(--cds-grid-gutter-end);
128
+
129
+ margin-right: var(--cds-grid-gutter-end);
130
+ margin-left: var(--cds-grid-gutter-start);
131
+
132
+ [dir='rtl'] & {
133
+ margin-right: var(--cds-grid-gutter-start);
134
+ margin-left: var(--cds-grid-gutter-end);
135
+ }
69
136
  }
70
- }
71
-
72
- .#{$prefix}--subgrid {
73
- @include subgrid();
74
- }
75
137
 
76
- .#{$prefix}--subgrid[class*='col'] {
77
- display: grid;
78
- }
79
-
80
- // -----------------------------------------------------------------------------
81
- // Condensed
82
- // -----------------------------------------------------------------------------
83
- .#{$prefix}--css-grid--condensed {
84
- --cds-grid-gutter: 1px;
85
-
86
- column-gap: var(--cds-grid-gutter);
87
- row-gap: var(--cds-grid-gutter);
88
- }
89
-
90
- // condensed subgrid inside wide
91
- .#{$prefix}--css-grid .bx--subgrid.#{$prefix}--css-grid--condensed {
92
- margin-right: calc((var(--cds-grid-gutter-wide) / 2) * -1);
93
- margin-left: calc((var(--cds-grid-gutter-wide) / 2) * -1);
94
- }
95
-
96
- // -----------------------------------------------------------------------------
97
- // No Gutter
98
- // -----------------------------------------------------------------------------
99
- .#{$prefix}--css-grid--no-gutter {
100
- // This is set to 0px (versus 0) so that the calc expression for padding for
101
- // a grid container works as expected. Without the unit, the calc() will
102
- // result in a value of 0.
103
- // stylelint-disable-next-line length-zero-no-unit
104
- --cds-grid-gutter: 0px;
105
-
106
- column-gap: var(--cds-grid-gutter);
107
- }
108
-
109
- // -----------------------------------------------------------------------------
110
- // Full width
111
- // -----------------------------------------------------------------------------
112
- .#{$prefix}--css-grid--full-width {
113
- max-width: 100%;
114
- }
138
+ // -----------------------------------------------------------------------------
139
+ // Grid modes
140
+ // -----------------------------------------------------------------------------
115
141
 
116
- // -----------------------------------------------------------------------------
117
- // Column span
118
- // -----------------------------------------------------------------------------
119
- @mixin -column-span($i) {
120
- @if $i == 0 {
121
- display: none;
122
- } @else {
123
- --cds-grid-columns: #{$i};
142
+ // Narrow
143
+ .#{$prefix}--css-grid--narrow {
144
+ --cds-grid-gutter-start: 0;
145
+ }
124
146
 
125
- display: block;
126
- grid-column: span $i / span $i;
147
+ // Condensed
148
+ .#{$prefix}--css-grid--condensed {
149
+ --cds-grid-gutter: #{$grid-gutter-condensed};
150
+ --cds-grid-column-hang: #{math.div($grid-gutter, 2) -
151
+ math.div($grid-gutter-condensed, 2)};
127
152
  }
128
- }
129
153
 
130
- @for $i from 0 through 16 {
131
- .#{$prefix}--col-span-#{$i} {
132
- @include -column-span($i);
154
+ // -----------------------------------------------------------------------------
155
+ // Subgrid
156
+ // -----------------------------------------------------------------------------
157
+ .#{$prefix}--subgrid {
158
+ display: grid;
159
+ margin-right: calc(var(--cds-grid-mode-end) * -1);
160
+ margin-left: calc(var(--cds-grid-mode-start) * -1);
161
+ grid-template-columns: repeat(var(--cds-grid-columns), minmax(0, 1fr));
162
+
163
+ [dir='rtl'] & {
164
+ margin-right: calc(var(--cds-grid-mode-start) * -1);
165
+ margin-left: calc(var(--cds-grid-mode-end) * -1);
166
+ }
133
167
  }
134
- }
135
168
 
136
- .#{$prefix}--col-span-auto {
137
- grid-column: auto;
138
- }
169
+ // Support the grid modes in subgrids
170
+ .#{$prefix}--subgrid--wide {
171
+ --cds-grid-gutter-start: #{math.div($grid-gutter, 2)};
172
+ --cds-grid-gutter-end: #{math.div($grid-gutter, 2)};
173
+ --cds-grid-column-hang: 0;
174
+ }
139
175
 
140
- .#{$prefix}--col-span-100 {
141
- grid-column: 1 / -1;
142
- }
176
+ .#{$prefix}--subgrid--narrow {
177
+ --cds-grid-gutter-start: 0;
178
+ --cds-grid-gutter-end: #{math.div($grid-gutter, 2)};
179
+ --cds-grid-column-hang: #{math.div($grid-gutter, 2)};
180
+ }
143
181
 
144
- .#{$prefix}--col-span-25 {
145
- --cds-grid-columns: 1;
182
+ .#{$prefix}--subgrid--condensed {
183
+ --cds-grid-gutter-start: #{math.div($grid-gutter-condensed, 2)};
184
+ --cds-grid-gutter-end: #{math.div($grid-gutter-condensed, 2)};
185
+ --cds-grid-column-hang: #{math.div($grid-gutter, 2) -
186
+ math.div($grid-gutter-condensed, 2)};
187
+ }
146
188
 
147
- grid-column: span 1;
189
+ // -----------------------------------------------------------------------------
190
+ // Column hang
191
+ // -----------------------------------------------------------------------------
148
192
 
149
- @include breakpoint(md) {
150
- --cds-grid-columns: 2;
193
+ // Helper class to allow for text alignment in columns where the leading
194
+ // gutter is missing (like narrow) or is reduced (like in condensed).
195
+ .#{$prefix}--grid-column-hang {
196
+ margin-left: var(--cds-grid-column-hang);
151
197
 
152
- grid-column: span 2;
198
+ [dir='rtl'] & {
199
+ margin-right: var(--cds-grid-column-hang);
200
+ margin-left: initial;
201
+ }
153
202
  }
154
203
 
155
- @include breakpoint(lg) {
156
- --cds-grid-columns: 4;
204
+ // -----------------------------------------------------------------------------
205
+ // Column span
206
+ // -----------------------------------------------------------------------------
157
207
 
158
- grid-column: span 4;
208
+ // Generate col-span-{0-16} classes which unconditionally set column span
209
+ // regardless of breakpoint
210
+ @for $i from 0 through get-grid-columns($breakpoints) {
211
+ .#{$prefix}--col-span-#{$i} {
212
+ @include -column-span($i);
213
+ }
159
214
  }
160
- }
161
-
162
- .#{$prefix}--col-span-50 {
163
- --cds-grid-columns: 2;
164
215
 
165
- grid-column: span 2;
216
+ // Responsive column span
217
+ @each $name, $value in $breakpoints {
218
+ // Column span per breakpoint
219
+ @for $i from 0 through get-column-count($breakpoints, $name) {
220
+ @if is-smallest-breakpoint($name, $breakpoints) {
221
+ .#{$prefix}--#{$name}\:col-span-#{$i} {
222
+ @include -column-span($i);
223
+ }
224
+ } @else {
225
+ @include breakpoint($name) {
226
+ .#{$prefix}--#{$name}\:col-span-#{$i} {
227
+ @include -column-span($i);
228
+ }
229
+ }
230
+ }
231
+ }
166
232
 
167
- @include breakpoint(md) {
168
- --cds-grid-columns: 4;
233
+ // Percent column span per breakpoint
234
+ @if is-smallest-breakpoint($name, $breakpoints) {
235
+ .#{$prefix}--#{$name}\:col-span-auto {
236
+ grid-column: auto;
237
+ }
169
238
 
170
- grid-column: span 4;
171
- }
239
+ .#{$prefix}--#{$name}\:col-span-100 {
240
+ grid-column: 1 / -1;
241
+ }
172
242
 
173
- @include breakpoint(lg) {
174
- --cds-grid-columns: 8;
243
+ $columns: get-column-count($breakpoints, $name);
175
244
 
176
- grid-column: span 8;
177
- }
178
- }
245
+ .#{$prefix}--#{$name}\:col-span-75 {
246
+ $span: $columns * 0.75;
247
+ --cds-grid-columns: #{$span};
179
248
 
180
- .#{$prefix}--col-span-75 {
181
- --cds-grid-columns: 3;
249
+ grid-column: span #{$span} / span #{$span};
250
+ }
182
251
 
183
- grid-column: span 3;
252
+ .#{$prefix}--#{$name}\:col-span-50 {
253
+ $span: $columns * 0.5;
254
+ --cds-grid-columns: #{$span};
184
255
 
185
- @include breakpoint(md) {
186
- --cds-grid-columns: 6;
256
+ grid-column: span #{$span} / span #{$span};
257
+ }
187
258
 
188
- grid-column: span 6;
189
- }
259
+ .#{$prefix}--#{$name}\:col-span-25 {
260
+ $span: $columns * 0.25;
261
+ --cds-grid-columns: #{$span};
190
262
 
191
- @include breakpoint(lg) {
192
- --cds-grid-columns: 12;
263
+ grid-column: span #{$span} / span #{$span};
264
+ }
265
+ } @else {
266
+ @include breakpoint($name) {
267
+ .#{$prefix}--#{$name}\:col-span-auto {
268
+ grid-column: auto;
269
+ }
193
270
 
194
- grid-column: span 12;
195
- }
196
- }
271
+ .#{$prefix}--#{$name}\:col-span-100 {
272
+ grid-column: 1 / -1;
273
+ }
197
274
 
198
- @each $name, $value in $grid-breakpoints {
199
- $columns: map.get($value, columns);
275
+ $columns: get-column-count($breakpoints, $name);
200
276
 
201
- @include breakpoint($name) {
202
- @for $i from 0 through $columns {
203
- .#{$prefix}--#{$name}\:col-span-#{$i} {
204
- @include -column-span($i);
205
- }
206
- }
277
+ .#{$prefix}--#{$name}\:col-span-75 {
278
+ $span: $columns * 0.75;
279
+ --cds-grid-columns: #{$span};
207
280
 
208
- .#{$prefix}--#{$name}\:col-span-auto {
209
- grid-column: auto;
210
- }
281
+ grid-column: span #{$span} / span #{$span};
282
+ }
211
283
 
212
- .#{$prefix}--#{$name}\:col-span-100 {
213
- grid-column: 1 / -1;
214
- }
284
+ .#{$prefix}--#{$name}\:col-span-50 {
285
+ $span: $columns * 0.5;
286
+ --cds-grid-columns: #{$span};
215
287
 
216
- $quarterGridColumns: math.div($columns, 4);
288
+ grid-column: span #{$span} / span #{$span};
289
+ }
217
290
 
218
- .#{$prefix}--#{$name}\:col-span-75 {
219
- $calc: $quarterGridColumns * 3;
220
- --cds-grid-columns: #{$calc};
291
+ .#{$prefix}--#{$name}\:col-span-25 {
292
+ $span: $columns * 0.25;
293
+ --cds-grid-columns: #{$span};
221
294
 
222
- grid-column: span $calc / span $calc;
295
+ grid-column: span #{$span} / span #{$span};
296
+ }
297
+ }
223
298
  }
299
+ }
224
300
 
225
- .#{$prefix}--#{$name}\:col-span-50 {
226
- $calc: $quarterGridColumns * 2;
227
- --cds-grid-columns: #{$calc};
301
+ // -----------------------------------------------------------------------------
302
+ // Column percent span
303
+ // -----------------------------------------------------------------------------
304
+ .#{$prefix}--col-span-auto {
305
+ grid-column: auto;
306
+ }
228
307
 
229
- grid-column: span $calc / span $calc;
230
- }
308
+ .#{$prefix}--col-span-100 {
309
+ grid-column: 1 / -1;
310
+ }
231
311
 
232
- .#{$prefix}--#{$name}\:col-span-25 {
233
- --cds-grid-columns: #{$quarterGridColumns};
312
+ .#{$prefix}--col-span-75 {
313
+ @include -percent-column-span($breakpoints, 0.75);
314
+ }
234
315
 
235
- grid-column: span $quarterGridColumns / span $quarterGridColumns;
236
- }
316
+ .#{$prefix}--col-span-50 {
317
+ @include -percent-column-span($breakpoints, 0.5);
237
318
  }
238
- }
239
319
 
240
- // -----------------------------------------------------------------------------
241
- // Column offset
242
- // -----------------------------------------------------------------------------
243
- @for $i from 1 through 17 {
244
- .#{$prefix}--col-start-#{$i} {
245
- grid-column-start: $i;
320
+ .#{$prefix}--col-span-25 {
321
+ @include -percent-column-span($breakpoints, 0.25);
246
322
  }
247
323
 
248
- .#{$prefix}--col-end-#{$i} {
249
- grid-column-start: $i;
324
+ // -----------------------------------------------------------------------------
325
+ // Column offset
326
+ // -----------------------------------------------------------------------------
327
+ // Unconditional column start
328
+ // Note: we start at 1 and end at column-count to match grid lines. We do not
329
+ // start at column-count + 1 since starting at the end of the grid would mean
330
+ // a column would have no width available
331
+ @for $i from 1 through get-grid-columns($breakpoints) {
332
+ .#{$prefix}--col-start-#{$i} {
333
+ grid-column-start: $i;
334
+ }
250
335
  }
251
- }
252
336
 
253
- .#{$prefix}--col-start-auto {
254
- grid-column-start: auto;
255
- }
337
+ // Unconditional column end
338
+ // Note: we start at 2 since a column ending at line 1 would have no width. We
339
+ // end at column-count + 1 since grid lines start at 1
340
+ @for $i from 2 through get-grid-columns($breakpoints) + 1 {
341
+ .#{$prefix}--col-end-#{$i} {
342
+ grid-column-end: $i;
343
+ }
344
+ }
256
345
 
257
- .#{$prefix}--col-end-auto {
258
- grid-column-start: end;
259
- }
346
+ .#{$prefix}--col-start-auto {
347
+ grid-column-start: auto;
348
+ }
260
349
 
261
- @each $name, $value in $grid-breakpoints {
262
- $columns: map.get($value, columns);
350
+ .#{$prefix}--col-end-auto {
351
+ grid-column-end: auto;
352
+ }
263
353
 
264
- @include breakpoint($name) {
265
- // The `grid-column-start` property is *not* inclusive.
266
- // It starts the column *at* the column, not *on* the column. We must
267
- // ensure that there is one additional class available for each breakpoint.
268
- @for $i from 1 through $columns + 1 {
269
- .#{$prefix}--#{$name}\:col-start-#{$i} {
270
- grid-column-start: $i;
354
+ // Responsive column start, end
355
+ @each $name, $value in $breakpoints {
356
+ @if is-smallest-breakpoint($name, $breakpoints) {
357
+ // Responsive column start
358
+ @for $i from 1 through get-grid-columns($breakpoints) {
359
+ .#{$prefix}--#{$name}\:col-start-#{$i} {
360
+ grid-column-start: $i;
361
+ }
271
362
  }
272
363
 
273
- .#{$prefix}--#{$name}\:col-end-#{$i} {
274
- grid-column-end: $i;
364
+ // Responsive column end
365
+ @for $i from 2 through get-grid-columns($breakpoints) + 1 {
366
+ .#{$prefix}--#{$name}\:col-end-#{$i} {
367
+ grid-column-end: $i;
368
+ }
275
369
  }
276
- }
277
370
 
278
- .#{$prefix}--#{$name}\:col-start-auto {
279
- grid-column-start: auto;
280
- }
371
+ .#{$prefix}--#{$name}\:col-start-auto {
372
+ grid-column-start: auto;
373
+ }
281
374
 
282
- .#{$prefix}--#{$name}\:col-end-auto {
283
- grid-column-start: end;
375
+ .#{$prefix}--#{$name}\:col-end-auto {
376
+ grid-column-end: auto;
377
+ }
378
+ } @else {
379
+ @include breakpoint($name) {
380
+ // Responsive column start
381
+ @for $i from 1 through get-grid-columns($breakpoints) {
382
+ .#{$prefix}--#{$name}\:col-start-#{$i} {
383
+ grid-column-start: $i;
384
+ }
385
+ }
386
+
387
+ // Responsive column end
388
+ @for $i from 2 through get-grid-columns($breakpoints) + 1 {
389
+ .#{$prefix}--#{$name}\:col-end-#{$i} {
390
+ grid-column-end: $i;
391
+ }
392
+ }
393
+
394
+ .#{$prefix}--#{$name}\:col-start-auto {
395
+ grid-column-start: auto;
396
+ }
397
+
398
+ .#{$prefix}--#{$name}\:col-end-auto {
399
+ grid-column-end: auto;
400
+ }
401
+ }
284
402
  }
285
403
  }
286
404
  }
287
405
 
288
- // -----------------------------------------------------------------------------
289
- // Hang
290
- // -----------------------------------------------------------------------------
291
- .#{$prefix}--hang {
292
- padding-left: var(--cds-grid-hang);
293
- }
294
-
295
- // -----------------------------------------------------------------------------
296
- // Column gutter
297
- // -----------------------------------------------------------------------------
298
- .#{$prefix}--gutter {
299
- padding-right: var(--cds-grid-hang);
300
- padding-left: var(--cds-grid-hang);
301
- }
302
-
303
- .#{$prefix}--gutter-start {
304
- padding-left: var(--cds-grid-hang);
305
- }
406
+ /// Generate the styles for a grid column
407
+ @mixin -column-span($i) {
408
+ @if $i == 0 {
409
+ display: none;
410
+ } @else {
411
+ --cds-grid-columns: #{$i};
306
412
 
307
- [dir='rtl'] .#{$prefix}--gutter-start {
308
- padding-right: var(--cds-grid-hang);
413
+ display: block;
414
+ grid-column: span $i / span $i;
415
+ }
309
416
  }
310
417
 
311
- .#{$prefix}--gutter-end {
312
- padding-right: var(--cds-grid-hang);
313
- }
418
+ /// Generate the styles for an unconditional class that represents a percent
419
+ /// span of a grid
420
+ @mixin -percent-column-span($breakpoints, $percent) {
421
+ @each $key, $value in $breakpoints {
422
+ $columns: get-column-count($breakpoints, $key);
423
+ $span: $columns * $percent;
314
424
 
315
- [dir='rtl'] .#{$prefix}--gutter-end {
316
- padding-left: var(--cds-grid-hang);
317
- }
425
+ @if is-smallest-breakpoint($key, $breakpoints) {
426
+ --cds-grid-columns: #{$span};
318
427
 
319
- // -----------------------------------------------------------------------------
320
- // Utilities
321
- // -----------------------------------------------------------------------------
428
+ grid-column: span #{$span} / span #{$span};
429
+ } @else {
430
+ $previous-breakpoint: breakpoint-prev($key, $breakpoints);
431
+ $previous-column-count: get-column-count(
432
+ $breakpoints,
433
+ $previous-breakpoint
434
+ );
435
+ $previous-span: $previous-column-count * $percent;
322
436
 
323
- /// Justify items
324
- .#{$prefix}--justify-items-start {
325
- justify-items: start;
326
- }
437
+ @if $span != $previous-span {
438
+ @include breakpoint($key) {
439
+ --cds-grid-columns: #{$span};
327
440
 
328
- .#{$prefix}--justify-items-end {
329
- justify-items: end;
441
+ grid-column: span #{$span} / span #{$span};
442
+ }
443
+ }
444
+ }
445
+ }
330
446
  }
331
447
 
332
- .#{$prefix}--justify-items-center {
333
- justify-items: center;
448
+ /// Get the grid width for a specific breakpoint name
449
+ @function get-grid-width($breakpoints, $breakpoint) {
450
+ @return map.get(map.get($breakpoints, $breakpoint), width);
334
451
  }
335
452
 
336
- /// Align items
337
- .#{$prefix}--align-items-start {
338
- align-items: start;
453
+ /// Get the grid column count for a specific breakpoint name
454
+ @function get-column-count($breakpoints, $breakpoint) {
455
+ @return map.get(map.get($breakpoints, $breakpoint), columns);
339
456
  }
340
457
 
341
- .#{$prefix}--align-items-end {
342
- align-items: end;
458
+ /// Get the grid margin for a specific breakpoint name
459
+ @function get-margin($breakpoints, $breakpoint) {
460
+ $value: map.get(map.get($breakpoints, $breakpoint), margin);
461
+ @if $value == 0 {
462
+ @return 0;
463
+ }
464
+ @return $value;
343
465
  }
344
466
 
345
- .#{$prefix}--align-items-center {
346
- align-items: center;
467
+ /// Return the largest column count from a set of breakpoints
468
+ @function get-grid-columns($breakpoints) {
469
+ @return get-column-count($breakpoints, largest-breakpoint-name($breakpoints));
347
470
  }