@getvitops/generator 1.0.0 → 2.0.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.
@@ -0,0 +1,764 @@
1
+ /* ═══════════════════════════════════════════════════════════════════════════
2
+ LAYOUT UTILITIES — rhythm overrides, track placement, splits, flex direction,
3
+ alignment, text-align.
4
+
5
+ Mapped to `vitops.utilities` (CHUNK_LAYER, packages/generator/src/generate.ts).
6
+ That is the whole reason this file is separate from layout.css: these are
7
+ single-purpose utilities and must beat the patterns in `vitops.components` —
8
+ `class="split flex-col"`, `class="table text-center"`, `class="media
9
+ items-center"` — which they could not do while they shared a partial with
10
+ `.split`/`.rhythm`/`.centered` and the layer was decided per FILE.
11
+
12
+ Container-gated (unnamed @container): resolve against the nearest
13
+ container-type ancestor. Bare = base/mobile; sm- md- lg- xl- widen up.
14
+ Breakpoints: sm 30rem · md 48rem · lg 64rem · xl 80rem.
15
+
16
+ ORDER WITHIN THIS FILE still matters, because everything here shares one
17
+ layer. One relationship is load-bearing:
18
+
19
+ `.<bp>-split-<a>-<b>` MUST come after `.flex-col`
20
+
21
+ so `class="split flex-col md-split-1-2"` un-stacks at the breakpoint. Its
22
+ counterpart in the tailwind format is Tailwind's own rule that a variant sorts
23
+ after the un-varianted utility, which is stable (measured, tailwindcss@4.3.3).
24
+
25
+ What is NOT a contract: bare `.split-1-2` vs `.flex-col`. Here the ratio loses,
26
+ because `flex-col` is an explicit instruction to stack and a bare ratio is not
27
+ an instruction to un-stack. In tailwind the winner depends on Tailwind's
28
+ property-based sort of custom utilities — measured to FLIP when a declaration
29
+ is added to the utility body — so the two formats may disagree. Writing both
30
+ on one element is contradictory input; don't. Use a breakpoint-scoped ratio.
31
+
32
+ `.<bp>-split` (bare, no ratio) deliberately does not exist: `@utility` cannot
33
+ live in a layer, so once `.split` became a component tailwind could no longer
34
+ produce `@md:split`. `md-flex-row` says "become a row at md" in every format.
35
+ ═══════════════════════════════════════════════════════════════════════════ */
36
+
37
+ /* Manual rhythm overrides (apply to the second element of a pair). In
38
+ `vitops.utilities`, so these beat both `.rhythm`'s sibling margins and any
39
+ pattern that sets a margin on the same element (e.g. details.css's
40
+ `> summary + *`). */
41
+ .m-h-p {
42
+ margin-top: calc(var(--rhythm-base) * var(--rhythm-h-p));
43
+ }
44
+ .m-p-p {
45
+ margin-top: calc(var(--rhythm-base) * var(--rhythm-p-p));
46
+ }
47
+ .m-p-h {
48
+ margin-top: calc(var(--rhythm-base) * var(--rhythm-p-h));
49
+ }
50
+ .m-h-h {
51
+ margin-top: calc(var(--rhythm-base) * var(--rhythm-h-h));
52
+ }
53
+ .m-p-list {
54
+ margin-top: calc(var(--rhythm-base) * var(--rhythm-p-list));
55
+ }
56
+ .m-list-p {
57
+ margin-top: calc(var(--rhythm-base) * var(--rhythm-list-p));
58
+ }
59
+ .m-li-li {
60
+ margin-top: calc(var(--rhythm-base) * var(--rhythm-li-li));
61
+ }
62
+ .m-text-media {
63
+ margin-top: calc(var(--rhythm-base) * var(--rhythm-text-media));
64
+ }
65
+ .m-media-text {
66
+ margin-top: calc(var(--rhythm-base) * var(--rhythm-media-text));
67
+ }
68
+
69
+ .m-0 {
70
+ margin-top: 0;
71
+ }
72
+ .m-xs {
73
+ margin-top: calc(var(--rhythm-base) * 0.25);
74
+ }
75
+ .m-s {
76
+ margin-top: calc(var(--rhythm-base) * 0.5);
77
+ }
78
+ .m-m {
79
+ margin-top: calc(var(--rhythm-base) * 1);
80
+ }
81
+ .m-l {
82
+ margin-top: calc(var(--rhythm-base) * 1.5);
83
+ }
84
+ .m-xl {
85
+ margin-top: calc(var(--rhythm-base) * 2);
86
+ }
87
+
88
+ /* Bare placement. .measure restates the default (redundant but parser-visible). */
89
+ .measure {
90
+ grid-column: measure;
91
+ }
92
+ .breakout {
93
+ grid-column: breakout;
94
+ }
95
+ .spotlight {
96
+ grid-column: spotlight;
97
+ }
98
+ .fullbleed {
99
+ grid-column: fullbleed;
100
+ }
101
+
102
+ /* Promotion variants (base = measure; widen past each container breakpoint) */
103
+ @container (min-width: 30rem) {
104
+ .sm-measure {
105
+ grid-column: measure;
106
+ }
107
+ .sm-breakout {
108
+ grid-column: breakout;
109
+ }
110
+ .sm-spotlight {
111
+ grid-column: spotlight;
112
+ }
113
+ .sm-fullbleed {
114
+ grid-column: fullbleed;
115
+ }
116
+ }
117
+ @container (min-width: 48rem) {
118
+ .md-measure {
119
+ grid-column: measure;
120
+ }
121
+ .md-breakout {
122
+ grid-column: breakout;
123
+ }
124
+ .md-spotlight {
125
+ grid-column: spotlight;
126
+ }
127
+ .md-fullbleed {
128
+ grid-column: fullbleed;
129
+ }
130
+ }
131
+ @container (min-width: 64rem) {
132
+ .lg-measure {
133
+ grid-column: measure;
134
+ }
135
+ .lg-breakout {
136
+ grid-column: breakout;
137
+ }
138
+ .lg-spotlight {
139
+ grid-column: spotlight;
140
+ }
141
+ .lg-fullbleed {
142
+ grid-column: fullbleed;
143
+ }
144
+ }
145
+ @container (min-width: 80rem) {
146
+ .xl-measure {
147
+ grid-column: measure;
148
+ }
149
+ .xl-breakout {
150
+ grid-column: breakout;
151
+ }
152
+ .xl-spotlight {
153
+ grid-column: spotlight;
154
+ }
155
+ .xl-fullbleed {
156
+ grid-column: fullbleed;
157
+ }
158
+ }
159
+ .split-1-2 {
160
+ flex-direction: row;
161
+ --_split-a: 1;
162
+ --_split-b: 2;
163
+ }
164
+ .split-2-1 {
165
+ flex-direction: row;
166
+ --_split-a: 2;
167
+ --_split-b: 1;
168
+ }
169
+ .split-1-3 {
170
+ flex-direction: row;
171
+ --_split-a: 1;
172
+ --_split-b: 3;
173
+ }
174
+ .split-3-1 {
175
+ flex-direction: row;
176
+ --_split-a: 3;
177
+ --_split-b: 1;
178
+ }
179
+ .split-1-4 {
180
+ flex-direction: row;
181
+ --_split-a: 1;
182
+ --_split-b: 4;
183
+ }
184
+ .split-4-1 {
185
+ flex-direction: row;
186
+ --_split-a: 4;
187
+ --_split-b: 1;
188
+ }
189
+ .split-2-3 {
190
+ flex-direction: row;
191
+ --_split-a: 2;
192
+ --_split-b: 3;
193
+ }
194
+ .split-3-2 {
195
+ flex-direction: row;
196
+ --_split-a: 3;
197
+ --_split-b: 2;
198
+ }
199
+
200
+ /* ── Stacking is `.flex-col`. There is no split-specific class for it, on
201
+ purpose — a `.split-stack` would be `.flex-col` under another name, and a
202
+ second spelling for one declaration is a thing to keep in step forever.
203
+
204
+ class="split flex-col md-split-1-2" → stacked below 48rem, 1:2 above
205
+
206
+ `.flex-col` beats `.split` by LAYER — `.split` is a pattern in
207
+ `vitops.components`, this file is `vitops.utilities` — and `.md-split-1-2`
208
+ beats `.flex-col` by sitting later in this file (see the section header).
209
+ Nothing resets the ratio while stacked and nothing needs to:
210
+ a percentage flex-basis resolved against an auto-height COLUMN container
211
+ behaves as `content`, so the pair sizes to its content and the ratio goes
212
+ inert. (It does apply if you give the split a definite block-size — a ratio
213
+ in the block axis, which is what asking for one on a fixed-height column
214
+ means.)
215
+
216
+ ── Reversal. `order`, not `row-reverse`, so it reverses on WHATEVER axis the
217
+ split is currently on: `split-reverse` swaps the two columns in a row and the
218
+ two rows in a stack. That is the point — it decides which panel comes first,
219
+ and "first" is a question you mostly care about when stacked. Scope it to a
220
+ breakpoint (`md-split-reverse`) if you want the swap only once there are two
221
+ columns, e.g. media first in source so it leads on mobile, on the right at
222
+ width. Ratios stay attached to SOURCE order, not visual position: in
223
+ `split-2-1 split-reverse` the first child is still the 2, now on the right.
224
+
225
+ ACCESSIBILITY. Visual order now disagrees with DOM order, and focus order
226
+ follows the DOM — so a keyboard user tabs through a reversed split in the
227
+ order it is written, not the order it is seen (WCAG 2.4.3). The rule that
228
+ keeps that from mattering: put focusable content in ONLY ONE of the two
229
+ panels. `reading-flow` is the real fix and is declared below, but support is
230
+ still thin, so it is an enhancement rather than something to rely on. */
231
+ .split-reverse {
232
+ /* Aligns focus/reading order with visual order where supported. Unknown
233
+ properties are ignored, so this is inert elsewhere — the one-focusable-panel
234
+ rule above is what actually holds today. */
235
+ reading-flow: flex-visual;
236
+ }
237
+ .split-reverse > :first-child {
238
+ order: 1;
239
+ }
240
+ /* ── Auto-fit grid: cards wrap into as many equal columns as fit, each at least
241
+ --grid-min wide. Unlike .split (explicit fractions) the column count is
242
+ content-driven. ── */
243
+ .grid-auto {
244
+ display: grid;
245
+ gap: var(--grid-gap, 1rem);
246
+ grid-template-columns: repeat(auto-fit, minmax(var(--grid-min, 13rem), 1fr));
247
+
248
+ /* Spacing between items is the grid's job, not the flow's — neutralise the
249
+ `.rhythm :where(ul, ol) > li + li` margin, which reaches into any list
250
+ inside a prose container. `.subgrid` already does this; a `<ul class="grid-auto">`
251
+ needs it just as much, and the symptom is easy to misread: every item bar
252
+ the FIRST gets a top margin, the grid stretches the row to the tallest, and
253
+ the first cell alone looks vertically offset. */
254
+ &:is(ul, ol) > li + li {
255
+ margin-block-start: 0;
256
+ }
257
+ }
258
+
259
+ /* ── Flex direction (display + direction; tiered classes set both) ── */
260
+ .flex {
261
+ display: flex;
262
+ /* Set direction explicitly (not just `display:flex`): hosts like Bricks' block
263
+ element default `flex-direction: column`, which would otherwise win. `.flex-col`
264
+ still overrides. */
265
+ flex-direction: row;
266
+ --_flex-direction: row;
267
+ }
268
+ /* Each direction class also publishes --_flex-direction so descendants (e.g. .group)
269
+ can read the container's axis via a style query and adapt when it flips responsively. */
270
+ .flex-row {
271
+ flex-direction: row;
272
+ --_flex-direction: row;
273
+ }
274
+ .flex-col {
275
+ flex-direction: column;
276
+ --_flex-direction: column;
277
+ }
278
+ /* The reversals. These are named in TW_CLASH — i.e. the tailwind format has
279
+ always deferred to Tailwind's own `flex-row-reverse` — but css/bricks never
280
+ defined them, so a mirrored row was inexpressible in framework classes in the
281
+ two formats that had no fallback. `--_flex-direction` reports the AXIS, which
282
+ is what a style query cares about; the reversal is not part of it. */
283
+ .flex-row-reverse {
284
+ flex-direction: row-reverse;
285
+ --_flex-direction: row;
286
+ }
287
+ .flex-col-reverse {
288
+ flex-direction: column-reverse;
289
+ --_flex-direction: column;
290
+ }
291
+
292
+ @container (min-width: 30rem) {
293
+ .sm-flex {
294
+ display: flex;
295
+ }
296
+ .sm-flex-row {
297
+ display: flex;
298
+ flex-direction: row;
299
+ --_flex-direction: row;
300
+ }
301
+ .sm-flex-col {
302
+ display: flex;
303
+ flex-direction: column;
304
+ --_flex-direction: column;
305
+ }
306
+ .sm-flex-row-reverse {
307
+ display: flex;
308
+ flex-direction: row-reverse;
309
+ --_flex-direction: row;
310
+ }
311
+ .sm-flex-col-reverse {
312
+ display: flex;
313
+ flex-direction: column-reverse;
314
+ --_flex-direction: column;
315
+ }
316
+ }
317
+ @container (min-width: 48rem) {
318
+ .md-flex {
319
+ display: flex;
320
+ }
321
+ .md-flex-row {
322
+ display: flex;
323
+ flex-direction: row;
324
+ --_flex-direction: row;
325
+ }
326
+ .md-flex-col {
327
+ display: flex;
328
+ flex-direction: column;
329
+ --_flex-direction: column;
330
+ }
331
+ .md-flex-row-reverse {
332
+ display: flex;
333
+ flex-direction: row-reverse;
334
+ --_flex-direction: row;
335
+ }
336
+ .md-flex-col-reverse {
337
+ display: flex;
338
+ flex-direction: column-reverse;
339
+ --_flex-direction: column;
340
+ }
341
+ }
342
+ @container (min-width: 64rem) {
343
+ .lg-flex {
344
+ display: flex;
345
+ }
346
+ .lg-flex-row {
347
+ display: flex;
348
+ flex-direction: row;
349
+ --_flex-direction: row;
350
+ }
351
+ .lg-flex-col {
352
+ display: flex;
353
+ flex-direction: column;
354
+ --_flex-direction: column;
355
+ }
356
+ .lg-flex-row-reverse {
357
+ display: flex;
358
+ flex-direction: row-reverse;
359
+ --_flex-direction: row;
360
+ }
361
+ .lg-flex-col-reverse {
362
+ display: flex;
363
+ flex-direction: column-reverse;
364
+ --_flex-direction: column;
365
+ }
366
+ }
367
+ @container (min-width: 80rem) {
368
+ .xl-flex {
369
+ display: flex;
370
+ }
371
+ .xl-flex-row {
372
+ display: flex;
373
+ flex-direction: row;
374
+ --_flex-direction: row;
375
+ }
376
+ .xl-flex-col {
377
+ display: flex;
378
+ flex-direction: column;
379
+ --_flex-direction: column;
380
+ }
381
+ .xl-flex-row-reverse {
382
+ display: flex;
383
+ flex-direction: row-reverse;
384
+ --_flex-direction: row;
385
+ }
386
+ .xl-flex-col-reverse {
387
+ display: flex;
388
+ flex-direction: column-reverse;
389
+ --_flex-direction: column;
390
+ }
391
+ }
392
+
393
+ @container (min-width: 30rem) {
394
+ .sm-split-1-2 {
395
+ flex-direction: row;
396
+ --_split-a: 1;
397
+ --_split-b: 2;
398
+ }
399
+ .sm-split-2-1 {
400
+ flex-direction: row;
401
+ --_split-a: 2;
402
+ --_split-b: 1;
403
+ }
404
+ .sm-split-1-3 {
405
+ flex-direction: row;
406
+ --_split-a: 1;
407
+ --_split-b: 3;
408
+ }
409
+ .sm-split-3-1 {
410
+ flex-direction: row;
411
+ --_split-a: 3;
412
+ --_split-b: 1;
413
+ }
414
+ .sm-split-1-4 {
415
+ flex-direction: row;
416
+ --_split-a: 1;
417
+ --_split-b: 4;
418
+ }
419
+ .sm-split-4-1 {
420
+ flex-direction: row;
421
+ --_split-a: 4;
422
+ --_split-b: 1;
423
+ }
424
+ .sm-split-2-3 {
425
+ flex-direction: row;
426
+ --_split-a: 2;
427
+ --_split-b: 3;
428
+ }
429
+ .sm-split-3-2 {
430
+ flex-direction: row;
431
+ --_split-a: 3;
432
+ --_split-b: 2;
433
+ }
434
+ .sm-split-reverse {
435
+ reading-flow: flex-visual;
436
+ }
437
+ .sm-split-reverse > :first-child {
438
+ order: 1;
439
+ }
440
+ }
441
+ @container (min-width: 48rem) {
442
+ .md-split-1-2 {
443
+ flex-direction: row;
444
+ --_split-a: 1;
445
+ --_split-b: 2;
446
+ }
447
+ .md-split-2-1 {
448
+ flex-direction: row;
449
+ --_split-a: 2;
450
+ --_split-b: 1;
451
+ }
452
+ .md-split-1-3 {
453
+ flex-direction: row;
454
+ --_split-a: 1;
455
+ --_split-b: 3;
456
+ }
457
+ .md-split-3-1 {
458
+ flex-direction: row;
459
+ --_split-a: 3;
460
+ --_split-b: 1;
461
+ }
462
+ .md-split-1-4 {
463
+ flex-direction: row;
464
+ --_split-a: 1;
465
+ --_split-b: 4;
466
+ }
467
+ .md-split-4-1 {
468
+ flex-direction: row;
469
+ --_split-a: 4;
470
+ --_split-b: 1;
471
+ }
472
+ .md-split-2-3 {
473
+ flex-direction: row;
474
+ --_split-a: 2;
475
+ --_split-b: 3;
476
+ }
477
+ .md-split-3-2 {
478
+ flex-direction: row;
479
+ --_split-a: 3;
480
+ --_split-b: 2;
481
+ }
482
+ .md-split-reverse {
483
+ reading-flow: flex-visual;
484
+ }
485
+ .md-split-reverse > :first-child {
486
+ order: 1;
487
+ }
488
+ }
489
+ @container (min-width: 64rem) {
490
+ .lg-split-1-2 {
491
+ flex-direction: row;
492
+ --_split-a: 1;
493
+ --_split-b: 2;
494
+ }
495
+ .lg-split-2-1 {
496
+ flex-direction: row;
497
+ --_split-a: 2;
498
+ --_split-b: 1;
499
+ }
500
+ .lg-split-1-3 {
501
+ flex-direction: row;
502
+ --_split-a: 1;
503
+ --_split-b: 3;
504
+ }
505
+ .lg-split-3-1 {
506
+ flex-direction: row;
507
+ --_split-a: 3;
508
+ --_split-b: 1;
509
+ }
510
+ .lg-split-1-4 {
511
+ flex-direction: row;
512
+ --_split-a: 1;
513
+ --_split-b: 4;
514
+ }
515
+ .lg-split-4-1 {
516
+ flex-direction: row;
517
+ --_split-a: 4;
518
+ --_split-b: 1;
519
+ }
520
+ .lg-split-2-3 {
521
+ flex-direction: row;
522
+ --_split-a: 2;
523
+ --_split-b: 3;
524
+ }
525
+ .lg-split-3-2 {
526
+ flex-direction: row;
527
+ --_split-a: 3;
528
+ --_split-b: 2;
529
+ }
530
+ .lg-split-reverse {
531
+ reading-flow: flex-visual;
532
+ }
533
+ .lg-split-reverse > :first-child {
534
+ order: 1;
535
+ }
536
+ }
537
+ @container (min-width: 80rem) {
538
+ .xl-split-1-2 {
539
+ flex-direction: row;
540
+ --_split-a: 1;
541
+ --_split-b: 2;
542
+ }
543
+ .xl-split-2-1 {
544
+ flex-direction: row;
545
+ --_split-a: 2;
546
+ --_split-b: 1;
547
+ }
548
+ .xl-split-1-3 {
549
+ flex-direction: row;
550
+ --_split-a: 1;
551
+ --_split-b: 3;
552
+ }
553
+ .xl-split-3-1 {
554
+ flex-direction: row;
555
+ --_split-a: 3;
556
+ --_split-b: 1;
557
+ }
558
+ .xl-split-1-4 {
559
+ flex-direction: row;
560
+ --_split-a: 1;
561
+ --_split-b: 4;
562
+ }
563
+ .xl-split-4-1 {
564
+ flex-direction: row;
565
+ --_split-a: 4;
566
+ --_split-b: 1;
567
+ }
568
+ .xl-split-2-3 {
569
+ flex-direction: row;
570
+ --_split-a: 2;
571
+ --_split-b: 3;
572
+ }
573
+ .xl-split-3-2 {
574
+ flex-direction: row;
575
+ --_split-a: 3;
576
+ --_split-b: 2;
577
+ }
578
+ .xl-split-reverse {
579
+ reading-flow: flex-visual;
580
+ }
581
+ .xl-split-reverse > :first-child {
582
+ order: 1;
583
+ }
584
+ }
585
+
586
+ /* ── Alignment (flex parents) + text-align. Bare classes, then shared tiers.
587
+ Names mirror Tailwind: items-* (align-items), justify-* (justify-content),
588
+ text-* (text-align). ── */
589
+ .items-start {
590
+ align-items: flex-start;
591
+ }
592
+ .items-center {
593
+ align-items: center;
594
+ }
595
+ .items-end {
596
+ align-items: flex-end;
597
+ }
598
+ .items-stretch {
599
+ align-items: stretch;
600
+ }
601
+
602
+ .justify-start {
603
+ justify-content: flex-start;
604
+ }
605
+ .justify-center {
606
+ justify-content: center;
607
+ }
608
+ .justify-end {
609
+ justify-content: flex-end;
610
+ }
611
+ .justify-between {
612
+ justify-content: space-between;
613
+ }
614
+
615
+ .text-start {
616
+ text-align: start;
617
+ }
618
+ .text-center {
619
+ text-align: center;
620
+ }
621
+ .text-end {
622
+ text-align: end;
623
+ }
624
+
625
+ @container (min-width: 30rem) {
626
+ .sm-items-start {
627
+ align-items: flex-start;
628
+ }
629
+ .sm-items-center {
630
+ align-items: center;
631
+ }
632
+ .sm-items-end {
633
+ align-items: flex-end;
634
+ }
635
+ .sm-items-stretch {
636
+ align-items: stretch;
637
+ }
638
+ .sm-justify-start {
639
+ justify-content: flex-start;
640
+ }
641
+ .sm-justify-center {
642
+ justify-content: center;
643
+ }
644
+ .sm-justify-end {
645
+ justify-content: flex-end;
646
+ }
647
+ .sm-justify-between {
648
+ justify-content: space-between;
649
+ }
650
+ .sm-text-start {
651
+ text-align: start;
652
+ }
653
+ .sm-text-center {
654
+ text-align: center;
655
+ }
656
+ .sm-text-end {
657
+ text-align: end;
658
+ }
659
+ }
660
+ @container (min-width: 48rem) {
661
+ .md-items-start {
662
+ align-items: flex-start;
663
+ }
664
+ .md-items-center {
665
+ align-items: center;
666
+ }
667
+ .md-items-end {
668
+ align-items: flex-end;
669
+ }
670
+ .md-items-stretch {
671
+ align-items: stretch;
672
+ }
673
+ .md-justify-start {
674
+ justify-content: flex-start;
675
+ }
676
+ .md-justify-center {
677
+ justify-content: center;
678
+ }
679
+ .md-justify-end {
680
+ justify-content: flex-end;
681
+ }
682
+ .md-justify-between {
683
+ justify-content: space-between;
684
+ }
685
+ .md-text-start {
686
+ text-align: start;
687
+ }
688
+ .md-text-center {
689
+ text-align: center;
690
+ }
691
+ .md-text-end {
692
+ text-align: end;
693
+ }
694
+ }
695
+ @container (min-width: 64rem) {
696
+ .lg-items-start {
697
+ align-items: flex-start;
698
+ }
699
+ .lg-items-center {
700
+ align-items: center;
701
+ }
702
+ .lg-items-end {
703
+ align-items: flex-end;
704
+ }
705
+ .lg-items-stretch {
706
+ align-items: stretch;
707
+ }
708
+ .lg-justify-start {
709
+ justify-content: flex-start;
710
+ }
711
+ .lg-justify-center {
712
+ justify-content: center;
713
+ }
714
+ .lg-justify-end {
715
+ justify-content: flex-end;
716
+ }
717
+ .lg-justify-between {
718
+ justify-content: space-between;
719
+ }
720
+ .lg-text-start {
721
+ text-align: start;
722
+ }
723
+ .lg-text-center {
724
+ text-align: center;
725
+ }
726
+ .lg-text-end {
727
+ text-align: end;
728
+ }
729
+ }
730
+ @container (min-width: 80rem) {
731
+ .xl-items-start {
732
+ align-items: flex-start;
733
+ }
734
+ .xl-items-center {
735
+ align-items: center;
736
+ }
737
+ .xl-items-end {
738
+ align-items: flex-end;
739
+ }
740
+ .xl-items-stretch {
741
+ align-items: stretch;
742
+ }
743
+ .xl-justify-start {
744
+ justify-content: flex-start;
745
+ }
746
+ .xl-justify-center {
747
+ justify-content: center;
748
+ }
749
+ .xl-justify-end {
750
+ justify-content: flex-end;
751
+ }
752
+ .xl-justify-between {
753
+ justify-content: space-between;
754
+ }
755
+ .xl-text-start {
756
+ text-align: start;
757
+ }
758
+ .xl-text-center {
759
+ text-align: center;
760
+ }
761
+ .xl-text-end {
762
+ text-align: end;
763
+ }
764
+ }