@wpmoo/ui 2.1.1 → 2.3.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.
Files changed (41) hide show
  1. package/README.md +49 -2
  2. package/THIRD_PARTY_NOTICES.md +1 -1
  3. package/certification.json +3 -1
  4. package/dist/assets/css/moo-ui.css +429 -1
  5. package/dist/assets/css/moo-ui.min.css +2 -2
  6. package/dist/assets/css/moo.css +349 -1
  7. package/dist/assets/css/moo.min.css +2 -2
  8. package/dist/js/chart.js +1 -1
  9. package/dist/js/chart.min.js +1 -1
  10. package/dist/js/combobox.js +1 -1
  11. package/dist/js/consent.js +342 -0
  12. package/dist/js/context-menu.js +1 -1
  13. package/dist/js/datatable.js +1 -1
  14. package/dist/js/datepicker.js +1 -1
  15. package/dist/js/datepicker.min.js +1 -1
  16. package/dist/js/floating-panel.js +1 -1
  17. package/dist/js/image-gallery.js +247 -0
  18. package/dist/js/moo-ui.js +561 -4
  19. package/dist/js/moo-ui.min.js +2 -2
  20. package/dist/js/overlay-scrollbar.js +1 -1
  21. package/dist/js/password-requirements.js +1 -1
  22. package/dist/js/sheet.js +1 -1
  23. package/dist/js/sidebar.js +1 -1
  24. package/dist/js/slider.js +1 -1
  25. package/dist/js/state.js +1 -1
  26. package/dist/js/table-of-contents.js +1 -1
  27. package/dist/js/toc.js +1 -1
  28. package/dist/release-manifest.json +4 -4
  29. package/package.json +5 -1
  30. package/scss/_components.scss +2 -0
  31. package/scss/components/_gallery.scss +73 -0
  32. package/scss/components/_item.scss +96 -0
  33. package/scss/foundations/_globals.scss +1 -0
  34. package/scss/foundations/_scope.scss +2 -0
  35. package/scss/mixins/_banner.scss +1 -1
  36. package/scss/moo-core.scss +1 -0
  37. package/scss/moo-ui.scss +2 -0
  38. package/scss/settings/_component_variables.scss +8 -0
  39. package/scss/utilities/_gallery.scss +25 -0
  40. package/scss/utilities/_motion.scss +5 -0
  41. package/scss/utilities/_motion_primitives.scss +10 -0
package/README.md CHANGED
@@ -195,6 +195,41 @@ application-owned, account-specific key when appropriate. This is a local UI
195
195
  preference, not authorization or server-side task state. See the
196
196
  [Card example](https://ui.wpmoo.org/components/card/#floating-panel) for markup.
197
197
 
198
+ For the Image Gallery block, bind its lightbox after Bootstrap's Modal and
199
+ Carousel are available on the document's window:
200
+
201
+ ```js
202
+ import { initImageGalleries } from "@wpmoo/ui/image-gallery.js";
203
+ const release = initImageGalleries(document);
204
+ // release(); // remove the listeners again
205
+ ```
206
+
207
+ Without the module every thumbnail still links to its large image. With it the
208
+ lightbox opens at the clicked photo, keeps the counter and caption current,
209
+ runs the slideshow and full-screen buttons, adds arrow keys and loads only the
210
+ current photo and its neighbours. See the
211
+ [Image Gallery block](https://ui.wpmoo.org/blocks/image-gallery/) for markup.
212
+
213
+ For the Consent block, bind the card once per document. Gated scripts,
214
+ frames and images carry `data-consent-category` and `data-consent-src` and
215
+ are activated only after their category is granted:
216
+
217
+ ```js
218
+ import { initConsent } from "@wpmoo/ui/consent.js";
219
+ const consent = initConsent(document);
220
+ consent?.whenGranted("statistics", () => loadStatistics());
221
+ document.addEventListener("moo:consent:change", (event) => console.log(event.detail.choices));
222
+ ```
223
+
224
+ Without the module the card stays hidden and nothing optional loads. The
225
+ choice is stored in a first-party cookie with the configuration revision and
226
+ a time stamp; `consentRevision(categories, reask)` computes that revision.
227
+ Adding or removing a category or service asks again; for a material change
228
+ to a service's provider, purpose or storage, raise `reask`. Withdrawal removes
229
+ declared first-party cookies on the root path and storage keys; cookies set on
230
+ another path or by another host cannot be removed by the page.
231
+ See the [Consent block](https://ui.wpmoo.org/blocks/consent/) for markup.
232
+
198
233
  For an opt-in document overlay scrollbar, load the stylesheet first and pass
199
234
  the resolved page theme owner explicitly:
200
235
 
@@ -275,6 +310,18 @@ calm.
275
310
 
276
311
  ## Status And Support
277
312
 
313
+ The `2.3.0` minor release adds the Consent block: a first-visit consent card
314
+ with categories and services, a settings trigger, an embed placeholder and a
315
+ policy table, with the optional `@wpmoo/ui/consent.js` module that stores the
316
+ choice in a first-party cookie and loads gated scripts, frames and images only
317
+ after consent. Accordion items gain an optional action beside the trigger.
318
+
319
+ The `2.2.0` minor release adds the Item component, Image Gallery and Video
320
+ Dialog blocks, and component usage guides. Image Gallery includes five layouts,
321
+ a lazy-loaded lightbox, slideshow and full-screen controls through the optional
322
+ `@wpmoo/ui/image-gallery.js` module. The catalog adds structured metadata,
323
+ content-derived page dates and a browsable sitemap.
324
+
278
325
  The `2.1.1` patch release improves Chart tooltips, DataTable sorting
279
326
  and selection, Combobox input, Context Menu disposal, Date Picker controls,
280
327
  and Sidebar keyboard navigation. Page titles follow their owner heading weight.
@@ -307,7 +354,7 @@ paths live in the [Installation guide](https://ui.wpmoo.org/installation/).
307
354
  Moo UI source code is MIT licensed. License details live in
308
355
  [LICENSE](LICENSE) and the [License page](https://ui.wpmoo.org/license/).
309
356
  Third-party distribution details and notices are kept separately in
310
- [THIRD_PARTY_NOTICES.md](https://github.com/wpmoo-org/ui/blob/v2.1.1/THIRD_PARTY_NOTICES.md).
357
+ [THIRD_PARTY_NOTICES.md](https://github.com/wpmoo-org/ui/blob/v2.3.0/THIRD_PARTY_NOTICES.md).
311
358
  Catalog visual assets and their license are repository-only and are not
312
359
  included in the npm package. Asset terms live in the
313
- [visual asset license](https://github.com/wpmoo-org/ui/blob/v2.1.1/ASSET_LICENSE.md).
360
+ [visual asset license](https://github.com/wpmoo-org/ui/blob/v2.3.0/ASSET_LICENSE.md).
@@ -83,5 +83,5 @@ The catalog serves its native ESM file and unchanged license separately under
83
83
  WPMoo-generated visual assets, including image assets under `site/static/images/`,
84
84
  are original WPMoo work and are not licensed under MIT unless explicitly
85
85
  stated. See the
86
- [repository visual asset license](https://github.com/wpmoo-org/ui/blob/v2.1.1/ASSET_LICENSE.md).
86
+ [repository visual asset license](https://github.com/wpmoo-org/ui/blob/v2.3.0/ASSET_LICENSE.md).
87
87
  These assets and their license file are not included in the npm package.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "0.1",
3
3
  "status": "preview",
4
- "coreVersion": "2.1.1",
4
+ "coreVersion": "2.3.0",
5
5
  "bootstrap": {
6
6
  "canonicalVersion": "5.3.3",
7
7
  "targetRange": ">=5.3.0 <5.4",
@@ -34,6 +34,8 @@
34
34
  "./table-of-contents.js",
35
35
  "./sheet.js",
36
36
  "./floating-panel.js",
37
+ "./image-gallery.js",
38
+ "./consent.js",
37
39
  "./chart.js",
38
40
  "./chart.min.js",
39
41
  "./datepicker.js",
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Moo UI v2.1.1 (https://wpmoo.org/)
2
+ * Moo UI v2.3.0 (https://wpmoo.org/)
3
3
  * Copyright 2026 WPMoo Authors
4
4
  * Licensed under MIT (https://github.com/wpmoo-org/ui/blob/main/LICENSE)
5
5
  *
@@ -4238,6 +4238,10 @@ progress {
4238
4238
  --bs-aspect-ratio: calc(9 / 21 * 100%);
4239
4239
  }
4240
4240
 
4241
+ .ratio-3x2 {
4242
+ --bs-aspect-ratio: calc(2 / 3 * 100%);
4243
+ }
4244
+
4241
4245
  .fixed-top {
4242
4246
  position: fixed;
4243
4247
  top: 0;
@@ -6360,6 +6364,22 @@ progress {
6360
6364
  z-index: 3 !important;
6361
6365
  }
6362
6366
 
6367
+ .columns-1 {
6368
+ column-count: 1 !important;
6369
+ }
6370
+
6371
+ .columns-2 {
6372
+ column-count: 2 !important;
6373
+ }
6374
+
6375
+ .columns-3 {
6376
+ column-count: 3 !important;
6377
+ }
6378
+
6379
+ .columns-4 {
6380
+ column-count: 4 !important;
6381
+ }
6382
+
6363
6383
  @media (min-width: 576px) {
6364
6384
  .float-sm-start {
6365
6385
  float: left !important;
@@ -6909,6 +6929,18 @@ progress {
6909
6929
  .text-sm-center {
6910
6930
  text-align: center !important;
6911
6931
  }
6932
+ .columns-sm-1 {
6933
+ column-count: 1 !important;
6934
+ }
6935
+ .columns-sm-2 {
6936
+ column-count: 2 !important;
6937
+ }
6938
+ .columns-sm-3 {
6939
+ column-count: 3 !important;
6940
+ }
6941
+ .columns-sm-4 {
6942
+ column-count: 4 !important;
6943
+ }
6912
6944
  }
6913
6945
 
6914
6946
  @media (min-width: 768px) {
@@ -7460,6 +7492,18 @@ progress {
7460
7492
  .text-md-center {
7461
7493
  text-align: center !important;
7462
7494
  }
7495
+ .columns-md-1 {
7496
+ column-count: 1 !important;
7497
+ }
7498
+ .columns-md-2 {
7499
+ column-count: 2 !important;
7500
+ }
7501
+ .columns-md-3 {
7502
+ column-count: 3 !important;
7503
+ }
7504
+ .columns-md-4 {
7505
+ column-count: 4 !important;
7506
+ }
7463
7507
  }
7464
7508
 
7465
7509
  @media (min-width: 992px) {
@@ -8011,6 +8055,18 @@ progress {
8011
8055
  .text-lg-center {
8012
8056
  text-align: center !important;
8013
8057
  }
8058
+ .columns-lg-1 {
8059
+ column-count: 1 !important;
8060
+ }
8061
+ .columns-lg-2 {
8062
+ column-count: 2 !important;
8063
+ }
8064
+ .columns-lg-3 {
8065
+ column-count: 3 !important;
8066
+ }
8067
+ .columns-lg-4 {
8068
+ column-count: 4 !important;
8069
+ }
8014
8070
  }
8015
8071
 
8016
8072
  @media (min-width: 1200px) {
@@ -8562,6 +8618,18 @@ progress {
8562
8618
  .text-xl-center {
8563
8619
  text-align: center !important;
8564
8620
  }
8621
+ .columns-xl-1 {
8622
+ column-count: 1 !important;
8623
+ }
8624
+ .columns-xl-2 {
8625
+ column-count: 2 !important;
8626
+ }
8627
+ .columns-xl-3 {
8628
+ column-count: 3 !important;
8629
+ }
8630
+ .columns-xl-4 {
8631
+ column-count: 4 !important;
8632
+ }
8565
8633
  }
8566
8634
 
8567
8635
  @media (min-width: 1400px) {
@@ -9113,6 +9181,18 @@ progress {
9113
9181
  .text-xxl-center {
9114
9182
  text-align: center !important;
9115
9183
  }
9184
+ .columns-xxl-1 {
9185
+ column-count: 1 !important;
9186
+ }
9187
+ .columns-xxl-2 {
9188
+ column-count: 2 !important;
9189
+ }
9190
+ .columns-xxl-3 {
9191
+ column-count: 3 !important;
9192
+ }
9193
+ .columns-xxl-4 {
9194
+ column-count: 4 !important;
9195
+ }
9116
9196
  }
9117
9197
 
9118
9198
  @media (min-width: 1200px) {
@@ -9226,6 +9306,16 @@ progress {
9226
9306
  }
9227
9307
  }
9228
9308
 
9309
+ @keyframes moo-breathe {
9310
+ 0%,
9311
+ 100% {
9312
+ transform: scale(0.9);
9313
+ }
9314
+ 50% {
9315
+ transform: scale(1);
9316
+ }
9317
+ }
9318
+
9229
9319
  html.scrollbar-overlay-native {
9230
9320
  scrollbar-width: none;
9231
9321
  }
@@ -13394,6 +13484,86 @@ label.btn {
13394
13484
  gap: 0.5rem;
13395
13485
  }
13396
13486
 
13487
+ /* Item */
13488
+ .item {
13489
+ display: flex;
13490
+ flex-wrap: wrap;
13491
+ align-items: center;
13492
+ gap: 1rem;
13493
+ min-width: 0;
13494
+ padding: 0.75rem 1rem;
13495
+ color: var(--bs-body-color);
13496
+ text-decoration: none;
13497
+ border: var(--bs-border-width) solid transparent;
13498
+ border-radius: var(--bs-border-radius-lg);
13499
+ }
13500
+ .item-outline {
13501
+ border-color: var(--bs-border-color);
13502
+ }
13503
+ .item-muted {
13504
+ background-color: var(--bs-tertiary-bg);
13505
+ }
13506
+ .item-sm {
13507
+ gap: 0.75rem;
13508
+ padding: 0.5rem 0.75rem;
13509
+ }
13510
+ a.item:hover {
13511
+ color: var(--bs-body-color);
13512
+ background-color: var(--bs-tertiary-bg);
13513
+ }
13514
+ .item-media {
13515
+ display: flex;
13516
+ flex-shrink: 0;
13517
+ align-items: center;
13518
+ justify-content: center;
13519
+ align-self: flex-start;
13520
+ }
13521
+ .item-media-icon {
13522
+ width: 2.35547rem;
13523
+ height: 2.35547rem;
13524
+ color: var(--bs-body-color);
13525
+ background-color: var(--bs-tertiary-bg);
13526
+ border: var(--bs-border-width) solid var(--bs-border-color);
13527
+ border-radius: var(--bs-border-radius);
13528
+ }
13529
+ .item-media-icon > [data-icon] {
13530
+ width: 1rem;
13531
+ height: 1rem;
13532
+ }
13533
+ .item-content {
13534
+ display: flex;
13535
+ flex: 1 1 0;
13536
+ flex-direction: column;
13537
+ gap: 0.25rem;
13538
+ min-width: 0;
13539
+ }
13540
+ .item-title {
13541
+ margin: 0;
13542
+ font-size: 0.76562rem;
13543
+ font-weight: 500;
13544
+ line-height: 1.25;
13545
+ }
13546
+ .item-description {
13547
+ margin: 0;
13548
+ font-size: 0.76562rem;
13549
+ line-height: 1.5;
13550
+ color: var(--bs-secondary-color);
13551
+ }
13552
+ .item-actions {
13553
+ display: flex;
13554
+ flex-wrap: wrap;
13555
+ align-items: center;
13556
+ gap: 0.5rem;
13557
+ }
13558
+ .item-group {
13559
+ display: flex;
13560
+ flex-direction: column;
13561
+ gap: 0.5rem;
13562
+ padding: 0;
13563
+ margin: 0;
13564
+ list-style: none;
13565
+ }
13566
+
13397
13567
  /* Table */
13398
13568
  .card .table {
13399
13569
  --bs-table-bg: transparent;
@@ -16827,6 +16997,174 @@ label.btn {
16827
16997
  .datatable--release-review {
16828
16998
  --moo-datatable-min-width: 64rem;
16829
16999
  }
17000
+ .gallery-justified {
17001
+ --moo-gallery-row-height: 6rem;
17002
+ display: flex;
17003
+ flex-wrap: wrap;
17004
+ }
17005
+ @media (min-width: 768px) {
17006
+ .gallery-justified {
17007
+ --moo-gallery-row-height: 8rem;
17008
+ }
17009
+ }
17010
+ .gallery-justified > * {
17011
+ flex: var(--moo-gallery-ratio, 1) 1 calc(var(--moo-gallery-ratio, 1) * var(--moo-gallery-row-height));
17012
+ aspect-ratio: var(--moo-gallery-ratio, 1);
17013
+ }
17014
+ .gallery-justified::after {
17015
+ flex-grow: 1e9;
17016
+ content: "";
17017
+ }
17018
+ .gallery-stage {
17019
+ height: min(62svh, 38rem);
17020
+ }
17021
+ .gallery-strip {
17022
+ display: flex;
17023
+ --moo-gallery-strip-height: 13rem;
17024
+ flex-wrap: nowrap;
17025
+ overflow-x: auto;
17026
+ scroll-snap-type: x proximity;
17027
+ contain: inline-size;
17028
+ }
17029
+ .gallery-strip > * {
17030
+ flex: none;
17031
+ width: calc(var(--moo-gallery-ratio, 1) * var(--moo-gallery-strip-height));
17032
+ max-width: 85%;
17033
+ height: var(--moo-gallery-strip-height);
17034
+ scroll-snap-align: start;
17035
+ }
17036
+ .gallery-strip::after {
17037
+ content: none;
17038
+ }
17039
+ .gallery-strip.gallery-strip-bleed {
17040
+ margin-inline: calc(-1 * var(--moo-gallery-strip-bleed, 0.75rem));
17041
+ padding-inline: var(--moo-gallery-strip-bleed, 0.75rem);
17042
+ scroll-padding-inline: var(--moo-gallery-strip-bleed, 0.75rem);
17043
+ }
17044
+ @media (max-width: 575.98px) {
17045
+ .gallery-strip-sm-down {
17046
+ --moo-gallery-strip-height: 13rem;
17047
+ flex-wrap: nowrap;
17048
+ overflow-x: auto;
17049
+ scroll-snap-type: x proximity;
17050
+ contain: inline-size;
17051
+ }
17052
+ .gallery-strip-sm-down > * {
17053
+ flex: none;
17054
+ width: calc(var(--moo-gallery-ratio, 1) * var(--moo-gallery-strip-height));
17055
+ max-width: 85%;
17056
+ height: var(--moo-gallery-strip-height);
17057
+ scroll-snap-align: start;
17058
+ }
17059
+ .gallery-strip-sm-down::after {
17060
+ content: none;
17061
+ }
17062
+ .gallery-strip-sm-down.gallery-strip-bleed {
17063
+ margin-inline: calc(-1 * var(--moo-gallery-strip-bleed, 0.75rem));
17064
+ padding-inline: var(--moo-gallery-strip-bleed, 0.75rem);
17065
+ scroll-padding-inline: var(--moo-gallery-strip-bleed, 0.75rem);
17066
+ }
17067
+ }
17068
+ @media (max-width: 767.98px) {
17069
+ .gallery-strip-md-down {
17070
+ --moo-gallery-strip-height: 13rem;
17071
+ flex-wrap: nowrap;
17072
+ overflow-x: auto;
17073
+ scroll-snap-type: x proximity;
17074
+ contain: inline-size;
17075
+ }
17076
+ .gallery-strip-md-down > * {
17077
+ flex: none;
17078
+ width: calc(var(--moo-gallery-ratio, 1) * var(--moo-gallery-strip-height));
17079
+ max-width: 85%;
17080
+ height: var(--moo-gallery-strip-height);
17081
+ scroll-snap-align: start;
17082
+ }
17083
+ .gallery-strip-md-down::after {
17084
+ content: none;
17085
+ }
17086
+ .gallery-strip-md-down.gallery-strip-bleed {
17087
+ margin-inline: calc(-1 * var(--moo-gallery-strip-bleed, 0.75rem));
17088
+ padding-inline: var(--moo-gallery-strip-bleed, 0.75rem);
17089
+ scroll-padding-inline: var(--moo-gallery-strip-bleed, 0.75rem);
17090
+ }
17091
+ }
17092
+ @media (max-width: 991.98px) {
17093
+ .gallery-strip-lg-down {
17094
+ --moo-gallery-strip-height: 13rem;
17095
+ flex-wrap: nowrap;
17096
+ overflow-x: auto;
17097
+ scroll-snap-type: x proximity;
17098
+ contain: inline-size;
17099
+ }
17100
+ .gallery-strip-lg-down > * {
17101
+ flex: none;
17102
+ width: calc(var(--moo-gallery-ratio, 1) * var(--moo-gallery-strip-height));
17103
+ max-width: 85%;
17104
+ height: var(--moo-gallery-strip-height);
17105
+ scroll-snap-align: start;
17106
+ }
17107
+ .gallery-strip-lg-down::after {
17108
+ content: none;
17109
+ }
17110
+ .gallery-strip-lg-down.gallery-strip-bleed {
17111
+ margin-inline: calc(-1 * var(--moo-gallery-strip-bleed, 0.75rem));
17112
+ padding-inline: var(--moo-gallery-strip-bleed, 0.75rem);
17113
+ scroll-padding-inline: var(--moo-gallery-strip-bleed, 0.75rem);
17114
+ }
17115
+ }
17116
+ @media (max-width: 1199.98px) {
17117
+ .gallery-strip-xl-down {
17118
+ --moo-gallery-strip-height: 13rem;
17119
+ flex-wrap: nowrap;
17120
+ overflow-x: auto;
17121
+ scroll-snap-type: x proximity;
17122
+ contain: inline-size;
17123
+ }
17124
+ .gallery-strip-xl-down > * {
17125
+ flex: none;
17126
+ width: calc(var(--moo-gallery-ratio, 1) * var(--moo-gallery-strip-height));
17127
+ max-width: 85%;
17128
+ height: var(--moo-gallery-strip-height);
17129
+ scroll-snap-align: start;
17130
+ }
17131
+ .gallery-strip-xl-down::after {
17132
+ content: none;
17133
+ }
17134
+ .gallery-strip-xl-down.gallery-strip-bleed {
17135
+ margin-inline: calc(-1 * var(--moo-gallery-strip-bleed, 0.75rem));
17136
+ padding-inline: var(--moo-gallery-strip-bleed, 0.75rem);
17137
+ scroll-padding-inline: var(--moo-gallery-strip-bleed, 0.75rem);
17138
+ }
17139
+ }
17140
+ @media (max-width: 1399.98px) {
17141
+ .gallery-strip-xxl-down {
17142
+ --moo-gallery-strip-height: 13rem;
17143
+ flex-wrap: nowrap;
17144
+ overflow-x: auto;
17145
+ scroll-snap-type: x proximity;
17146
+ contain: inline-size;
17147
+ }
17148
+ .gallery-strip-xxl-down > * {
17149
+ flex: none;
17150
+ width: calc(var(--moo-gallery-ratio, 1) * var(--moo-gallery-strip-height));
17151
+ max-width: 85%;
17152
+ height: var(--moo-gallery-strip-height);
17153
+ scroll-snap-align: start;
17154
+ }
17155
+ .gallery-strip-xxl-down::after {
17156
+ content: none;
17157
+ }
17158
+ .gallery-strip-xxl-down.gallery-strip-bleed {
17159
+ margin-inline: calc(-1 * var(--moo-gallery-strip-bleed, 0.75rem));
17160
+ padding-inline: var(--moo-gallery-strip-bleed, 0.75rem);
17161
+ scroll-padding-inline: var(--moo-gallery-strip-bleed, 0.75rem);
17162
+ }
17163
+ }
17164
+ .gallery-progress {
17165
+ --bs-progress-height: var(--moo-gallery-progress-height, 0.25rem);
17166
+ opacity: var(--moo-gallery-progress-opacity, 0.08);
17167
+ }
16830
17168
 
16831
17169
  /* Focus and keyboard navigation */
16832
17170
  .form-label,
@@ -16970,6 +17308,91 @@ label.btn {
16970
17308
  text-align: center !important;
16971
17309
  }
16972
17310
  }
17311
+ .ratio-3x2 {
17312
+ --bs-aspect-ratio: calc(2 / 3 * 100%);
17313
+ }
17314
+ .columns-1 {
17315
+ column-count: 1 !important;
17316
+ }
17317
+ .columns-2 {
17318
+ column-count: 2 !important;
17319
+ }
17320
+ .columns-3 {
17321
+ column-count: 3 !important;
17322
+ }
17323
+ .columns-4 {
17324
+ column-count: 4 !important;
17325
+ }
17326
+ @media (min-width: 576px) {
17327
+ .columns-sm-1 {
17328
+ column-count: 1 !important;
17329
+ }
17330
+ .columns-sm-2 {
17331
+ column-count: 2 !important;
17332
+ }
17333
+ .columns-sm-3 {
17334
+ column-count: 3 !important;
17335
+ }
17336
+ .columns-sm-4 {
17337
+ column-count: 4 !important;
17338
+ }
17339
+ }
17340
+ @media (min-width: 768px) {
17341
+ .columns-md-1 {
17342
+ column-count: 1 !important;
17343
+ }
17344
+ .columns-md-2 {
17345
+ column-count: 2 !important;
17346
+ }
17347
+ .columns-md-3 {
17348
+ column-count: 3 !important;
17349
+ }
17350
+ .columns-md-4 {
17351
+ column-count: 4 !important;
17352
+ }
17353
+ }
17354
+ @media (min-width: 992px) {
17355
+ .columns-lg-1 {
17356
+ column-count: 1 !important;
17357
+ }
17358
+ .columns-lg-2 {
17359
+ column-count: 2 !important;
17360
+ }
17361
+ .columns-lg-3 {
17362
+ column-count: 3 !important;
17363
+ }
17364
+ .columns-lg-4 {
17365
+ column-count: 4 !important;
17366
+ }
17367
+ }
17368
+ @media (min-width: 1200px) {
17369
+ .columns-xl-1 {
17370
+ column-count: 1 !important;
17371
+ }
17372
+ .columns-xl-2 {
17373
+ column-count: 2 !important;
17374
+ }
17375
+ .columns-xl-3 {
17376
+ column-count: 3 !important;
17377
+ }
17378
+ .columns-xl-4 {
17379
+ column-count: 4 !important;
17380
+ }
17381
+ }
17382
+ @media (min-width: 1400px) {
17383
+ .columns-xxl-1 {
17384
+ column-count: 1 !important;
17385
+ }
17386
+ .columns-xxl-2 {
17387
+ column-count: 2 !important;
17388
+ }
17389
+ .columns-xxl-3 {
17390
+ column-count: 3 !important;
17391
+ }
17392
+ .columns-xxl-4 {
17393
+ column-count: 4 !important;
17394
+ }
17395
+ }
16973
17396
  :where( .scroll-fade, .scroll-fade-y, .scroll-fade-x, .scroll-fade-t, .scroll-fade-b, .scroll-fade-l, .scroll-fade-r, .scroll-fade-s, .scroll-fade-e ) {
16974
17397
  --scroll-fade-size: min(12%, 2.5rem);
16975
17398
  --scroll-fade-reveal: 6rem;
@@ -17201,6 +17624,11 @@ label.btn {
17201
17624
  scroll-behavior: auto;
17202
17625
  }
17203
17626
  }
17627
+ @media (prefers-reduced-motion: no-preference) {
17628
+ .animate-breathe {
17629
+ animation: moo-breathe 2s ease-in-out infinite;
17630
+ }
17631
+ }
17204
17632
 
17205
17633
  /* Application layout */
17206
17634
  .sidebar {