diff --git a/.gitignore b/.gitignore index f271996..95cc91a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # --- Dépendances Composer --- -vendor/ +/vendor/ # --- Artefacts SASS --- .sass-cache/ diff --git a/assets/vendor/iconoir/iconoir.css b/assets/vendor/iconoir/iconoir.css new file mode 100644 index 0000000..0b9dd46 --- /dev/null +++ b/assets/vendor/iconoir/iconoir.css @@ -0,0 +1,22 @@ +/*! + * Iconoir + * Copyright (c) 2025 Luca Burgio - https://iconoir.com + * License - https://github.com/iconoir-icons/iconoir/blob/main/LICENSE (Code: MIT License) + * CSS file created by Till Esser (@Wiwaltill) and automated by Pascal Jufer (@paescuj) + */ + +*[class^='iconoir-']::before, +*[class*=' iconoir-']::before { + content: ' '; + display: block; + background: currentColor; + mask-size: cover; + -webkit-mask-size: cover; + width: 1em; + height: 1em; +} +*[class^='iconoir-'], +*[class*=' iconoir-'] { + display: inline-block; +} +.iconoir-accessibility-sign::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-accessibility-tech::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-accessibility::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-activity::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-adobe-after-effects::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-adobe-illustrator::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-adobe-indesign::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-adobe-lightroom::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-adobe-photoshop::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-adobe-xd::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-african-tree::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-agile::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-air-conditioner::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-airplane-helix-45deg::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-airplane-helix::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-airplane-off::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-airplane-rotation::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-airplane::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-airplay::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-alarm::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-album-carousel::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-album-list::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-album-open::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-album::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-bottom-box::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-center::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-horizontal-centers::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-horizontal-spacing::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-justify::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-left-box::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-right-box::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-top-box::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-vertical-centers::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-vertical-spacing::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-angle-tool::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-antenna-off::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-antenna-signal-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-antenna-signal::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-antenna::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-app-notification::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-app-store::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-app-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-apple-half::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-apple-imac-2021-side::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-apple-imac-2021::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-apple-mac::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-apple-shortcuts::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-apple-swift::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-apple-wallet::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-apple::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ar-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arc-3d-center-point::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arc-3d::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arcade::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-archery-match::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-archery::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-archive::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-area-search::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-archery::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down-left-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down-left-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down-right-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down-right-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-email-forward::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-enlarge-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-left-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-left-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-reduce-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-right-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-right-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-separate-vertical::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-separate::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-union-vertical::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-union::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up-left-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up-left-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up-right-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up-right-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrows-up-from-line::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-asana::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-asterisk::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-at-sign-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-at-sign::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-atom::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-attachment::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-augmented-reality::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-auto-flash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-avi-format::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-axes::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-backward-15-seconds::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-badge-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-balcony::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bank::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-barcode::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-basketball-field::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-basketball::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bathroom::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-battery-25::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-battery-50::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-battery-75::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-battery-charging::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-battery-empty::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-battery-full::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-battery-indicator::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-battery-slash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-battery-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bbq::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-beach-bag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bed-ready::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bed::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-behance-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-behance::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bell-notification::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bell-off::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bell::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bicycle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bin-full::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bin-half::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bin-minus-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bin-plus-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bin::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-binocular::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-birthday-cake::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bishop::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bitbucket::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bitcoin-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bitcoin-rotate-out::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bluetooth-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bluetooth::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bold-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bold::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bonfire::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-book-lock::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-book-stack::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-book::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bookmark-book::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bookmark-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bookmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-border-bl::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-border-bottom::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-border-br::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-border-inner::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-border-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-border-out::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-border-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-border-tl::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-border-top::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-border-tr::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bounce-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bounce-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bowling-ball::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-box-3d-center::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-box-3d-point::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-box-3d-three-points::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-box-iso::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-box::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-boxing-glove::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-brain-electricity::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-brain-research::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-brain-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-brain::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bread-slice::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bridge-3d::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bridge-surface::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bright-crown::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bright-star::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-brightness-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-brightness::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bubble-download::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bubble-income::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bubble-outcome::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bubble-search::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bubble-star::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bubble-upload::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bubble-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bubble-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bug::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-building::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bus-green::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bus-stop::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-c-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cable-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calculator::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-arrow-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-arrow-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-rotate::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-camera::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-candlestick-chart::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-car::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-card-lock::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-card-no-access::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-card-reader::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-card-shield::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-card-wallet::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cart-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cart-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cart-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cart::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cell-2x2::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cellar::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-center-align::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble-empty::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble-question::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble-translate::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-lines::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-minus-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-plus-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-check-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-check-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chocolate::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chromecast-active::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chromecast::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-church-side::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-church::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cigarette-slash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cinema-old::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-circle-spark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-city::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-clipboard-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-clock-rotate-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-clock::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-closed-captions-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-closet::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cloud-bookmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cloud-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cloud-desync::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cloud-download::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cloud-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cloud-sunny::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cloud-sync::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cloud-upload::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cloud-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cloud::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-code-brackets-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-code-brackets::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-code::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-codepen::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-coffee-cup::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-coin-slash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-coins-swap::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-coins::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-collage-frame::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-collapse::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-color-filter::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-color-picker::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-color-wheel::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-combine::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-commodity::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-community::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-comp-align-bottom::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-comp-align-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-comp-align-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-comp-align-top::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-compact-disc::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-compass::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-component::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-compress-lines::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-compress::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-computer::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-constrained-surface::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-consumable::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-contactless::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-control-slider::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cookie::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cooling-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-copy::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-copyright::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-corner-bottom-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-corner-bottom-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-corner-top-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-corner-top-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cpu-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cpu::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cracked-egg::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-creative-commons::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-credit-card-slash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-credit-card::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-credit-cards::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-crib::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-crop-rotate-bl::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-crop-rotate-br::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-crop-rotate-tl::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-crop-rotate-tr::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-crop::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-crown-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-crown::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-css3::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cube-bandage::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cube-cut-with-curve::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cube-dots::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cube-hole::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cube-replace-face::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cube-scan::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cube::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cursor-pointer::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-curve-array::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cut::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cutlery::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cycling::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cylinder::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dash-flag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dashboard-dots::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dashboard-speed::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dashboard::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-data-transfer-both::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-data-transfer-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-data-transfer-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-data-transfer-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-data-transfer-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-backup::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-export::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-monitor::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-restore::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-script-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-script-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-script::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-search::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-settings::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-star::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-stats::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-de-compress::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-delivery-truck::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-delivery::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-depth::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-design-nib::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-design-pencil::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-desk::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-developer::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dew-point::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dialpad::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-diameter::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dice-five::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dice-four::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dice-one::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dice-six::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dice-three::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dice-two::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dimmer-switch::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-director-chair::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-discord::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dishwasher::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-display-4k::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-divide-three::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-divide::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dna::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dns::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-doc-magnifying-glass-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-doc-magnifying-glass::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-doc-star-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-doc-star::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dogecoin-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dogecoin-rotate-out::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dollar-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dollar::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-domotic-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-donate::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dot-arrow-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dot-arrow-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dot-arrow-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dot-arrow-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dots-grid-3x3::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-double-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-download-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-download-data-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-download-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-download::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-drag-hand-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-drag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-drawer::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dribbble::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-drone-charge-full::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-drone-charge-half::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-drone-charge-low::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-drone-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-drone-landing::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-drone-refresh::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-drone-take-off::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-drone-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-drone::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-droplet-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-droplet-half::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-droplet-snow-flake-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-droplet::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ease-curve-control-points::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ease-in-control-point::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ease-in-out::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ease-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ease-out-control-point::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ease-out::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ecology-book::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-edit-pencil::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-edit::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-egg::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-eject::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-electronics-chip::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-electronics-transistor::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-elevator::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ellipse-3d-three-points::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ellipse-3d::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-ball::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-blink-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-blink-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-look-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-look-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-look-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-look-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-puzzled::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-quite::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-really::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-sad::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-satisfied::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-sing-left-note::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-sing-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-sing-right-note::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-sing-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-surprise-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-surprise::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-talking-angry::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-talking-happy::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-think-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji-think-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-emoji::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-empty-page::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-energy-usage-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-enlarge::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-erase::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ethereum-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ethereum-rotate-out::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-euro-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-euro::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ev-charge-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ev-charge::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ev-plug-charging::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ev-plug-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ev-plug::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ev-station::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ev-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-exclude::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-expand-lines::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-expand::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-extrude::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-eye-closed::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-eye::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-f-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-face-3d-draft::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-face-id::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-facebook-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-facebook::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-facetime::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-farm::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-arrow-down-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-arrow-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-arrow-left-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-arrow-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-arrow-right-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-arrow-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-arrow-up-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-arrow-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-down-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-left-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-right-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-up-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-favourite-book::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-favourite-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-female::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-figma::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-file-not-found::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fill-color::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fillet-3d::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-filter-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-filter-list-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-filter-list::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-filter::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-finder::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fingerprint-check-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fingerprint-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fingerprint-lock-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fingerprint-scan::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fingerprint-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fingerprint-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fingerprint-xmark-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fingerprint::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fire-flame::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fish::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fishing::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-flare::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-flash-off::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-flash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-flask::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-flip-reverse::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-flip::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-floppy-disk-arrow-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-floppy-disk-arrow-out::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-floppy-disk::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-flower::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fog::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-folder-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-folder-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-folder-settings::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-folder-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-folder::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-font-question::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-football-ball::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-football::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-forward-15-seconds::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-forward-message::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-forward::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-frame-alt-empty::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-frame-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-frame-minus-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-frame-plus-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-frame-select::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-frame-simple::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-frame-tool::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-frame::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fridge::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fx-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fx::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-gamepad::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-garage::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-gas-tank-droplet::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-gas-tank::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-gas::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-gif-format::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-gift::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-git-branch::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-git-cherry-pick-commit::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-git-commit::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-git-compare::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-git-fork::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-git-merge::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-git-pull-request-closed::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-git-pull-request::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-git::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-github-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-github::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-gitlab-full::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-glass-empty::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-glass-fragile::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-glass-half-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-glass-half::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-glasses::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-globe::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-golf::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-google-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-google-docs::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-google-drive-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-google-drive-sync::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-google-drive-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-google-drive::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-google-home::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-google-one::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-google::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-gps::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-graduation-cap::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-graph-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-graph-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-grid-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-grid-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-grid-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-group::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-gym::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-h-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-half-cookie::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-half-moon::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hammer::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hand-brake::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hand-card::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hand-cash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hand-contactless::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-handbag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hard-drive::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hashtag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hat::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hd-display::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hd::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hdr::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-headset-bolt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-headset-help::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-headset-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-headset::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-health-shield::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-healthcare::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-heart-arrow-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-heart::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-heating-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-heavy-rain::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-help-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-help-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-heptagon::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hexagon-dice::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hexagon-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hexagon::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-historic-shield-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-historic-shield::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home-alt-slim-horiz::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home-alt-slim::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home-hospital::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home-sale::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home-secure::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home-shield::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home-simple-door::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home-simple::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home-table::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home-temperature-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home-temperature-out::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home-user::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-home::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-horiz-distribution-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-horiz-distribution-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-horizontal-merge::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-horizontal-split::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hospital-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hospital::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hot-air-balloon::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hourglass::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-house-rooms::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-html5::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ice-cream::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-iconoir::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-import::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-inclination::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-industry::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-infinite::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-info-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-input-field::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-input-output::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-input-search::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-instagram::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-internet::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-intersect-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-intersect::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ios-settings::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ip-address-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-iris-scan::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-italic-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-italic::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-jellyfish::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-journal-page::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-journal::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-jpeg-format::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-jpg-format::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-kanban-board::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-key-back::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-key-command::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-key-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-key-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-key-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-key::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-align-center::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-align-horizontal::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-align-vertical::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-minus-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-plus-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-position::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframes-couple::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframes-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframes-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframes::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-label::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-lamp::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-language::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-laptop-charging::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-laptop-dev-mode::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-laptop-fix::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-laptop-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-laptop::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-layout-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-layout-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-leaderboard-star::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-leaderboard::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-leaf::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-learning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-lens-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-lens::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-lifebelt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-light-bulb-off::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-light-bulb-on::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-light-bulb::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-line-space::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-linear::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-link-slash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-link-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-link::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-linkedin::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-linux::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-list-select::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-list::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-litecoin-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-litecoin-rotate-out::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-lock-slash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-lock-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-lock::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-loft-3d::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-log-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-log-no-access::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-log-out::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-down-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-down-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-left-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-left-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-right-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-right-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-up-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-up-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-lot-of-cash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-lullaby::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mac-control-key::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mac-dock::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mac-option-key::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mac-os-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-magic-wand::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-magnet-energy::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-magnet::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mail-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mail-open::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mail-out::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mail::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-male::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-map-pin-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-map-pin-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-map-pin-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-map-pin::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-map-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-map::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-maps-arrow-diagonal::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-maps-arrow-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-maps-arrow::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-maps-go-straight::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-maps-turn-back::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-maps-turn-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-maps-turn-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mask-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mastercard-card::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mastodon::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-math-book::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-maximize::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-medal-1st::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-medal::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-media-image-folder::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-media-image-list::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-media-image-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-media-image-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-media-image::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-media-video-folder::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-media-video-list::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-media-video-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-media-video-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-media-video::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-medium::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-megaphone::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-menu-scale::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-menu::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-message-alert::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-message-text::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-message::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-meter-arrow-down-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-metro::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone-mute::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone-speaking::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microscope::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-minus-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-minus-hexagon::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-minus-square-dashed::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-minus-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mirror::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mobile-dev-mode::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mobile-fingerprint::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mobile-voice::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-modern-tv-4k::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-modern-tv::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-money-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-moon-sat::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-more-horiz-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-more-horiz::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-more-vert-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-more-vert::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-motorcycle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mouse-button-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mouse-button-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mouse-scroll-wheel::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-movie::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mpeg-format::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-multi-bubble::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-multi-mac-os-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-multi-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-multiple-pages-empty::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-multiple-pages-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-multiple-pages-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-multiple-pages-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-multiple-pages::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-music-double-note-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-music-double-note::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-music-note-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-music-note::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-n-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-nav-arrow-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-nav-arrow-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-nav-arrow-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-nav-arrow-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-navigator-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-navigator::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-neighbourhood::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-network-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-network-reverse::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-network-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-network::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-new-tab::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-nintendo-switch::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-no-smoking-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-non-binary::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-notes::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-npm-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-npm::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-0-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-1-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-2-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-3-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-4-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-5-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-6-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-7-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-8-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-9-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-numbered-list-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-numbered-list-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-o-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-octagon::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-off-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-oil-industry::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-okrs::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-on-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-one-finger-select-hand-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-one-point-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-open-book::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-open-in-browser::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-open-in-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-open-new-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-open-select-hand-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-open-vpn::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-orange-half::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-orange-slice-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-orange-slice::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-organic-food-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-organic-food::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-orthogonal-view::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-package-lock::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-package::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-packages::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pacman::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-edit::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-flip::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-minus-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-plus-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-search::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-star::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-palette::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-panorama-enlarge::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-panorama-reduce::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pants-pockets::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pants::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-parking::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-password-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-password-cursor::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-password-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-paste-clipboard::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-path-arrow::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pause-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pause::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-paypal::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pc-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pc-firewall::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pc-mouse::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pc-no-entry::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pc-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-peace-hand::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-peerlist::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pen-connect-bluetooth::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pen-connect-wifi::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pen-tablet-connect-usb::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pen-tablet-connect-wifi::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pen-tablet::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pentagon::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-people-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-percent-rotate-out::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-percentage-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-percentage-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-percentage::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-perspective-view::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pharmacy-cross-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pharmacy-cross-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-disabled::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-income::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-outcome::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-paused::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-piggy-bank::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pillow::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pin-slash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pin::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pine-tree::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pinterest::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pipe-3d::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pizza-slice::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-planet-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-planet-sat::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-planet::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-planimetry::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-play::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-playlist-play::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-playlist-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-playlist::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-playstation-gamepad::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-plug-type-a::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-plug-type-c::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-plug-type-g::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-plug-type-l::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-plus-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-plus-square-dashed::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-plus-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-png-format::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pocket::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-podcast::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pokeball::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-polar-sh::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-position-align::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-position::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-post::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-potion::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pound::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-precision-tool::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-presentation::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-printer::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-printing-page::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-priority-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-priority-high::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-priority-medium::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-priority-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-privacy-policy::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-private-wifi::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-profile-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-prohibition::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-project-curve-3d::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-puzzle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-qr-code::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-question-mark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-quote-message::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-quote::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-radiation::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-radius::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rain::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-raw-format::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-receive-dollars::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-receive-euros::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-receive-pounds::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-receive-yens::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-redo-action::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-redo-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-redo::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-reduce::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-refresh-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-refresh-double::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-refresh::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-reload-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-reminder-hand-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-repeat-once::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-repeat::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-reply-to-message::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-reply::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-report-columns::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-reports::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-repository::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-restart::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rewind::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rhombus-arrow-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rhombus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rings::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rocket::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rook::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rotate-camera-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rotate-camera-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-round-flask::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rounded-mirror::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rss-feed-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rss-feed::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rubik-cube::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ruler-arrows::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ruler-combine::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ruler-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ruler-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ruler::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-running::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-safari::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-safe-arrow-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-safe-arrow-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-safe-open::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-safe::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sandals::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-scale-frame-enlarge::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-scale-frame-reduce::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-scan-barcode::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-scan-qr-code::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-scanning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-scarf::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-scissor-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-scissor::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-screenshot::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sea-and-sun::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sea-waves::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-search-engine::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-search-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-search::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-secure-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-security-pass::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-select-edge-3d::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-select-face-3d::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-select-point-3d::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-select-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-selective-tool::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-send-diagonal::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-send-dollars::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-send-euros::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-send-mail::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-send-pounds::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-send-yens::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-send::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-server-connection::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-server::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-settings-profiles::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-settings::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-share-android::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-share-ios::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield-alert::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield-broken::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield-download::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield-eye::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield-loading::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield-plus-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield-question::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield-search::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield-upload::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shield::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shirt-tank-top::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shirt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shop-four-tiles-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shop-four-tiles::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shop-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shop::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shopping-bag-arrow-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shopping-bag-arrow-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shopping-bag-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shopping-bag-minus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shopping-bag-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shopping-bag-pocket::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shopping-bag-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shopping-bag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shopping-code-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shopping-code-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shopping-code::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-short-pants-pockets::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-short-pants::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shortcut-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shuffle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sidebar-collapse::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sidebar-expand::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sigma-function::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-simple-cart::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sine-wave::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-single-tap-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-skateboard::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-skateboarding::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-skip-next::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-skip-prev::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-slash-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-slash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sleeper-chair::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-slips::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-small-lamp-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-small-lamp::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-smartphone-device::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-smoking::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-snapchat::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-snow-flake::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-snow::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-soap::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-soccer-ball::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sofa::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-soil-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-soil::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sort-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sort-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sort::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sound-high::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sound-low::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sound-min::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sound-off::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-spades::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-spark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sparks::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sphere::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-spiral::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-split-area::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-split-square-dashed::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-spock-hand-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-spotify::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-square-3d-corner-to-corner::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-square-3d-from-center::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-square-3d-three-points::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-square-cursor::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-square-dashed::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-square-wave::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-stackoverflow::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-star-dashed::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-star-half-dashed::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-star::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-stat-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-stat-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-stats-down-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-stats-report::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-stats-up-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-strategy::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-stretching::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-strikethrough::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-stroller::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-style-border::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-submit-document::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-substract::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-suggestion::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-suitcase::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sun-light::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-svg-format::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sweep-3d::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-swimming::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-swipe-down-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-swipe-left-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-swipe-right-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-swipe-two-fingers-down-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-swipe-two-fingers-left-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-swipe-two-fingers-right-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-swipe-two-fingers-up-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-swipe-up-gesture::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-switch-off::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-switch-on::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-system-restart::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-system-shut::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-table-2-columns::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-table-rows::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-table::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-task-list::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-telegram-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-telegram::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-temperature-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-temperature-high::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-temperature-low::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-temperature-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tennis-ball-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tennis-ball::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-terminal-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-terminal::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-test-tube::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-text-arrows-up-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-text-box::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-text-magnifying-glass::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-text-size::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-text-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-text::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-threads::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-three-points-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-three-stars::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-thumbs-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-thumbs-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-thunderstorm::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tif-format::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tiff-format::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tiktok::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-time-zone::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-timer-off::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-timer::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tools::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tournament::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tower-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tower-no-access::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tower-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tower::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-trademark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-train::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tram::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-transition-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-transition-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-transition-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-transition-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-translate::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-trash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-treadmill::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tree::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-trekking::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-trello::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-triangle-flag-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-triangle-flag-two-stripes::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-triangle-flag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-triangle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-trophy::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-truck-green::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-truck-length::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-truck::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tunnel::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tv-fix::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tv-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tv::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-twitter::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-two-points-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-two-seater-sofa::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-type::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-u-turn-arrow-left::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-u-turn-arrow-right::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-umbrella::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-underline-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-underline::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-undo-action::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-undo-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-undo::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-union-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-union-horiz-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-union::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-unity-5::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-unity::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-unjoin-3d::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-upload-data-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-upload-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-upload::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-usb::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-user-badge-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-user-bag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-user-cart::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-user-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-user-crown::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-user-love::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-user-plus::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-user-scan::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-user-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-user-star::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-user-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-user::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-vegan-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-vegan-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-vegan::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-vehicle-green::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-vertical-merge::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-vertical-split::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-vials::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-video-camera-off::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-video-camera::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-video-projector::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-view-360::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-view-columns-2::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-view-columns-3::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-view-grid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-view-structure-down::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-view-structure-up::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-voice-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-voice-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-voice-lock-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-voice-scan::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-voice-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-voice-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-voice::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-vr-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-vue-js::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-waist::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-walking::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wallet::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-warning-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-warning-hexagon::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-warning-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-warning-triangle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-warning-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wash::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-washing-machine::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-watering-soil::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-web-window-energy-consumption::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-web-window-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-web-window::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-webp-format::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-weight-alt::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-weight::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-whatsapp::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-white-flag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wifi-off::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wifi-signal-none::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wifi-tag::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wifi-warning::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wifi-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wifi::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wind::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-window-check::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-window-lock::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-window-no-access::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-window-tabs::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-window-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-windows::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wolf::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wrap-text::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wrench::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wristwatch::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-www::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-x-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-x::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-xbox-a::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-xbox-b::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-xbox-x::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-xbox-y::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-xmark-circle::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-xmark-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-xmark::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-xray-view::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-y-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-yelp::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-yen-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-yen::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-yoga::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-youtube::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-z-square::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-zoom-in::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-zoom-out::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-adobe-after-effects-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-adobe-illustrator-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-adobe-indesign-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-adobe-lightroom-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-adobe-photoshop-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-adobe-xd-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-airplay-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-alarm-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-bottom-box-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-horizontal-centers-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-horizontal-spacing-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-left-box-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-right-box-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-top-box-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-vertical-centers-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-align-vertical-spacing-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-app-notification-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-app-store-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-apple-shortcuts-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down-left-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down-left-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down-right-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-down-right-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-left-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-left-tag-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-right-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-right-tag-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up-left-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up-left-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up-right-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-arrow-up-right-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bathroom-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bell-notification-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bitcoin-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bluetooth-tag-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bold-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-book-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bookmark-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bookmark-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bubble-search-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bubble-xmark-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-bug-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cable-tag-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-arrow-down-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-arrow-up-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-check-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-minus-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-plus-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-rotate-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-calendar-xmark-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-camera-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cash-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-center-align-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble-check-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble-empty-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble-question-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble-translate-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble-warning-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble-xmark-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-bubble-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-lines-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-minus-in-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-chat-plus-in-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-check-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-check-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-clock-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-closed-captions-tag-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cloud-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-comp-align-bottom-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-comp-align-left-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-comp-align-right-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-comp-align-top-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-compass-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-component-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cooling-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-credit-card-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cube-dots-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-cube-scan-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-check-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-tag-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-xmark-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-database-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-design-nib-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-diameter-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-divide-three-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-divide-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dogecoin-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dollar-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-dots-grid-3x3-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-download-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-download-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-drag-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-droplet-snow-flake-in-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-droplet-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-erase-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ethereum-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-euro-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-eye-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-facetime-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-arrow-down-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-arrow-left-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-arrow-right-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fast-arrow-up-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fill-color-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-filter-list-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-filter-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-flash-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-flask-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-forward-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-frame-tool-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-fx-tag-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-git-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-google-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-graduation-cap-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hd-display-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-headset-bolt-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-headset-warning-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-headset-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-heart-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-heating-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-help-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-help-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-horiz-distribution-left-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-horiz-distribution-right-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-hospital-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-ice-cream-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-info-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-italic-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-align-center-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-align-horizontal-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-align-vertical-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-minus-in-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-minus-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-plus-in-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-plus-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-position-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframe-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframes-couple-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-keyframes-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-label-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-litecoin-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-down-left-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-down-right-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-left-down-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-left-up-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-right-down-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-right-up-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-up-left-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-long-arrow-up-right-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-magnet-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mail-in-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mail-open-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mail-out-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-mail-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-medal-1st-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-medal-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-message-alert-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-message-text-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-message-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone-check-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone-minus-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone-mute-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone-plus-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone-speaking-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone-warning-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microphone-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-microscope-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-minus-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-minus-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-money-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-multi-bubble-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-music-note-plus-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-music-note-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-nav-arrow-down-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-nav-arrow-left-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-nav-arrow-right-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-nav-arrow-up-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-network-left-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-network-reverse-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-network-right-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-network-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-0-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-1-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-2-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-3-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-4-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-5-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-6-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-7-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-8-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-number-9-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-down-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-left-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-right-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-page-up-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-path-arrow-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pause-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-peerlist-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-percentage-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-percentage-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-income-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-minus-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-outcome-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-paused-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-plus-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-xmark-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-phone-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pin-slash-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pin-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-planet-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-play-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-plus-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-plus-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-pocket-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-podcast-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-post-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-presentation-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-priority-down-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-priority-high-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-priority-medium-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-priority-up-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-quote-message-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-quote-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-radiation-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-radius-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-redo-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-refresh-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-reports-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rewind-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rhombus-arrow-right-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-round-flask-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-rss-feed-tag-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-send-diagonal-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-send-mail-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-send-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-server-connection-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-server-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-share-android-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-shortcut-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-skip-next-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-skip-prev-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-snapchat-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sound-high-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sound-low-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sound-min-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sound-off-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-spark-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-sparks-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-square-cursor-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-star-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-stats-down-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-stats-up-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-style-border-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-test-tube-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-text-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-three-stars-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-tiktok-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-timer-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-transition-down-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-transition-left-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-transition-right-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-transition-up-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-trash-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-underline-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-undo-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-upload-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-usb-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-vials-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wallet-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-warning-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-warning-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-warning-triangle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-web-window-energy-consumption-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-web-window-xmark-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-web-window-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-whatsapp-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-white-flag-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wifi-signal-none-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wifi-tag-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wifi-warning-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-window-tabs-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-wolf-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-xmark-circle-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-xmark-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-yen-square-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');}.iconoir-youtube-solid::before{mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');} \ No newline at end of file diff --git a/assets/vendor/swiper/swiper-bundle.min.css b/assets/vendor/swiper/swiper-bundle.min.css new file mode 100644 index 0000000..5c00c53 --- /dev/null +++ b/assets/vendor/swiper/swiper-bundle.min.css @@ -0,0 +1,13 @@ +/** + * Swiper 12.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2026 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: May 27, 2026 + */ + +:root{--swiper-theme-color:#007aff}:host{display:block;margin-left:auto;margin-right:auto;position:relative;z-index:1}.swiper{display:block;list-style:none;margin-left:auto;margin-right:auto;overflow:hidden;padding:0;position:relative;z-index:1}.swiper-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{box-sizing:initial;display:flex;height:100%;position:relative;transition-property:transform;transition-timing-function:var(--swiper-wrapper-transition-timing-function,initial);width:100%;z-index:1}.swiper-android .swiper-slide,.swiper-ios .swiper-slide,.swiper-wrapper{transform:translateZ(0)}.swiper-horizontal{touch-action:pan-y}.swiper-vertical{touch-action:pan-x}.swiper-slide{display:block;flex-shrink:0;height:100%;position:relative;transition-property:transform;width:100%}.swiper-slide-invisible-blank{visibility:hidden}.swiper-autoheight,.swiper-autoheight .swiper-slide{height:auto}.swiper-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-backface-hidden .swiper-slide{backface-visibility:hidden;transform:translateZ(0)}.swiper-3d.swiper-css-mode .swiper-wrapper{perspective:1200px}.swiper-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-3d{perspective:1200px;.swiper-cube-shadow,.swiper-slide{transform-style:preserve-3d}}.swiper-css-mode{>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none;&::-webkit-scrollbar{display:none}}>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}&.swiper-horizontal{>.swiper-wrapper{scroll-snap-type:x mandatory}>.swiper-wrapper>.swiper-slide:first-child{margin-inline-start:var(--swiper-slides-offset-before);scroll-margin-inline-start:var(--swiper-slides-offset-before)}>.swiper-wrapper>.swiper-slide:last-child{margin-inline-end:var(--swiper-slides-offset-after)}}&.swiper-vertical{>.swiper-wrapper{scroll-snap-type:y mandatory}>.swiper-wrapper>.swiper-slide:first-child{margin-block-start:var(--swiper-slides-offset-before);scroll-margin-block-start:var(--swiper-slides-offset-before)}>.swiper-wrapper>.swiper-slide:last-child{margin-block-end:var(--swiper-slides-offset-after)}}&.swiper-free-mode{>.swiper-wrapper{scroll-snap-type:none}>.swiper-wrapper>.swiper-slide{scroll-snap-align:none}}&.swiper-centered{>.swiper-wrapper:before{content:"";flex-shrink:0;order:9999}>.swiper-wrapper>.swiper-slide{scroll-snap-align:center center;scroll-snap-stop:always}}&.swiper-centered.swiper-horizontal{>.swiper-wrapper>.swiper-slide:first-child{margin-inline-start:var(--swiper-centered-offset-before)}>.swiper-wrapper:before{height:100%;min-height:1px;width:var(--swiper-centered-offset-after)}}&.swiper-centered.swiper-vertical{>.swiper-wrapper>.swiper-slide:first-child{margin-block-start:var(--swiper-centered-offset-before)}>.swiper-wrapper:before{height:var(--swiper-centered-offset-after);min-width:1px;width:100%}}}.swiper-3d{.swiper-slide-shadow,.swiper-slide-shadow-bottom,.swiper-slide-shadow-left,.swiper-slide-shadow-right,.swiper-slide-shadow-top{height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;z-index:10}.swiper-slide-shadow{background:#00000026}.swiper-slide-shadow-left{background-image:linear-gradient(270deg,#00000080,#0000)}.swiper-slide-shadow-right{background-image:linear-gradient(90deg,#00000080,#0000)}.swiper-slide-shadow-top{background-image:linear-gradient(0deg,#00000080,#0000)}.swiper-slide-shadow-bottom{background-image:linear-gradient(180deg,#00000080,#0000)}}.swiper-lazy-preloader{border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top:4px solid #0000;box-sizing:border-box;height:42px;left:50%;margin-left:-21px;margin-top:-21px;position:absolute;top:50%;transform-origin:50%;width:42px;z-index:10}.swiper-watch-progress .swiper-slide-visible,.swiper:not(.swiper-watch-progress){.swiper-lazy-preloader{animation:swiper-preloader-spin 1s linear infinite}}.swiper-lazy-preloader-white{--swiper-preloader-color:#fff}.swiper-lazy-preloader-black{--swiper-preloader-color:#000}@keyframes swiper-preloader-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.swiper-virtual .swiper-slide{-webkit-backface-visibility:hidden;transform:translateZ(0)}.swiper-virtual.swiper-css-mode{.swiper-wrapper:after{content:"";left:0;pointer-events:none;position:absolute;top:0}}.swiper-virtual.swiper-css-mode.swiper-horizontal{.swiper-wrapper:after{height:1px;width:var(--swiper-virtual-size)}}.swiper-virtual.swiper-css-mode.swiper-vertical{.swiper-wrapper:after{height:var(--swiper-virtual-size);width:1px}}:root{--swiper-navigation-size:44px}.swiper-button-next,.swiper-button-prev{align-items:center;color:var(--swiper-navigation-color,var(--swiper-theme-color));cursor:pointer;display:flex;height:var(--swiper-navigation-size);justify-content:center;position:absolute;width:var(--swiper-navigation-size);z-index:10;&.swiper-button-disabled{cursor:auto;opacity:.35;pointer-events:none}&.swiper-button-hidden{cursor:auto;opacity:0;pointer-events:none}.swiper-navigation-disabled &{display:none!important}::slotted(svg),svg{height:100%;object-fit:contain;transform-origin:center;width:100%;fill:currentColor;pointer-events:none}}.swiper-button-lock{display:none}.swiper-button-next,.swiper-button-prev{margin-top:calc(0px - var(--swiper-navigation-size)/2);top:var(--swiper-navigation-top-offset,50%)}.swiper-button-prev{left:var(--swiper-navigation-sides-offset,4px);right:auto;.swiper-navigation-icon,::slotted(.swiper-navigation-icon){transform:rotate(180deg)}}.swiper-button-next{left:auto;right:var(--swiper-navigation-sides-offset,4px)}.swiper-horizontal{.swiper-button-next,.swiper-button-prev,~.swiper-button-next,~.swiper-button-prev{margin-left:0;margin-top:calc(0px - var(--swiper-navigation-size)/2);top:var(--swiper-navigation-top-offset,50%)}&.swiper-rtl .swiper-button-next,&.swiper-rtl~.swiper-button-next,&~.swiper-button-prev,.swiper-button-prev{left:var(--swiper-navigation-sides-offset,4px);right:auto}&.swiper-rtl .swiper-button-prev,&.swiper-rtl~.swiper-button-prev,&~.swiper-button-next,.swiper-button-next{left:auto;right:var(--swiper-navigation-sides-offset,4px)}&.swiper-rtl .swiper-button-next,&.swiper-rtl~.swiper-button-next,&~.swiper-button-prev,.swiper-button-prev{.swiper-navigation-icon,::slotted(.swiper-navigation-icon){transform:rotate(180deg)}}&.swiper-rtl .swiper-button-prev,&.swiper-rtl~.swiper-button-prev{.swiper-navigation-icon,::slotted(.swiper-navigation-icon){transform:rotate(0deg)}}}.swiper-vertical{.swiper-button-next,.swiper-button-prev,~.swiper-button-next,~.swiper-button-prev{left:var(--swiper-navigation-top-offset,50%);margin-left:calc(0px - var(--swiper-navigation-size)/2);margin-top:0;right:auto}.swiper-button-prev,~.swiper-button-prev{bottom:auto;top:var(--swiper-navigation-sides-offset,4px);.swiper-navigation-icon,::slotted(.swiper-navigation-icon){transform:rotate(-90deg)}}.swiper-button-next,~.swiper-button-next{bottom:var(--swiper-navigation-sides-offset,4px);top:auto;.swiper-navigation-icon,::slotted(.swiper-navigation-icon){transform:rotate(90deg)}}}.swiper-pagination{position:absolute;text-align:center;transform:translateZ(0);transition:opacity .3s;z-index:10;&.swiper-pagination-hidden{opacity:0}&.swiper-pagination-disabled,.swiper-pagination-disabled>&{display:none!important}}.swiper-horizontal>.swiper-pagination-bullets,.swiper-pagination-bullets.swiper-pagination-horizontal,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:var(--swiper-pagination-bottom,8px);left:0;top:var(--swiper-pagination-top,auto);width:100%}.swiper-pagination-bullets-dynamic{font-size:0;overflow:hidden;.swiper-pagination-bullet{position:relative;transform:scale(.33)}.swiper-pagination-bullet-active,.swiper-pagination-bullet-active-main{transform:scale(1)}.swiper-pagination-bullet-active-prev{transform:scale(.66)}.swiper-pagination-bullet-active-prev-prev{transform:scale(.33)}.swiper-pagination-bullet-active-next{transform:scale(.66)}.swiper-pagination-bullet-active-next-next{transform:scale(.33)}}.swiper-pagination-bullet{background:var(--swiper-pagination-bullet-inactive-color,#000);border-radius:var(--swiper-pagination-bullet-border-radius,50%);display:inline-block;height:var(--swiper-pagination-bullet-height,var(--swiper-pagination-bullet-size,8px));opacity:var(--swiper-pagination-bullet-inactive-opacity,.2);width:var(--swiper-pagination-bullet-width,var(--swiper-pagination-bullet-size,8px));button&{appearance:none;border:none;box-shadow:none;margin:0;padding:0}.swiper-pagination-clickable &{cursor:pointer}&:only-child{display:none!important}}.swiper-pagination-bullet-active{background:var(--swiper-pagination-color,var(--swiper-theme-color));opacity:var(--swiper-pagination-bullet-opacity,1)}.swiper-pagination-vertical.swiper-pagination-bullets,.swiper-vertical>.swiper-pagination-bullets{left:var(--swiper-pagination-left,auto);right:var(--swiper-pagination-right,8px);top:50%;transform:translate3d(0,-50%,0);.swiper-pagination-bullet{display:block;margin:var(--swiper-pagination-bullet-vertical-gap,6px) 0}&.swiper-pagination-bullets-dynamic{top:50%;transform:translateY(-50%);width:8px;.swiper-pagination-bullet{display:inline-block;transition:transform .2s,top .2s}}}.swiper-horizontal>.swiper-pagination-bullets,.swiper-pagination-horizontal.swiper-pagination-bullets{.swiper-pagination-bullet{margin:0 var(--swiper-pagination-bullet-horizontal-gap,4px)}&.swiper-pagination-bullets-dynamic{left:50%;transform:translateX(-50%);white-space:nowrap;.swiper-pagination-bullet{transition:transform .2s,left .2s}}}.swiper-horizontal.swiper-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:transform .2s,right .2s}.swiper-pagination-fraction{color:var(--swiper-pagination-fraction-color,inherit)}.swiper-pagination-progressbar{background:var(--swiper-pagination-progressbar-bg-color,#00000040);position:absolute;.swiper-pagination-progressbar-fill{background:var(--swiper-pagination-color,var(--swiper-theme-color));height:100%;left:0;position:absolute;top:0;transform:scale(0);transform-origin:left top;width:100%}.swiper-rtl & .swiper-pagination-progressbar-fill{transform-origin:right top}&.swiper-pagination-horizontal,&.swiper-pagination-vertical.swiper-pagination-progressbar-opposite,.swiper-horizontal>&,.swiper-vertical>&.swiper-pagination-progressbar-opposite{height:var(--swiper-pagination-progressbar-size,4px);left:0;top:0;width:100%}&.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite,&.swiper-pagination-vertical,.swiper-horizontal>&.swiper-pagination-progressbar-opposite,.swiper-vertical>&{height:100%;left:0;top:0;width:var(--swiper-pagination-progressbar-size,4px)}}.swiper-pagination-lock{display:none}.swiper-scrollbar{background:var(--swiper-scrollbar-bg-color,#0000001a);border-radius:var(--swiper-scrollbar-border-radius,10px);position:relative;touch-action:none;&.swiper-scrollbar-disabled,.swiper-scrollbar-disabled>&{display:none!important}&.swiper-scrollbar-horizontal,.swiper-horizontal>&{bottom:var(--swiper-scrollbar-bottom,4px);height:var(--swiper-scrollbar-size,4px);left:var(--swiper-scrollbar-sides-offset,1%);position:absolute;top:var(--swiper-scrollbar-top,auto);width:calc(100% - var(--swiper-scrollbar-sides-offset, 1%)*2);z-index:50}&.swiper-scrollbar-vertical,.swiper-vertical>&{height:calc(100% - var(--swiper-scrollbar-sides-offset, 1%)*2);left:var(--swiper-scrollbar-left,auto);position:absolute;right:var(--swiper-scrollbar-right,4px);top:var(--swiper-scrollbar-sides-offset,1%);width:var(--swiper-scrollbar-size,4px);z-index:50}}.swiper-scrollbar-drag{background:var(--swiper-scrollbar-drag-bg-color,#00000080);border-radius:var(--swiper-scrollbar-border-radius,10px);height:100%;left:0;position:relative;top:0;width:100%}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}.swiper-zoom-container{align-items:center;display:flex;height:100%;justify-content:center;text-align:center;width:100%;>canvas,>img,>svg{max-height:100%;max-width:100%;object-fit:contain}}.swiper-slide-zoomed{cursor:move;touch-action:none}.swiper .swiper-notification{left:0;opacity:0;pointer-events:none;position:absolute;top:0;z-index:-1000}.swiper-free-mode>.swiper-wrapper{margin:0 auto;transition-timing-function:ease-out}.swiper-grid>.swiper-wrapper{flex-wrap:wrap}.swiper-grid-column>.swiper-wrapper{flex-direction:column;flex-wrap:wrap}.swiper-fade{&.swiper-free-mode{.swiper-slide{transition-timing-function:ease-out}}.swiper-slide{pointer-events:none;transition-property:opacity;.swiper-slide{pointer-events:none}}.swiper-slide-active{pointer-events:auto;& .swiper-slide-active{pointer-events:auto}}}.swiper.swiper-cube{overflow:visible}.swiper-cube{.swiper-slide{backface-visibility:hidden;height:100%;pointer-events:none;transform-origin:0 0;visibility:hidden;width:100%;z-index:1;.swiper-slide{pointer-events:none}}&.swiper-rtl .swiper-slide{transform-origin:100% 0}.swiper-slide-active{&,& .swiper-slide-active{pointer-events:auto}}.swiper-slide-active,.swiper-slide-next,.swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-cube-shadow{bottom:0;height:100%;left:0;opacity:.6;position:absolute;width:100%;z-index:0;&:before{background:#000;bottom:0;content:"";filter:blur(50px);left:0;position:absolute;right:0;top:0}}}.swiper-cube{.swiper-slide-next+.swiper-slide{pointer-events:auto;visibility:visible}}.swiper-cube{.swiper-slide-shadow-cube.swiper-slide-shadow-bottom,.swiper-slide-shadow-cube.swiper-slide-shadow-left,.swiper-slide-shadow-cube.swiper-slide-shadow-right,.swiper-slide-shadow-cube.swiper-slide-shadow-top{backface-visibility:hidden;z-index:0}}.swiper.swiper-flip{overflow:visible}.swiper-flip{.swiper-slide{backface-visibility:hidden;pointer-events:none;z-index:1;.swiper-slide{pointer-events:none}}.swiper-slide-active{&,& .swiper-slide-active{pointer-events:auto}}}.swiper-flip{.swiper-slide-shadow-flip.swiper-slide-shadow-bottom,.swiper-slide-shadow-flip.swiper-slide-shadow-left,.swiper-slide-shadow-flip.swiper-slide-shadow-right,.swiper-slide-shadow-flip.swiper-slide-shadow-top{backface-visibility:hidden;z-index:0}}.swiper-creative{.swiper-slide{backface-visibility:hidden;overflow:hidden;transition-property:transform,opacity,height}}.swiper.swiper-cards{overflow:visible}.swiper-cards{.swiper-slide{backface-visibility:hidden;overflow:hidden;transform-origin:center bottom}} \ No newline at end of file diff --git a/assets/vendor/swiper/swiper-bundle.min.js b/assets/vendor/swiper/swiper-bundle.min.js new file mode 100644 index 0000000..8ea0dbe --- /dev/null +++ b/assets/vendor/swiper/swiper-bundle.min.js @@ -0,0 +1,14 @@ +/** + * Swiper 12.2.0 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2026 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: May 27, 2026 + */ + +var Swiper=function(){"use strict";function e(e){return null!==e&&"object"==typeof e&&"constructor"in e&&e.constructor===Object}function t(s={},a={}){const i=["__proto__","constructor","prototype"];Object.keys(a).filter(e=>i.indexOf(e)<0).forEach(i=>{void 0===s[i]?s[i]=a[i]:e(a[i])&&e(s[i])&&Object.keys(a[i]).length>0&&t(s[i],a[i])})}const s={body:{},addEventListener(){},removeEventListener(){},activeElement:{blur(){},nodeName:""},querySelector:()=>null,querySelectorAll:()=>[],getElementById:()=>null,createEvent:()=>({initEvent(){}}),createElement:()=>({children:[],childNodes:[],style:{},setAttribute(){},getElementsByTagName:()=>[]}),createElementNS:()=>({}),importNode:()=>null,location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""}};function a(){const e="undefined"!=typeof document?document:{};return t(e,s),e}const i={document:s,navigator:{userAgent:""},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""},history:{replaceState(){},pushState(){},go(){},back(){}},CustomEvent:function(){return this},addEventListener(){},removeEventListener(){},getComputedStyle:()=>({getPropertyValue:()=>""}),Image(){},Date(){},screen:{},setTimeout(){},clearTimeout(){},matchMedia:()=>({}),requestAnimationFrame:e=>"undefined"==typeof setTimeout?(e(),null):setTimeout(e,0),cancelAnimationFrame(e){"undefined"!=typeof setTimeout&&clearTimeout(e)}};function r(){const e="undefined"!=typeof window?window:{};return t(e,i),e}function n(e=""){return e.trim().split(" ").filter(e=>!!e.trim())}function l(e,t=0){return setTimeout(e,t)}function o(){return Date.now()}function d(e,t="x"){const s=r();let a,i,n;const l=function(e){const t=r();let s;return t.getComputedStyle&&(s=t.getComputedStyle(e,null)),!s&&e.currentStyle&&(s=e.currentStyle),s||(s=e.style),s}(e);return s.WebKitCSSMatrix?(i=l.transform||l.webkitTransform,i.split(",").length>6&&(i=i.split(", ").map(e=>e.replace(",",".")).join(", ")),n=new s.WebKitCSSMatrix("none"===i?"":i)):(n=l.MozTransform||l.OTransform||l.MsTransform||l.msTransform||l.transform||l.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,"),a=n.toString().split(",")),"x"===t&&(i=s.WebKitCSSMatrix?n.m41:16===a.length?parseFloat(a[12]):parseFloat(a[4])),"y"===t&&(i=s.WebKitCSSMatrix?n.m42:16===a.length?parseFloat(a[13]):parseFloat(a[5])),i||0}function c(e){return"object"==typeof e&&null!==e&&e.constructor&&"Object"===Object.prototype.toString.call(e).slice(8,-1)}function p(e){return"undefined"!=typeof window&&void 0!==window.HTMLElement?e instanceof HTMLElement:e&&(1===e.nodeType||11===e.nodeType)}function u(...e){const t=Object(e[0]);for(let s=1;s"__proto__"!==e&&"constructor"!==e&&"prototype"!==e);for(let s=0,i=e.length;si?"next":"prev",c=(e,t)=>"next"===d&&e>=t||"prev"===d&&e<=t,p=()=>{n=(new Date).getTime(),null===l&&(l=n);const r=Math.max(Math.min((n-l)/o,1),0),d=.5-Math.cos(r*Math.PI)/2;let u=i+d*(t-i);if(c(u,t)&&(u=t),e.wrapperEl.scrollTo({[s]:u}),c(u,t))return e.wrapperEl.style.overflow="hidden",e.wrapperEl.style.scrollSnapType="",setTimeout(()=>{e.wrapperEl.style.overflow="",e.wrapperEl.scrollTo({[s]:u})}),void a.cancelAnimationFrame(e.cssModeFrameID);e.cssModeFrameID=a.requestAnimationFrame(p)};p()}function f(e){return e.querySelector(".swiper-slide-transform")||e.shadowRoot&&e.shadowRoot.querySelector(".swiper-slide-transform")||e}function g(e,t=""){const s=r(),a=[...e.children];return s.HTMLSlotElement&&e instanceof HTMLSlotElement&&a.push(...e.assignedElements()),t?a.filter(e=>e.matches(t)):a}function v(e){try{return void console.warn(e)}catch(e){}}function w(e,t=[]){const s=document.createElement(e);return s.classList.add(...Array.isArray(t)?t:n(t)),s}function b(e){const t=r(),s=a(),i=e.getBoundingClientRect(),n=s.body,l=e.clientTop||n.clientTop||0,o=e.clientLeft||n.clientLeft||0,d=e===t?t.scrollY:e.scrollTop,c=e===t?t.scrollX:e.scrollLeft;return{top:i.top+d-l,left:i.left+c-o}}function y(e,t){return r().getComputedStyle(e,null).getPropertyValue(t)}function E(e){let t,s=e;if(s){for(t=0;null!==(s=s.previousSibling);)1===s.nodeType&&(t+=1);return t}}function x(e,t){const s=[];let a=e.parentElement;for(;a;)t?a.matches(t)&&s.push(a):s.push(a),a=a.parentElement;return s}function S(e,t){t&&e.addEventListener("transitionend",function s(a){a.target===e&&(t.call(e,a),e.removeEventListener("transitionend",s))})}function T(e,t,s){const a=r();return s?e["width"===t?"offsetWidth":"offsetHeight"]+parseFloat(a.getComputedStyle(e,null).getPropertyValue("width"===t?"margin-right":"margin-top"))+parseFloat(a.getComputedStyle(e,null).getPropertyValue("width"===t?"margin-left":"margin-bottom")):e.offsetWidth}function M(e){return(Array.isArray(e)?e:[e]).filter(e=>!!e)}function C(e){return t=>Math.abs(t)>0&&e.browser&&e.browser.need3dFix&&Math.abs(t)%90==0?t+.001:t}function P(e,t=""){"undefined"!=typeof trustedTypes?e.innerHTML=trustedTypes.createPolicy("html",{createHTML:e=>e}).createHTML(t):e.innerHTML=t}let L,I,z;function A(){return L||(L=function(){const e=r(),t=a();return{smoothScroll:t.documentElement&&t.documentElement.style&&"scrollBehavior"in t.documentElement.style,touch:!!("ontouchstart"in e||e.DocumentTouch&&t instanceof e.DocumentTouch)}}()),L}function $(e={}){return I||(I=function({userAgent:e}={}){const t=A(),s=r(),a=s.navigator.platform,i=e||s.navigator.userAgent,n={ios:!1,android:!1},l=s.screen.width,o=s.screen.height,d=i.match(/(Android);?[\s\/]+([\d.]+)?/);let c=i.match(/(iPad)(?!\1).*OS\s([\d_]+)/);const p=i.match(/(iPod)(.*OS\s([\d_]+))?/),u=!c&&i.match(/(iPhone\sOS|iOS)\s([\d_]+)/),m="Win32"===a;let h="MacIntel"===a;return!c&&h&&t.touch&&["1024x1366","1366x1024","834x1194","1194x834","834x1112","1112x834","768x1024","1024x768","820x1180","1180x820","810x1080","1080x810"].indexOf(`${l}x${o}`)>=0&&(c=i.match(/(Version)\/([\d.]+)/),c||(c=[0,1,"13_0_0"]),h=!1),d&&!m&&(n.os="android",n.android=!0),(c||u||p)&&(n.os="ios",n.ios=!0),n}(e)),I}function k(){return z||(z=function(){const e=r(),t=$();let s=!1;function a(){const t=e.navigator.userAgent.toLowerCase();return t.indexOf("safari")>=0&&t.indexOf("chrome")<0&&t.indexOf("android")<0}if(a()){const t=String(e.navigator.userAgent);if(t.includes("Version/")){const[e,a]=t.split("Version/")[1].split(" ")[0].split(".").map(e=>Number(e));s=e<16||16===e&&a<2}}const i=/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(e.navigator.userAgent),n=a();return{isSafari:s||n,needPerspectiveFix:s,need3dFix:n||i&&t.ios,isWebView:i}}()),z}var O={on(e,t,s){const a=this;if(!a.eventsListeners||a.destroyed)return a;if("function"!=typeof t)return a;const i=s?"unshift":"push";return e.split(" ").forEach(e=>{a.eventsListeners[e]||(a.eventsListeners[e]=[]),a.eventsListeners[e][i](t)}),a},once(e,t,s){const a=this;if(!a.eventsListeners||a.destroyed)return a;if("function"!=typeof t)return a;function i(...s){a.off(e,i),i.__emitterProxy&&delete i.__emitterProxy,t.apply(a,s)}return i.__emitterProxy=t,a.on(e,i,s)},onAny(e,t){const s=this;if(!s.eventsListeners||s.destroyed)return s;if("function"!=typeof e)return s;const a=t?"unshift":"push";return s.eventsAnyListeners.indexOf(e)<0&&s.eventsAnyListeners[a](e),s},offAny(e){const t=this;if(!t.eventsListeners||t.destroyed)return t;if(!t.eventsAnyListeners)return t;const s=t.eventsAnyListeners.indexOf(e);return s>=0&&t.eventsAnyListeners.splice(s,1),t},off(e,t){const s=this;return!s.eventsListeners||s.destroyed?s:s.eventsListeners?(e.split(" ").forEach(e=>{void 0===t?s.eventsListeners[e]=[]:s.eventsListeners[e]&&s.eventsListeners[e].forEach((a,i)=>{(a===t||a.__emitterProxy&&a.__emitterProxy===t)&&s.eventsListeners[e].splice(i,1)})}),s):s},emit(...e){const t=this;if(!t.eventsListeners||t.destroyed)return t;if(!t.eventsListeners)return t;let s,a,i;"string"==typeof e[0]||Array.isArray(e[0])?(s=e[0],a=e.slice(1,e.length),i=t):(s=e[0].events,a=e[0].data,i=e[0].context||t),a.unshift(i);return(Array.isArray(s)?s:s.split(" ")).forEach(e=>{t.eventsAnyListeners&&t.eventsAnyListeners.length&&t.eventsAnyListeners.forEach(t=>{t.apply(i,[e,...a])}),t.eventsListeners&&t.eventsListeners[e]&&t.eventsListeners[e].forEach(e=>{e.apply(i,a)})}),t}};const D=(e,t,s)=>{t&&!e.classList.contains(s)?e.classList.add(s):!t&&e.classList.contains(s)&&e.classList.remove(s)};const G=(e,t,s)=>{t&&!e.classList.contains(s)?e.classList.add(s):!t&&e.classList.contains(s)&&e.classList.remove(s)};const X=(e,t)=>{if(!e||e.destroyed||!e.params)return;const s=t.closest(e.isElement?"swiper-slide":`.${e.params.slideClass}`);if(s){let t=s.querySelector(`.${e.params.lazyPreloaderClass}`);!t&&e.isElement&&(s.shadowRoot?t=s.shadowRoot.querySelector(`.${e.params.lazyPreloaderClass}`):requestAnimationFrame(()=>{s.shadowRoot&&(t=s.shadowRoot.querySelector(`.${e.params.lazyPreloaderClass}`),t&&!t.lazyPreloaderManaged&&t.remove())})),t&&!t.lazyPreloaderManaged&&t.remove()}},B=(e,t)=>{if(!e.slides[t])return;const s=e.slides[t].querySelector('[loading="lazy"]');s&&s.removeAttribute("loading")},Y=e=>{if(!e||e.destroyed||!e.params)return;let t=e.params.lazyPreloadPrevNext;const s=e.slides.length;if(!s||!t||t<0)return;t=Math.min(t,s);const a="auto"===e.params.slidesPerView?e.slidesPerViewDynamic():Math.ceil(e.params.slidesPerView),i=e.activeIndex;if(e.params.grid&&e.params.grid.rows>1){const s=i,r=[s-t];return r.push(...Array.from({length:t}).map((e,t)=>s+a+t)),void e.slides.forEach((t,s)=>{r.includes(t.column)&&B(e,s)})}const r=i+a-1;if(e.params.rewind||e.params.loop)for(let a=i-t;a<=r+t;a+=1){const t=(a%s+s)%s;(tr)&&B(e,t)}else for(let a=Math.max(i-t,0);a<=Math.min(r+t,s-1);a+=1)a!==i&&(a>r||a=0?x=parseFloat(x.replace("%",""))/100*E:"string"==typeof x&&(x=parseFloat(x)),e.virtualSize=-x-f-v,d.forEach(e=>{r?e.style.marginLeft="":e.style.marginRight="",e.style.marginBottom="",e.style.marginTop=""}),s.centeredSlides&&s.cssMode&&(m(a,"--swiper-centered-offset-before",""),m(a,"--swiper-centered-offset-after","")),s.cssMode&&(m(a,"--swiper-slides-offset-before",`${f}px`),m(a,"--swiper-slides-offset-after",`${v}px`));const P=s.grid&&s.grid.rows>1&&e.grid;let L;P?e.grid.initSlides(d):e.grid&&e.grid.unsetSlides();const I="auto"===s.slidesPerView&&s.breakpoints&&Object.keys(s.breakpoints).filter(e=>void 0!==s.breakpoints[e].slidesPerView).length>0;for(let a=0;a=0&&(t+=h[s]+(s1&&(a||p.push(e.virtualSize-E))}if(l&&s.loop){const t=h[0]+x;if(s.slidesPerGroup>1){const a=Math.ceil((e.virtual.slidesBefore+e.virtual.slidesAfter)/s.slidesPerGroup),i=t*s.slidesPerGroup;for(let e=0;e!(s.cssMode&&!s.loop)||t!==d.length-1).forEach(e=>{e.style[t]=`${x}px`})}if(s.centeredSlides&&s.centeredSlidesBounds){let e=0;h.forEach(t=>{e+=t+(x||0)}),e-=x;const t=e>E?e-E:0;p=p.map(e=>e<=0?-f:e>t?t+v:e)}if(s.centerInsufficientSlides){let e=0;if(h.forEach(t=>{e+=t+(x||0)}),e-=x,e{p[s]=e-t}),u.forEach((e,s)=>{u[s]=e+t})}}if(Object.assign(e,{slides:d,snapGrid:p,slidesGrid:u,slidesSizesGrid:h}),s.centeredSlides&&s.cssMode&&!s.centeredSlidesBounds){m(a,"--swiper-centered-offset-before",-p[0]+"px"),m(a,"--swiper-centered-offset-after",e.size/2-h[h.length-1]/2+"px");const t=-e.snapGrid[0],s=-e.slidesGrid[0];e.snapGrid=e.snapGrid.map(e=>e+t),e.slidesGrid=e.slidesGrid.map(e=>e+s)}if(c!==o&&e.emit("slidesLengthChange"),p.length!==w&&(e.params.watchOverflow&&e.checkOverflow(),e.emit("snapGridLengthChange")),u.length!==b&&e.emit("slidesGridLengthChange"),s.watchSlidesProgress&&e.updateSlidesOffset(),e.emit("slidesUpdated"),!(l||s.cssMode||"slide"!==s.effect&&"fade"!==s.effect)){const t=`${s.containerModifierClass}backface-hidden`,a=e.el.classList.contains(t);c<=s.maxBackfaceHiddenSlides?a||e.el.classList.add(t):a&&e.el.classList.remove(t)}},updateAutoHeight:function(e){const t=this,s=[],a=t.virtual&&t.params.virtual.enabled;let i,r=0;"number"==typeof e?t.setTransition(e):!0===e&&t.setTransition(t.params.speed);const n=e=>a?t.slides[t.getSlideIndexByData(e)]:t.slides[e];if("auto"!==t.params.slidesPerView&&t.params.slidesPerView>1)if(t.params.centeredSlides)(t.visibleSlides||[]).forEach(e=>{s.push(e)});else for(i=0;it.slides.length&&!a)break;s.push(n(e))}else s.push(n(t.activeIndex));for(i=0;ir?e:r}(r||0===r)&&(t.wrapperEl.style.height=`${r}px`)},updateSlidesOffset:function(){const e=this,t=e.slides,s=e.isElement?e.isHorizontal()?e.wrapperEl.offsetLeft:e.wrapperEl.offsetTop:0;for(let a=0;a=0?l=parseFloat(l.replace("%",""))/100*t.size:"string"==typeof l&&(l=parseFloat(l));for(let e=0;e=0&&u<=t.size-t.slidesSizesGrid[e],f=u>=0&&u1&&m<=t.size||u<=0&&m>=t.size;f&&(t.visibleSlides.push(o),t.visibleSlidesIndexes.push(e)),D(o,f,s.slideVisibleClass),D(o,h,s.slideFullyVisibleClass),o.progress=i?-c:c,o.originalProgress=i?-p:p}},updateProgress:function(e){const t=this;if(void 0===e){const s=t.rtlTranslate?-1:1;e=t&&t.translate&&t.translate*s||0}const s=t.params,a=t.maxTranslate()-t.minTranslate();let{progress:i,isBeginning:r,isEnd:n,progressLoop:l}=t;const o=r,d=n;if(0===a)i=0,r=!0,n=!0;else{i=(e-t.minTranslate())/a;const s=Math.abs(e-t.minTranslate())<1,l=Math.abs(e-t.maxTranslate())<1;r=s||i<=0,n=l||i>=1,s&&(i=0),l&&(i=1)}if(s.loop){const s=t.getSlideIndexByData(0),a=t.getSlideIndexByData(t.slides.length-1),i=t.slidesGrid[s],r=t.slidesGrid[a],n=t.slidesGrid[t.slidesGrid.length-1],o=Math.abs(e);l=o>=i?(o-i)/n:(o+n-r)/n,l>1&&(l-=1)}Object.assign(t,{progress:i,progressLoop:l,isBeginning:r,isEnd:n}),(s.watchSlidesProgress||s.centeredSlides&&s.autoHeight)&&t.updateSlidesProgress(e),r&&!o&&t.emit("reachBeginning toEdge"),n&&!d&&t.emit("reachEnd toEdge"),(o&&!r||d&&!n)&&t.emit("fromEdge"),t.emit("progress",i)},updateSlidesClasses:function(){const e=this,{slides:t,params:s,slidesEl:a,activeIndex:i}=e,r=e.virtual&&s.virtual.enabled,n=e.grid&&s.grid&&s.grid.rows>1,l=e=>g(a,`.${s.slideClass}${e}, swiper-slide${e}`)[0];let o,d,c;if(r)if(s.loop){let t=i-e.virtual.slidesBefore;t<0&&(t=e.virtual.slides.length+t),t>=e.virtual.slides.length&&(t-=e.virtual.slides.length),o=l(`[data-swiper-slide-index="${t}"]`)}else o=l(`[data-swiper-slide-index="${i}"]`);else n?(o=t.find(e=>e.column===i),c=t.find(e=>e.column===i+1),d=t.find(e=>e.column===i-1)):o=t[i];o&&(n||(c=function(e,t){const s=[];for(;e.nextElementSibling;){const a=e.nextElementSibling;t?a.matches(t)&&s.push(a):s.push(a),e=a}return s}(o,`.${s.slideClass}, swiper-slide`)[0],s.loop&&!c&&(c=t[0]),d=function(e,t){const s=[];for(;e.previousElementSibling;){const a=e.previousElementSibling;t?a.matches(t)&&s.push(a):s.push(a),e=a}return s}(o,`.${s.slideClass}, swiper-slide`)[0],s.loop&&0===!d&&(d=t[t.length-1]))),t.forEach(e=>{G(e,e===o,s.slideActiveClass),G(e,e===c,s.slideNextClass),G(e,e===d,s.slidePrevClass)}),e.emitSlidesClasses()},updateActiveIndex:function(e){const t=this,s=t.rtlTranslate?t.translate:-t.translate,{snapGrid:a,params:i,activeIndex:r,realIndex:n,snapIndex:l}=t;let o,d=e;const c=e=>{let s=e-t.virtual.slidesBefore;return s<0&&(s=t.virtual.slides.length+s),s>=t.virtual.slides.length&&(s-=t.virtual.slides.length),s};if(void 0===d&&(d=function(e){const{slidesGrid:t,params:s}=e,a=e.rtlTranslate?e.translate:-e.translate;let i;for(let e=0;e=t[e]&&a=t[e]&&a=t[e]&&(i=e);return s.normalizeSlideIndex&&(i<0||void 0===i)&&(i=0),i}(t)),a.indexOf(s)>=0)o=a.indexOf(s);else{const e=Math.min(i.slidesPerGroupSkip,d);o=e+Math.floor((d-e)/i.slidesPerGroup)}if(o>=a.length&&(o=a.length-1),d===r&&!t.params.loop)return void(o!==l&&(t.snapIndex=o,t.emit("snapIndexChange")));if(d===r&&t.params.loop&&t.virtual&&t.params.virtual.enabled)return void(t.realIndex=c(d));const p=t.grid&&i.grid&&i.grid.rows>1;let u;if(t.virtual&&i.virtual.enabled)u=i.loop?c(d):d;else if(p){const e=t.slides.find(e=>e.column===d);let s=parseInt(e.getAttribute("data-swiper-slide-index"),10);Number.isNaN(s)&&(s=Math.max(t.slides.indexOf(e),0)),u=Math.floor(s/i.grid.rows)}else if(t.slides[d]){const e=t.slides[d].getAttribute("data-swiper-slide-index");u=e?parseInt(e,10):d}else u=d;Object.assign(t,{previousSnapIndex:l,snapIndex:o,previousRealIndex:n,realIndex:u,previousIndex:r,activeIndex:d}),t.initialized&&Y(t),t.emit("activeIndexChange"),t.emit("snapIndexChange"),(t.initialized||t.params.runCallbacksOnInit)&&(n!==u&&t.emit("realIndexChange"),t.emit("slideChange"))},updateClickedSlide:function(e,t){const s=this,a=s.params;let i=e.closest(`.${a.slideClass}, swiper-slide`);!i&&s.isElement&&t&&t.length>1&&t.includes(e)&&[...t.slice(t.indexOf(e)+1,t.length)].forEach(e=>{!i&&e.matches&&e.matches(`.${a.slideClass}, swiper-slide`)&&(i=e)});let r,n=!1;if(i)for(let e=0;eo?o:a&&er?"next":i=o.length&&(v=o.length-1);const w=-o[v];if(l.normalizeSlideIndex)for(let e=0;e=s&&t=s&&t=s&&(n=e)}if(r.initialized&&n!==p){if(!r.allowSlideNext&&(u?w>r.translate&&w>r.minTranslate():wr.translate&&w>r.maxTranslate()&&(p||0)!==n)return!1}let b;n!==(c||0)&&s&&r.emit("beforeSlideChangeStart"),r.updateProgress(w),b=n>p?"next":n0?(r._cssModeVirtualInitialSet=!0,requestAnimationFrame(()=>{m[e?"scrollLeft":"scrollTop"]=s})):m[e?"scrollLeft":"scrollTop"]=s,y&&requestAnimationFrame(()=>{r.wrapperEl.style.scrollSnapType="",r._immediateVirtual=!1});else{if(!r.support.smoothScroll)return h({swiper:r,targetPosition:s,side:e?"left":"top"}),!0;m.scrollTo({[e?"left":"top"]:s,behavior:"smooth"})}return!0}const E=k().isSafari;return y&&!i&&E&&r.isElement&&r.virtual.update(!1,!1,n),r.setTransition(t),r.setTranslate(w),r.updateActiveIndex(n),r.updateSlidesClasses(),r.emit("beforeTransitionStart",t,a),r.transitionStart(s,b),0===t?r.transitionEnd(s,b):r.animating||(r.animating=!0,r.onSlideToWrapperTransitionEnd||(r.onSlideToWrapperTransitionEnd=function(e){r&&!r.destroyed&&e.target===this&&(r.wrapperEl.removeEventListener("transitionend",r.onSlideToWrapperTransitionEnd),r.onSlideToWrapperTransitionEnd=null,delete r.onSlideToWrapperTransitionEnd,r.transitionEnd(s,b))}),r.wrapperEl.addEventListener("transitionend",r.onSlideToWrapperTransitionEnd)),!0},slideToLoop:function(e=0,t,s=!0,a){if("string"==typeof e){e=parseInt(e,10)}const i=this;if(i.destroyed)return;void 0===t&&(t=i.params.speed);const r=i.grid&&i.params.grid&&i.params.grid.rows>1;let n=e;if(i.params.loop)if(i.virtual&&i.params.virtual.enabled)n+=i.virtual.slidesBefore;else{let e;if(r){const t=n*i.params.grid.rows;e=i.slides.find(e=>1*e.getAttribute("data-swiper-slide-index")===t).column}else e=i.getSlideIndexByData(n);const t=r?Math.ceil(i.slides.length/i.params.grid.rows):i.slides.length,{centeredSlides:s,slidesOffsetBefore:l,slidesOffsetAfter:o}=i.params,d=s||!!l||!!o;let c=i.params.slidesPerView;"auto"===c?c=i.slidesPerViewDynamic():(c=Math.ceil(parseFloat(i.params.slidesPerView,10)),d&&c%2==0&&(c+=1));let p=t-e1*t.getAttribute("data-swiper-slide-index")===e).column}else n=i.getSlideIndexByData(n)}return requestAnimationFrame(()=>{i.slideTo(n,t,s,a)}),i},slideNext:function(e,t=!0,s){const a=this,{enabled:i,params:r,animating:n}=a;if(!i||a.destroyed)return a;void 0===e&&(e=a.params.speed);let l=r.slidesPerGroup;"auto"===r.slidesPerView&&1===r.slidesPerGroup&&r.slidesPerGroupAuto&&(l=Math.max(a.slidesPerViewDynamic("current",!0),1));const o=a.activeIndex{a.slideTo(a.activeIndex+o,e,t,s)}),!0}return r.rewind&&a.isEnd?a.slideTo(0,e,t,s):a.slideTo(a.activeIndex+o,e,t,s)},slidePrev:function(e,t=!0,s){const a=this,{params:i,snapGrid:r,slidesGrid:n,rtlTranslate:l,enabled:o,animating:d}=a;if(!o||a.destroyed)return a;void 0===e&&(e=a.params.speed);const c=a.virtual&&i.virtual.enabled;if(i.loop){if(d&&!c&&i.loopPreventsSliding)return!1;a.loopFix({direction:"prev"}),a._clientLeft=a.wrapperEl.clientLeft}function p(e){return e<0?-Math.floor(Math.abs(e)):Math.floor(e)}const u=p(l?a.translate:-a.translate),m=r.map(e=>p(e)),h=i.freeMode&&i.freeMode.enabled;let f=r[m.indexOf(u)-1];if(void 0===f&&(i.cssMode||h)){let e;r.forEach((t,s)=>{u>=t&&(e=s)}),void 0!==e&&(f=h?r[e]:r[e>0?e-1:e])}let g=0;if(void 0!==f&&(g=n.indexOf(f),g<0&&(g=a.activeIndex-1),"auto"===i.slidesPerView&&1===i.slidesPerGroup&&i.slidesPerGroupAuto&&(g=g-a.slidesPerViewDynamic("previous",!0)+1,g=Math.max(g,0))),i.rewind&&a.isBeginning){const i=a.params.virtual&&a.params.virtual.enabled&&a.virtual?a.virtual.slides.length-1:a.slides.length-1;return a.slideTo(i,e,t,s)}return i.loop&&0===a.activeIndex&&i.cssMode?(requestAnimationFrame(()=>{a.slideTo(g,e,t,s)}),!0):a.slideTo(g,e,t,s)},slideReset:function(e,t=!0,s){const a=this;if(!a.destroyed)return void 0===e&&(e=a.params.speed),a.slideTo(a.activeIndex,e,t,s)},slideToClosest:function(e,t=!0,s,a=.5){const i=this;if(i.destroyed)return;void 0===e&&(e=i.params.speed);let r=i.activeIndex;const n=Math.min(i.params.slidesPerGroupSkip,r),l=n+Math.floor((r-n)/i.params.slidesPerGroup),o=i.rtlTranslate?i.translate:-i.translate;if(o>=i.snapGrid[l]){const e=i.snapGrid[l];o-e>(i.snapGrid[l+1]-e)*a&&(r+=i.params.slidesPerGroup)}else{const e=i.snapGrid[l-1];o-e<=(i.snapGrid[l]-e)*a&&(r-=i.params.slidesPerGroup)}return r=Math.max(r,0),r=Math.min(r,i.slidesGrid.length-1),i.slideTo(r,e,t,s)},slideToClickedSlide:function(){const e=this;if(e.destroyed)return;const{params:t,slidesEl:s}=e,a="auto"===t.slidesPerView?e.slidesPerViewDynamic():t.slidesPerView;let i,r=e.getSlideIndexWhenGrid(e.clickedIndex);const n=e.isElement?"swiper-slide":`.${t.slideClass}`,o=e.grid&&e.params.grid&&e.params.grid.rows>1;if(t.loop){if(e.animating)return;i=parseInt(e.clickedSlide.getAttribute("data-swiper-slide-index"),10),t.centeredSlides?e.slideToLoop(i):r>(o?(e.slides.length-a)/2-(e.params.grid.rows-1):e.slides.length-a)?(e.loopFix(),r=e.getSlideIndex(g(s,`${n}[data-swiper-slide-index="${i}"]`)[0]),l(()=>{e.slideTo(r)})):e.slideTo(r)}else e.slideTo(r)}};var q={loopCreate:function(e,t){const s=this,{params:a,slidesEl:i}=s;if(!a.loop||s.virtual&&s.params.virtual.enabled)return;const r=()=>{g(i,`.${a.slideClass}, swiper-slide`).forEach((e,t)=>{e.setAttribute("data-swiper-slide-index",t)})},n=s.grid&&a.grid&&a.grid.rows>1;a.loopAddBlankSlides&&(a.slidesPerGroup>1||n)&&(()=>{const e=g(i,`.${a.slideBlankClass}`);e.forEach(e=>{e.remove()}),e.length>0&&(s.recalcSlides(),s.updateSlides())})();const l=a.slidesPerGroup*(n?a.grid.rows:1),o=s.slides.length%l!==0,d=n&&s.slides.length%a.grid.rows!==0,c=e=>{for(let t=0;t1;d.lengthe.classList.contains(m.slideActiveClass))):L=i;const I="next"===s||!s,z="prev"===s||!s;let A=0,$=0;const k=(S?d[i].column:i)+(b&&void 0===a?-y/2+.5:0);if(k=0;t-=1)d[t].column===e&&T.push(t)}else T.push(C-t-1)}}else if(k+y>C-x){$=Math.max(k-(C-2*x),E),P&&($=Math.max($,y-C+w+1));for(let e=0;e<$;e+=1){const t=e-Math.floor(e/C)*C;S?d.forEach((e,s)=>{e.column===t&&M.push(s)}):M.push(t)}}if(o.__preventObserver__=!0,requestAnimationFrame(()=>{o.__preventObserver__=!1}),"cards"===o.params.effect&&d.length{d[e].swiperLoopMoveDOM=!0,u.prepend(d[e]),d[e].swiperLoopMoveDOM=!1}),I&&M.forEach(e=>{d[e].swiperLoopMoveDOM=!0,u.append(d[e]),d[e].swiperLoopMoveDOM=!1}),o.recalcSlides(),"auto"===m.slidesPerView?o.updateSlides():S&&(T.length>0&&z||M.length>0&&I)&&o.slides.forEach((e,t)=>{o.grid.updateSlide(t,e,o.slides)}),m.watchSlidesProgress&&o.updateSlidesOffset(),t)if(T.length>0&&z){if(void 0===e){const e=o.slidesGrid[L],t=o.slidesGrid[L+A]-e;l?o.setTranslate(o.translate-t):(o.slideTo(L+Math.ceil(A),0,!1,!0),a&&(o.touchEventsData.startTranslate=o.touchEventsData.startTranslate-t,o.touchEventsData.currentTranslate=o.touchEventsData.currentTranslate-t))}else if(a){const e=S?T.length/m.grid.rows:T.length;o.slideTo(o.activeIndex+e,0,!1,!0),o.touchEventsData.currentTranslate=o.translate}}else if(M.length>0&&I)if(void 0===e){const e=o.slidesGrid[L],t=o.slidesGrid[L-$]-e;l?o.setTranslate(o.translate-t):(o.slideTo(L-$,0,!1,!0),a&&(o.touchEventsData.startTranslate=o.touchEventsData.startTranslate-t,o.touchEventsData.currentTranslate=o.touchEventsData.currentTranslate-t))}else{const e=S?M.length/m.grid.rows:M.length;o.slideTo(o.activeIndex-e,0,!1,!0)}if(o.allowSlidePrev=c,o.allowSlideNext=p,o.controller&&o.controller.control&&!n){const r={slideRealIndex:e,direction:s,setTranslate:a,activeSlideIndex:i,byController:!0};Array.isArray(o.controller.control)?o.controller.control.forEach(e=>{!e.destroyed&&e.params.loop&&e.loopFix({...r,slideTo:e.params.slidesPerView===m.slidesPerView&&t})}):o.controller.control instanceof o.constructor&&o.controller.control.params.loop&&o.controller.control.loopFix({...r,slideTo:o.controller.control.params.slidesPerView===m.slidesPerView&&t})}o.emit("loopFix")},loopDestroy:function(){const e=this,{params:t,slidesEl:s}=e;if(!t.loop||!s||e.virtual&&e.params.virtual.enabled)return;e.recalcSlides();const a=[];e.slides.forEach(e=>{const t=void 0===e.swiperSlideIndex?1*e.getAttribute("data-swiper-slide-index"):e.swiperSlideIndex;a[t]=e}),e.slides.forEach(e=>{e.removeAttribute("data-swiper-slide-index")}),a.forEach(e=>{s.append(e)}),e.recalcSlides(),e.slideTo(e.realIndex,0)}};function _(e,t,s){const a=r(),{params:i}=e,n=i.edgeSwipeDetection,l=i.edgeSwipeThreshold;return!n||!(s<=l||s>=a.innerWidth-l)||"prevent"===n&&(t.preventDefault(),!0)}function F(e){const t=this;if(t.destroyed)return;const s=a();let i=e;i.originalEvent&&(i=i.originalEvent);const n=t.touchEventsData;if("pointerdown"===i.type){if(null!==n.pointerId&&n.pointerId!==i.pointerId)return;n.pointerId=i.pointerId}else"touchstart"===i.type&&1===i.targetTouches.length&&(n.touchId=i.targetTouches[0].identifier);if("touchstart"===i.type)return void _(t,i,i.targetTouches[0].pageX);const{params:l,touches:d,enabled:c}=t;if(!c)return;if(!l.simulateTouch&&"mouse"===i.pointerType)return;if(t.animating&&l.preventInteractionOnTransition)return;!t.animating&&l.cssMode&&l.loop&&t.loopFix();let p=i.target;if("wrapper"===l.touchEventsTarget&&!function(e,t){const s=r();let a=t.contains(e);!a&&s.HTMLSlotElement&&t instanceof HTMLSlotElement&&(a=[...t.assignedElements()].includes(e),a||(a=function(e,t){const s=[t];for(;s.length>0;){const t=s.shift();if(e===t)return!0;s.push(...t.children,...t.shadowRoot?t.shadowRoot.children:[],...t.assignedElements?t.assignedElements():[])}}(e,t)));return a}(p,t.wrapperEl))return;if("which"in i&&3===i.which)return;if("button"in i&&i.button>0)return;if(n.isTouched&&n.isMoved)return;const u=!!l.noSwipingClass&&""!==l.noSwipingClass,m=i.composedPath?i.composedPath():i.path;u&&i.target&&i.target.shadowRoot&&m&&(p=m[0]);const h=l.noSwipingSelector?l.noSwipingSelector:`.${l.noSwipingClass}`,f=!(!i.target||!i.target.shadowRoot);if(l.noSwiping&&(f?function(e,t=this){return function t(s){if(!s||s===a()||s===r())return null;s.assignedSlot&&(s=s.assignedSlot);const i=s.closest(e);return i||s.getRootNode?i||t(s.getRootNode().host):null}(t)}(h,p):p.closest(h)))return void(t.allowClick=!0);if(l.swipeHandler&&!p.closest(l.swipeHandler))return;d.currentX=i.pageX,d.currentY=i.pageY;const g=d.currentX,v=d.currentY;if(!_(t,i,g))return;Object.assign(n,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),d.startX=g,d.startY=v,n.touchStartTime=o(),t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,l.threshold>0&&(n.allowThresholdMove=!1);let w=!0;p.matches(n.focusableElements)&&(w=!1,"SELECT"===p.nodeName&&(n.isTouched=!1)),s.activeElement&&s.activeElement.matches(n.focusableElements)&&s.activeElement!==p&&("mouse"===i.pointerType||"mouse"!==i.pointerType&&!p.matches(n.focusableElements))&&s.activeElement.blur();const b=w&&t.allowTouchMove&&l.touchStartPreventDefault;!l.touchStartForcePreventDefault&&!b||p.isContentEditable||i.preventDefault(),l.freeMode&&l.freeMode.enabled&&t.freeMode&&t.animating&&!l.cssMode&&t.freeMode.onTouchStart(),t.emit("touchStart",i)}function W(e){const t=a(),s=this;if(s.destroyed)return;const i=s.touchEventsData,{params:r,touches:n,rtlTranslate:l,enabled:d}=s;if(!d)return;if(!r.simulateTouch&&"mouse"===e.pointerType)return;let c,p=e;if(p.originalEvent&&(p=p.originalEvent),"pointermove"===p.type){if(null!==i.touchId)return;if(p.pointerId!==i.pointerId)return}if("touchmove"===p.type){if(c=[...p.changedTouches].find(e=>e.identifier===i.touchId),!c||c.identifier!==i.touchId)return}else c=p;if(!i.isTouched)return void(i.startMoving&&i.isScrolling&&s.emit("touchMoveOpposite",p));const u=c.pageX,m=c.pageY;if(p.preventedByNestedSwiper)return n.startX=u,void(n.startY=m);if(!s.allowTouchMove)return p.target.matches(i.focusableElements)||(s.allowClick=!1),void(i.isTouched&&(Object.assign(n,{startX:u,startY:m,currentX:u,currentY:m}),i.touchStartTime=o()));if(r.touchReleaseOnEdges&&!r.loop)if(s.isVertical()){if(mn.startY&&s.translate>=s.minTranslate())return i.isTouched=!1,void(i.isMoved=!1)}else{if(l&&(u>n.startX&&-s.translate<=s.maxTranslate()||u=s.minTranslate()))return;if(!l&&(un.startX&&s.translate>=s.minTranslate()))return}if(t.activeElement&&t.activeElement.matches(i.focusableElements)&&t.activeElement!==p.target&&"mouse"!==p.pointerType&&t.activeElement.blur(),t.activeElement&&p.target===t.activeElement&&p.target.matches(i.focusableElements))return i.isMoved=!0,void(s.allowClick=!1);i.allowTouchCallbacks&&s.emit("touchMove",p),n.previousX=n.currentX,n.previousY=n.currentY,n.currentX=u,n.currentY=m;const h=n.currentX-n.startX,f=n.currentY-n.startY;if(s.params.threshold&&Math.sqrt(h**2+f**2)=25&&(e=180*Math.atan2(Math.abs(f),Math.abs(h))/Math.PI,i.isScrolling=s.isHorizontal()?e>r.touchAngle:90-e>r.touchAngle)}if(i.isScrolling&&s.emit("touchMoveOpposite",p),void 0===i.startMoving&&(n.currentX===n.startX&&n.currentY===n.startY||(i.startMoving=!0)),i.isScrolling||"touchmove"===p.type&&i.preventTouchMoveFromPointerMove)return void(i.isTouched=!1);if(!i.startMoving)return;s.allowClick=!1,!r.cssMode&&p.cancelable&&p.preventDefault(),r.touchMoveStopPropagation&&!r.nested&&p.stopPropagation();let g=s.isHorizontal()?h:f,v=s.isHorizontal()?n.currentX-n.previousX:n.currentY-n.previousY;r.oneWayMovement&&(g=Math.abs(g)*(l?1:-1),v=Math.abs(v)*(l?1:-1)),n.diff=g,g*=r.touchRatio,l&&(g=-g,v=-v);const w=s.touchesDirection;s.swipeDirection=g>0?"prev":"next",s.touchesDirection=v>0?"prev":"next";const b=s.params.loop&&!r.cssMode,y="next"===s.touchesDirection&&s.allowSlideNext||"prev"===s.touchesDirection&&s.allowSlidePrev;if(!i.isMoved){if(b&&y&&s.loopFix({direction:s.swipeDirection}),i.startTranslate=s.getTranslate(),s.setTransition(0),s.animating){const e=new window.CustomEvent("transitionend",{bubbles:!0,cancelable:!0,detail:{bySwiperTouchMove:!0}});s.wrapperEl.dispatchEvent(e)}i.allowMomentumBounce=!1,!r.grabCursor||!0!==s.allowSlideNext&&!0!==s.allowSlidePrev||s.setGrabCursor(!0),s.emit("sliderFirstMove",p)}if((new Date).getTime(),!1!==r._loopSwapReset&&i.isMoved&&i.allowThresholdMove&&w!==s.touchesDirection&&b&&y&&Math.abs(g)>=1)return Object.assign(n,{startX:u,startY:m,currentX:u,currentY:m,startTranslate:i.currentTranslate}),i.loopSwapReset=!0,void(i.startTranslate=i.currentTranslate);s.emit("sliderMove",p),i.isMoved=!0,i.currentTranslate=g+i.startTranslate;let E=!0,x=r.resistanceRatio;if(r.touchReleaseOnEdges&&(x=0),g>0?(b&&y&&i.allowThresholdMove&&i.currentTranslate>(r.centeredSlides?s.minTranslate()-s.slidesSizesGrid[s.activeIndex+1]-("auto"!==r.slidesPerView&&s.slides.length-r.slidesPerView>=2?s.slidesSizesGrid[s.activeIndex+1]+s.params.spaceBetween:0)-s.params.spaceBetween:s.minTranslate())&&s.loopFix({direction:"prev",setTranslate:!0,activeSlideIndex:0}),i.currentTranslate>s.minTranslate()&&(E=!1,r.resistance&&(i.currentTranslate=s.minTranslate()-1+(-s.minTranslate()+i.startTranslate+g)**x))):g<0&&(b&&y&&i.allowThresholdMove&&i.currentTranslate<(r.centeredSlides?s.maxTranslate()+s.slidesSizesGrid[s.slidesSizesGrid.length-1]+s.params.spaceBetween+("auto"!==r.slidesPerView&&s.slides.length-r.slidesPerView>=2?s.slidesSizesGrid[s.slidesSizesGrid.length-1]+s.params.spaceBetween:0):s.maxTranslate())&&s.loopFix({direction:"next",setTranslate:!0,activeSlideIndex:s.slides.length-("auto"===r.slidesPerView?s.slidesPerViewDynamic():Math.ceil(parseFloat(r.slidesPerView,10)))}),i.currentTranslatei.startTranslate&&(i.currentTranslate=i.startTranslate),s.allowSlidePrev||s.allowSlideNext||(i.currentTranslate=i.startTranslate),r.threshold>0){if(!(Math.abs(g)>r.threshold||i.allowThresholdMove))return void(i.currentTranslate=i.startTranslate);if(!i.allowThresholdMove)return i.allowThresholdMove=!0,n.startX=n.currentX,n.startY=n.currentY,i.currentTranslate=i.startTranslate,void(n.diff=s.isHorizontal()?n.currentX-n.startX:n.currentY-n.startY)}r.followFinger&&!r.cssMode&&((r.freeMode&&r.freeMode.enabled&&s.freeMode||r.watchSlidesProgress)&&(s.updateActiveIndex(),s.updateSlidesClasses()),r.freeMode&&r.freeMode.enabled&&s.freeMode&&s.freeMode.onTouchMove(),s.updateProgress(i.currentTranslate),s.setTranslate(i.currentTranslate))}function j(e){const t=this;if(t.destroyed)return;const s=t.touchEventsData;let a,i=e;i.originalEvent&&(i=i.originalEvent);if("touchend"===i.type||"touchcancel"===i.type){if(a=[...i.changedTouches].find(e=>e.identifier===s.touchId),!a||a.identifier!==s.touchId)return}else{if(null!==s.touchId)return;if(i.pointerId!==s.pointerId)return;a=i}if(["pointercancel","pointerout","pointerleave","contextmenu"].includes(i.type)){if(!(["pointercancel","contextmenu"].includes(i.type)&&(t.browser.isSafari||t.browser.isWebView)))return}s.pointerId=null,s.touchId=null;const{params:r,touches:n,rtlTranslate:d,slidesGrid:c,enabled:p}=t;if(!p)return;if(!r.simulateTouch&&"mouse"===i.pointerType)return;if(s.allowTouchCallbacks&&t.emit("touchEnd",i),s.allowTouchCallbacks=!1,!s.isTouched)return s.isMoved&&r.grabCursor&&t.setGrabCursor(!1),s.isMoved=!1,void(s.startMoving=!1);r.grabCursor&&s.isMoved&&s.isTouched&&(!0===t.allowSlideNext||!0===t.allowSlidePrev)&&t.setGrabCursor(!1);const u=o(),m=u-s.touchStartTime;if(t.allowClick){const e=i.path||i.composedPath&&i.composedPath();t.updateClickedSlide(e&&e[0]||i.target,e),t.emit("tap click",i),m<300&&u-s.lastClickTime<300&&t.emit("doubleTap doubleClick",i)}if(s.lastClickTime=o(),l(()=>{t.destroyed||(t.allowClick=!0)}),!s.isTouched||!s.isMoved||!t.swipeDirection||0===n.diff&&!s.loopSwapReset||s.currentTranslate===s.startTranslate&&!s.loopSwapReset)return s.isTouched=!1,s.isMoved=!1,void(s.startMoving=!1);let h;if(s.isTouched=!1,s.isMoved=!1,s.startMoving=!1,h=r.followFinger?d?t.translate:-t.translate:-s.currentTranslate,r.cssMode)return;if(r.freeMode&&r.freeMode.enabled)return void t.freeMode.onTouchEnd({currentPos:h});const f=h>=-t.maxTranslate()&&!t.params.loop;let g=0,v=t.slidesSizesGrid[0];for(let e=0;e=c[e]&&h=c[e])&&(g=e,v=c[c.length-1]-c[c.length-2])}let w=null,b=null;r.rewind&&(t.isBeginning?b=r.virtual&&r.virtual.enabled&&t.virtual?t.virtual.slides.length-1:t.slides.length-1:t.isEnd&&(w=0));const y=(h-c[g])/v,E=gr.longSwipesMs){if(!r.longSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&(y>=r.longSwipesRatio?t.slideTo(r.rewind&&t.isEnd?w:g+E):t.slideTo(g)),"prev"===t.swipeDirection&&(y>1-r.longSwipesRatio?t.slideTo(g+E):null!==b&&y<0&&Math.abs(y)>r.longSwipesRatio?t.slideTo(b):t.slideTo(g))}else{if(!r.shortSwipes)return void t.slideTo(t.activeIndex);t.navigation&&(i.target===t.navigation.nextEl||i.target===t.navigation.prevEl)?i.target===t.navigation.nextEl?t.slideTo(g+E):t.slideTo(g):("next"===t.swipeDirection&&t.slideTo(null!==w?w:g+E),"prev"===t.swipeDirection&&t.slideTo(null!==b?b:g))}}function U(){const e=this,{params:t,el:s}=e;if(s&&0===s.offsetWidth)return;t.breakpoints&&e.setBreakpoint();const{allowSlideNext:a,allowSlidePrev:i,snapGrid:r}=e,n=e.virtual&&e.params.virtual.enabled;e.allowSlideNext=!0,e.allowSlidePrev=!0,e.updateSize(),e.updateSlides(),e.updateSlidesClasses();const l=n&&t.loop;if(!("auto"===t.slidesPerView||t.slidesPerView>1)||!e.isEnd||e.isBeginning||e.params.centeredSlides||l)e.params.loop&&!n?e.slideToLoop(e.realIndex,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0);else{const t=n?e.virtual.slides:e.slides;e.slideTo(t.length-1,0,!1,!0)}e.autoplay&&e.autoplay.running&&e.autoplay.paused&&(clearTimeout(e.autoplay.resizeTimeout),e.autoplay.resizeTimeout=setTimeout(()=>{e.autoplay&&e.autoplay.running&&e.autoplay.paused&&e.autoplay.resume()},500)),e.allowSlidePrev=i,e.allowSlideNext=a,e.params.watchOverflow&&r!==e.snapGrid&&e.checkOverflow()}function K(e){const t=this;t.destroyed||t.enabled&&(t.allowClick||(t.params.preventClicks&&e.preventDefault(),t.params.preventClicksPropagation&&t.animating&&(e.stopPropagation(),e.stopImmediatePropagation())))}function Z(){const e=this;if(e.destroyed)return;const{wrapperEl:t,rtlTranslate:s,enabled:a}=e;if(!a)return;let i;e.previousTranslate=e.translate,e.isHorizontal()?e.translate=-t.scrollLeft:e.translate=-t.scrollTop,0===e.translate&&(e.translate=0),e.updateActiveIndex(),e.updateSlidesClasses();const r=e.maxTranslate()-e.minTranslate();i=0===r?0:(e.translate-e.minTranslate())/r,i!==e.progress&&e.updateProgress(s?-e.translate:e.translate),e.emit("setTranslate",e.translate,!1)}function Q(e){const t=this;t.destroyed||(X(t,e.target),t.params.cssMode||"auto"!==t.params.slidesPerView&&!t.params.autoHeight||t.update())}function J(){const e=this;e.destroyed||e.documentTouchHandlerProceeded||(e.documentTouchHandlerProceeded=!0,e.params.touchReleaseOnEdges&&(e.el.style.touchAction="auto"))}const ee=(e,t)=>{const s=a(),{params:i,el:r,wrapperEl:n,device:l}=e,o=!!i.nested,d="on"===t?"addEventListener":"removeEventListener",c=t;r&&"string"!=typeof r&&(s[d]("touchstart",e.onDocumentTouchStart,{passive:!1,capture:o}),r[d]("touchstart",e.onTouchStart,{passive:!1}),r[d]("pointerdown",e.onTouchStart,{passive:!1}),s[d]("touchmove",e.onTouchMove,{passive:!1,capture:o}),s[d]("pointermove",e.onTouchMove,{passive:!1,capture:o}),s[d]("touchend",e.onTouchEnd,{passive:!0}),s[d]("pointerup",e.onTouchEnd,{passive:!0}),s[d]("pointercancel",e.onTouchEnd,{passive:!0}),s[d]("touchcancel",e.onTouchEnd,{passive:!0}),s[d]("pointerout",e.onTouchEnd,{passive:!0}),s[d]("pointerleave",e.onTouchEnd,{passive:!0}),s[d]("contextmenu",e.onTouchEnd,{passive:!0}),(i.preventClicks||i.preventClicksPropagation)&&r[d]("click",e.onClick,!0),i.cssMode&&n[d]("scroll",e.onScroll),i.updateOnWindowResize?e[c](l.ios||l.android?"resize orientationchange observerUpdate":"resize observerUpdate",U,!0):e[c]("observerUpdate",U,!0),r[d]("load",e.onLoad,{capture:!0}))};const te=(e,t)=>e.grid&&t.grid&&t.grid.rows>1;var se={init:!0,direction:"horizontal",oneWayMovement:!1,swiperElementNodeName:"SWIPER-CONTAINER",touchEventsTarget:"wrapper",initialSlide:0,speed:300,cssMode:!1,updateOnWindowResize:!0,resizeObserver:!0,nested:!1,createElements:!1,eventsPrefix:"swiper",enabled:!0,focusableElements:"input, select, option, textarea, button, video, label",width:null,height:null,preventInteractionOnTransition:!1,userAgent:null,url:null,edgeSwipeDetection:!1,edgeSwipeThreshold:20,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,breakpointsBase:"window",spaceBetween:0,slidesPerView:1,slidesPerGroup:1,slidesPerGroupSkip:0,slidesPerGroupAuto:!1,centeredSlides:!1,centeredSlidesBounds:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,snapToSlideEdge:!1,watchOverflow:!0,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,allowTouchMove:!0,threshold:5,touchMoveStopPropagation:!1,touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchReleaseOnEdges:!1,uniqueNavElements:!0,resistance:!0,resistanceRatio:.85,watchSlidesProgress:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,loop:!1,loopAddBlankSlides:!0,loopAdditionalSlides:0,loopPreventsSliding:!0,rewind:!1,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,maxBackfaceHiddenSlides:10,containerModifierClass:"swiper-",slideClass:"swiper-slide",slideBlankClass:"swiper-slide-blank",slideActiveClass:"swiper-slide-active",slideVisibleClass:"swiper-slide-visible",slideFullyVisibleClass:"swiper-slide-fully-visible",slideNextClass:"swiper-slide-next",slidePrevClass:"swiper-slide-prev",wrapperClass:"swiper-wrapper",lazyPreloaderClass:"swiper-lazy-preloader",lazyPreloadPrevNext:0,runCallbacksOnInit:!0,_emitClasses:!1};function ae(e,t){return function(s={}){const a=Object.keys(s)[0],i=s[a];"object"==typeof i&&null!==i?(!0===e[a]&&(e[a]={enabled:!0}),"navigation"===a&&e[a]&&e[a].enabled&&!e[a].prevEl&&!e[a].nextEl&&(e[a].auto=!0),["pagination","scrollbar"].indexOf(a)>=0&&e[a]&&e[a].enabled&&!e[a].el&&(e[a].auto=!0),a in e&&"enabled"in i?("object"!=typeof e[a]||"enabled"in e[a]||(e[a].enabled=!0),e[a]||(e[a]={enabled:!1}),u(t,s)):u(t,s)):u(t,s)}}const ie={eventsEmitter:O,update:H,translate:N,transition:{setTransition:function(e,t){const s=this;s.params.cssMode||(s.wrapperEl.style.transitionDuration=`${e}ms`,s.wrapperEl.style.transitionDelay=0===e?"0ms":""),s.emit("setTransition",e,t)},transitionStart:function(e=!0,t){const s=this,{params:a}=s;a.cssMode||(a.autoHeight&&s.updateAutoHeight(),R({swiper:s,runCallbacks:e,direction:t,step:"Start"}))},transitionEnd:function(e=!0,t){const s=this,{params:a}=s;s.animating=!1,a.cssMode||(s.setTransition(0),R({swiper:s,runCallbacks:e,direction:t,step:"End"}))}},slide:V,loop:q,grabCursor:{setGrabCursor:function(e){const t=this;if(!t.params.simulateTouch||t.params.watchOverflow&&t.isLocked||t.params.cssMode)return;const s="container"===t.params.touchEventsTarget?t.el:t.wrapperEl;t.isElement&&(t.__preventObserver__=!0),s.style.cursor="move",s.style.cursor=e?"grabbing":"grab",t.isElement&&requestAnimationFrame(()=>{t.__preventObserver__=!1})},unsetGrabCursor:function(){const e=this;e.params.watchOverflow&&e.isLocked||e.params.cssMode||(e.isElement&&(e.__preventObserver__=!0),e["container"===e.params.touchEventsTarget?"el":"wrapperEl"].style.cursor="",e.isElement&&requestAnimationFrame(()=>{e.__preventObserver__=!1}))}},events:{attachEvents:function(){const e=this,{params:t}=e;e.onTouchStart=F.bind(e),e.onTouchMove=W.bind(e),e.onTouchEnd=j.bind(e),e.onDocumentTouchStart=J.bind(e),t.cssMode&&(e.onScroll=Z.bind(e)),e.onClick=K.bind(e),e.onLoad=Q.bind(e),ee(e,"on")},detachEvents:function(){ee(this,"off")}},breakpoints:{setBreakpoint:function(){const e=this,{realIndex:t,initialized:s,params:i,el:r}=e,n=i.breakpoints;if(!n||n&&0===Object.keys(n).length)return;const l=a(),o="window"!==i.breakpointsBase&&i.breakpointsBase?"container":i.breakpointsBase,d=["window","container"].includes(i.breakpointsBase)||!i.breakpointsBase?e.el:l.querySelector(i.breakpointsBase),c=e.getBreakpoint(n,o,d);if(!c||e.currentBreakpoint===c)return;const p=(c in n?n[c]:void 0)||e.originalParams,m=te(e,i),h=te(e,p),f=e.params.grabCursor,g=p.grabCursor,v=i.enabled;m&&!h?(r.classList.remove(`${i.containerModifierClass}grid`,`${i.containerModifierClass}grid-column`),e.emitContainerClasses()):!m&&h&&(r.classList.add(`${i.containerModifierClass}grid`),(p.grid.fill&&"column"===p.grid.fill||!p.grid.fill&&"column"===i.grid.fill)&&r.classList.add(`${i.containerModifierClass}grid-column`),e.emitContainerClasses()),f&&!g?e.unsetGrabCursor():!f&&g&&e.setGrabCursor(),["navigation","pagination","scrollbar"].forEach(t=>{if(void 0===p[t])return;const s=i[t]&&i[t].enabled,a=p[t]&&p[t].enabled;s&&!a&&e[t].disable(),!s&&a&&e[t].enable()});const w=p.direction&&p.direction!==i.direction,b=i.loop&&(p.slidesPerView!==i.slidesPerView||w),y=i.loop;w&&s&&e.changeDirection(),u(e.params,p);const E=e.params.enabled,x=e.params.loop;Object.assign(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),v&&!E?e.disable():!v&&E&&e.enable(),e.currentBreakpoint=c,e.emit("_beforeBreakpoint",p),s&&(b?(e.loopDestroy(),e.loopCreate(t),e.updateSlides()):!y&&x?(e.loopCreate(t),e.updateSlides()):y&&!x&&e.loopDestroy()),e.emit("breakpoint",p)},getBreakpoint:function(e,t="window",s){if(!e||"container"===t&&!s)return;let a=!1;const i=r(),n="window"===t?i.innerHeight:s.clientHeight,l=Object.keys(e).map(e=>{if("string"==typeof e&&0===e.indexOf("@")){const t=parseFloat(e.substr(1));return{value:n*t,point:e}}return{value:e,point:e}});l.sort((e,t)=>parseInt(e.value,10)-parseInt(t.value,10));for(let e=0;es}else e.isLocked=1===e.snapGrid.length;!0===s.allowSlideNext&&(e.allowSlideNext=!e.isLocked),!0===s.allowSlidePrev&&(e.allowSlidePrev=!e.isLocked),t&&t!==e.isLocked&&(e.isEnd=!1),t!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock")}},classes:{addClasses:function(){const e=this,{classNames:t,params:s,rtl:a,el:i,device:r}=e,n=function(e,t){const s=[];return e.forEach(e=>{"object"==typeof e?Object.keys(e).forEach(a=>{e[a]&&s.push(t+a)}):"string"==typeof e&&s.push(t+e)}),s}(["initialized",s.direction,{"free-mode":e.params.freeMode&&s.freeMode.enabled},{autoheight:s.autoHeight},{rtl:a},{grid:s.grid&&s.grid.rows>1},{"grid-column":s.grid&&s.grid.rows>1&&"column"===s.grid.fill},{android:r.android},{ios:r.ios},{"css-mode":s.cssMode},{centered:s.cssMode&&s.centeredSlides},{"watch-progress":s.watchSlidesProgress}],s.containerModifierClass);t.push(...n),i.classList.add(...t),e.emitContainerClasses()},removeClasses:function(){const{el:e,classNames:t}=this;e&&"string"!=typeof e&&(e.classList.remove(...t),this.emitContainerClasses())}}},re={};class ne{constructor(...e){let t,s;1===e.length&&e[0].constructor&&"Object"===Object.prototype.toString.call(e[0]).slice(8,-1)?s=e[0]:[t,s]=e,s||(s={}),s=u({},s),t&&!s.el&&(s.el=t);const i=a();if(s.el&&"string"==typeof s.el&&i.querySelectorAll(s.el).length>1){const e=[];return i.querySelectorAll(s.el).forEach(t=>{const a=u({},s,{el:t});e.push(new ne(a))}),e}const r=this;r.__swiper__=!0,r.support=A(),r.device=$({userAgent:s.userAgent}),r.browser=k(),r.eventsListeners={},r.eventsAnyListeners=[],r.modules=[...r.__modules__],s.modules&&Array.isArray(s.modules)&&s.modules.forEach(e=>{"function"==typeof e&&r.modules.indexOf(e)<0&&r.modules.push(e)});const n={};r.modules.forEach(e=>{e({params:s,swiper:r,extendParams:ae(s,n),on:r.on.bind(r),once:r.once.bind(r),off:r.off.bind(r),emit:r.emit.bind(r)})});const l=u({},se,n);return r.params=u({},l,re,s),r.originalParams=u({},r.params),r.passedParams=u({},s),r.params&&r.params.on&&Object.keys(r.params.on).forEach(e=>{r.on(e,r.params.on[e])}),r.params&&r.params.onAny&&r.onAny(r.params.onAny),Object.assign(r,{enabled:r.params.enabled,el:t,classNames:[],slides:[],slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:()=>"horizontal"===r.params.direction,isVertical:()=>"vertical"===r.params.direction,activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,cssOverflowAdjustment(){return Math.trunc(this.translate/2**23)*2**23},allowSlideNext:r.params.allowSlideNext,allowSlidePrev:r.params.allowSlidePrev,touchEventsData:{isTouched:void 0,isMoved:void 0,allowTouchCallbacks:void 0,touchStartTime:void 0,isScrolling:void 0,currentTranslate:void 0,startTranslate:void 0,allowThresholdMove:void 0,focusableElements:r.params.focusableElements,lastClickTime:0,clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,startMoving:void 0,pointerId:null,touchId:null},allowClick:!0,allowTouchMove:r.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),r.emit("_swiper"),r.params.init&&r.init(),r}getDirectionLabel(e){return this.isHorizontal()?e:{width:"height","margin-top":"margin-left","margin-bottom ":"margin-right","margin-left":"margin-top","margin-right":"margin-bottom","padding-left":"padding-top","padding-right":"padding-bottom",marginRight:"marginBottom"}[e]}getSlideIndex(e){const{slidesEl:t,params:s}=this,a=E(g(t,`.${s.slideClass}, swiper-slide`)[0]);return E(e)-a}getSlideIndexByData(e){return this.getSlideIndex(this.slides.find(t=>1*t.getAttribute("data-swiper-slide-index")===e))}getSlideIndexWhenGrid(e){return this.grid&&this.params.grid&&this.params.grid.rows>1&&("column"===this.params.grid.fill?e=Math.floor(e/this.params.grid.rows):"row"===this.params.grid.fill&&(e%=Math.ceil(this.slides.length/this.params.grid.rows))),e}recalcSlides(){const{slidesEl:e,params:t}=this;this.slides=g(e,`.${t.slideClass}, swiper-slide`)}enable(){const e=this;e.enabled||(e.enabled=!0,e.params.grabCursor&&e.setGrabCursor(),e.emit("enable"))}disable(){const e=this;e.enabled&&(e.enabled=!1,e.params.grabCursor&&e.unsetGrabCursor(),e.emit("disable"))}setProgress(e,t){const s=this;e=Math.min(Math.max(e,0),1);const a=s.minTranslate(),i=(s.maxTranslate()-a)*e+a;s.translateTo(i,void 0===t?0:t),s.updateActiveIndex(),s.updateSlidesClasses()}emitContainerClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=e.el.className.split(" ").filter(t=>0===t.indexOf("swiper")||0===t.indexOf(e.params.containerModifierClass));e.emit("_containerClasses",t.join(" "))}getSlideClasses(e){const t=this;return t.destroyed?"":e.className.split(" ").filter(e=>0===e.indexOf("swiper-slide")||0===e.indexOf(t.params.slideClass)).join(" ")}emitSlidesClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=[];e.slides.forEach(s=>{const a=e.getSlideClasses(s);t.push({slideEl:s,classNames:a}),e.emit("_slideClass",s,a)}),e.emit("_slideClasses",t)}slidesPerViewDynamic(e="current",t=!1){const{params:s,slides:a,slidesGrid:i,slidesSizesGrid:r,size:n,activeIndex:l}=this;let o=1;if("number"==typeof s.slidesPerView)return s.slidesPerView;if(s.centeredSlides){let e,t=a[l]?Math.ceil(a[l].swiperSlideSize):0;for(let s=l+1;sn&&(e=!0));for(let s=l-1;s>=0;s-=1)a[s]&&!e&&(t+=a[s].swiperSlideSize,o+=1,t>n&&(e=!0))}else if("current"===e)for(let e=l+1;e=0;e-=1){i[l]-i[e]{t.complete&&X(e,t)}),e.updateSize(),e.updateSlides(),e.updateProgress(),e.updateSlidesClasses(),s.freeMode&&s.freeMode.enabled&&!s.cssMode)a(),s.autoHeight&&e.updateAutoHeight();else{if(("auto"===s.slidesPerView||s.slidesPerView>1)&&e.isEnd&&!s.centeredSlides){const t=e.virtual&&s.virtual.enabled?e.virtual.slides:e.slides;i=e.slideTo(t.length-1,0,!1,!0)}else i=e.slideTo(e.activeIndex,0,!1,!0);i||a()}s.watchOverflow&&t!==e.snapGrid&&e.checkOverflow(),e.emit("update")}changeDirection(e,t=!0){const s=this,a=s.params.direction;return e||(e="horizontal"===a?"vertical":"horizontal"),e===a||"horizontal"!==e&&"vertical"!==e||(s.el.classList.remove(`${s.params.containerModifierClass}${a}`),s.el.classList.add(`${s.params.containerModifierClass}${e}`),s.emitContainerClasses(),s.params.direction=e,s.slides.forEach(t=>{"vertical"===e?t.style.width="":t.style.height=""}),s.emit("changeDirection"),t&&s.update()),s}changeLanguageDirection(e){const t=this;t.rtl&&"rtl"===e||!t.rtl&&"ltr"===e||(t.rtl="rtl"===e,t.rtlTranslate="horizontal"===t.params.direction&&t.rtl,t.rtl?(t.el.classList.add(`${t.params.containerModifierClass}rtl`),t.el.dir="rtl"):(t.el.classList.remove(`${t.params.containerModifierClass}rtl`),t.el.dir="ltr"),t.update())}mount(e){const t=this;if(t.mounted)return!0;let s=e||t.params.el;if("string"==typeof s&&(s=document.querySelector(s)),!s)return!1;s.swiper=t,s.parentNode&&s.parentNode.host&&s.parentNode.host.nodeName===t.params.swiperElementNodeName.toUpperCase()&&(t.isElement=!0);const a=()=>`.${(t.params.wrapperClass||"").trim().split(" ").join(".")}`;let i=(()=>{if(s&&s.shadowRoot&&s.shadowRoot.querySelector){return s.shadowRoot.querySelector(a())}return g(s,a())[0]})();return!i&&t.params.createElements&&(i=w("div",t.params.wrapperClass),s.append(i),g(s,`.${t.params.slideClass}`).forEach(e=>{i.append(e)})),Object.assign(t,{el:s,wrapperEl:i,slidesEl:t.isElement&&!s.parentNode.host.slideSlots?s.parentNode.host:i,hostEl:t.isElement?s.parentNode.host:s,mounted:!0,rtl:"rtl"===s.dir.toLowerCase()||"rtl"===y(s,"direction"),rtlTranslate:"horizontal"===t.params.direction&&("rtl"===s.dir.toLowerCase()||"rtl"===y(s,"direction")),wrongRTL:"-webkit-box"===y(i,"display")}),!0}init(e){const t=this;if(t.initialized)return t;if(!1===t.mount(e))return t;t.emit("beforeInit"),t.params.breakpoints&&t.setBreakpoint(),t.addClasses(),t.updateSize(),t.updateSlides(),t.params.watchOverflow&&t.checkOverflow(),t.params.grabCursor&&t.enabled&&t.setGrabCursor(),t.params.loop&&t.virtual&&t.params.virtual.enabled?t.slideTo(t.params.initialSlide+t.virtual.slidesBefore,0,t.params.runCallbacksOnInit,!1,!0):t.slideTo(t.params.initialSlide,0,t.params.runCallbacksOnInit,!1,!0),t.params.loop&&t.loopCreate(void 0,!0),t.attachEvents();const s=[...t.el.querySelectorAll('[loading="lazy"]')];return t.isElement&&s.push(...t.hostEl.querySelectorAll('[loading="lazy"]')),s.forEach(e=>{e.complete?X(t,e):e.addEventListener("load",e=>{X(t,e.target)})}),Y(t),t.initialized=!0,Y(t),t.emit("init"),t.emit("afterInit"),t}destroy(e=!0,t=!0){const s=this,{params:a,el:i,wrapperEl:r,slides:n}=s;return void 0===s.params||s.destroyed||(s.emit("beforeDestroy"),s.initialized=!1,s.detachEvents(),a.loop&&s.loopDestroy(),t&&(s.removeClasses(),i&&"string"!=typeof i&&i.removeAttribute("style"),r&&r.removeAttribute("style"),n&&n.length&&n.forEach(e=>{e.classList.remove(a.slideVisibleClass,a.slideFullyVisibleClass,a.slideActiveClass,a.slideNextClass,a.slidePrevClass),e.removeAttribute("style"),e.removeAttribute("data-swiper-slide-index")})),s.emit("destroy"),Object.keys(s.eventsListeners).forEach(e=>{s.off(e)}),!1!==e&&(s.el&&"string"!=typeof s.el&&(s.el.swiper=null),function(e){const t=e;Object.keys(t).forEach(e=>{try{t[e]=null}catch(e){}try{delete t[e]}catch(e){}})}(s)),s.destroyed=!0),null}static extendDefaults(e){u(re,e)}static get extendedDefaults(){return re}static get defaults(){return se}static installModule(e){ne.prototype.__modules__||(ne.prototype.__modules__=[]);const t=ne.prototype.__modules__;"function"==typeof e&&t.indexOf(e)<0&&t.push(e)}static use(e){return Array.isArray(e)?(e.forEach(e=>ne.installModule(e)),ne):(ne.installModule(e),ne)}}function le(e,t,s,a){return e.params.createElements&&Object.keys(a).forEach(i=>{if(!s[i]&&!0===s.auto){let r=g(e.el,`.${a[i]}`)[0];r||(r=w("div",a[i]),r.className=a[i],e.el.append(r)),s[i]=r,t[i]=r}}),s}Object.keys(ie).forEach(e=>{Object.keys(ie[e]).forEach(t=>{ne.prototype[t]=ie[e][t]})}),ne.use([function({swiper:e,on:t,emit:s}){const a=r();let i=null,n=null;const l=()=>{e&&!e.destroyed&&e.initialized&&(s("beforeResize"),s("resize"))},o=()=>{e&&!e.destroyed&&e.initialized&&s("orientationchange")};t("init",()=>{e.params.resizeObserver&&void 0!==a.ResizeObserver?e&&!e.destroyed&&e.initialized&&(i=new ResizeObserver(t=>{n=a.requestAnimationFrame(()=>{const{width:s,height:a}=e;let i=s,r=a;t.forEach(({contentBoxSize:t,contentRect:s,target:a})=>{a&&a!==e.el||(i=s?s.width:(t[0]||t).inlineSize,r=s?s.height:(t[0]||t).blockSize)}),i===s&&r===a||l()})}),i.observe(e.el)):(a.addEventListener("resize",l),a.addEventListener("orientationchange",o))}),t("destroy",()=>{n&&a.cancelAnimationFrame(n),i&&i.unobserve&&e.el&&(i.unobserve(e.el),i=null),a.removeEventListener("resize",l),a.removeEventListener("orientationchange",o)})},function({swiper:e,extendParams:t,on:s,emit:a}){const i=[],n=r(),l=(t,s={})=>{const r=new(n.MutationObserver||n.WebkitMutationObserver)(t=>{if(e.__preventObserver__)return;if(1===t.length)return void a("observerUpdate",t[0]);const s=function(){a("observerUpdate",t[0])};n.requestAnimationFrame?n.requestAnimationFrame(s):n.setTimeout(s,0)});r.observe(t,{attributes:void 0===s.attributes||s.attributes,childList:e.isElement||(void 0===s.childList||s).childList,characterData:void 0===s.characterData||s.characterData}),i.push(r)};t({observer:!1,observeParents:!1,observeSlideChildren:!1}),s("init",()=>{if(e.params.observer){if(e.params.observeParents){const t=x(e.hostEl);for(let e=0;e{i.forEach(e=>{e.disconnect()}),i.splice(0,i.length)})}]);const oe='';function de(e=""){return`.${e.trim().replace(/([\.:!+\/()[\]#>~*^$|=,'"@{}\\])/g,"\\$1").replace(/ /g,".")}`}function ce(e){const t=this,{params:s,slidesEl:a}=t;s.loop&&t.loopDestroy();const i=e=>{if("string"==typeof e){const t=document.createElement("div");P(t,e),a.append(t.children[0]),P(t,"")}else a.append(e)};if("object"==typeof e&&"length"in e)for(let t=0;t{if("string"==typeof e){const t=document.createElement("div");P(t,e),i.prepend(t.children[0]),P(t,"")}else i.prepend(e)};if("object"==typeof e&&"length"in e){for(let t=0;t=l)return void s.appendSlide(t);let o=n>e?n+1:n;const d=[];for(let t=l-1;t>=e;t-=1){const e=s.slides[t];e.remove(),d.unshift(e)}if("object"==typeof t&&"length"in t){for(let e=0;ee?n+t.length:n}else r.append(t);for(let e=0;e{if(s.params.effect!==t)return;s.classNames.push(`${s.params.containerModifierClass}${t}`),l&&l()&&s.classNames.push(`${s.params.containerModifierClass}3d`);const e=n?n():{};Object.assign(s.params,e),Object.assign(s.originalParams,e)}),a("setTranslate _virtualUpdated",()=>{s.params.effect===t&&i()}),a("setTransition",(e,a)=>{s.params.effect===t&&r(a)}),a("transitionEnd",()=>{if(s.params.effect===t&&o){if(!d||!d().slideShadows)return;s.slides.forEach(e=>{e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach(e=>e.remove())}),o()}}),a("virtualUpdate",()=>{s.params.effect===t&&(s.slides.length||(c=!0),requestAnimationFrame(()=>{c&&s.slides&&s.slides.length&&(i(),c=!1)}))})}function ge(e,t){const s=f(t);return s!==t&&(s.style.backfaceVisibility="hidden",s.style["-webkit-backface-visibility"]="hidden"),s}function ve({swiper:e,duration:t,transformElements:s,allSlides:a}){const{activeIndex:i}=e;if(e.params.virtualTranslate&&0!==t){let t,r=!1;t=a?s:s.filter(t=>{const s=t.classList.contains("swiper-slide-transform")?(t=>{if(!t.parentElement)return e.slides.find(e=>e.shadowRoot&&e.shadowRoot===t.parentNode);return t.parentElement})(t):t;return e.getSlideIndex(s)===i}),t.forEach(t=>{S(t,()=>{if(r)return;if(!e||e.destroyed)return;r=!0,e.animating=!1;const t=new window.CustomEvent("transitionend",{bubbles:!0,cancelable:!0});e.wrapperEl.dispatchEvent(t)})})}}function we(e,t,s){const a=`swiper-slide-shadow${s?`-${s}`:""}${e?` swiper-slide-shadow-${e}`:""}`,i=f(t);let r=i.querySelector(`.${a.split(" ").join(".")}`);return r||(r=w("div",a.split(" ")),i.append(r)),r}const be=[function({swiper:e,extendParams:t,on:s,emit:i}){let r;t({virtual:{enabled:!1,slides:[],cache:!0,slidesPerViewAutoSlideSize:320,renderSlide:null,renderExternal:null,renderExternalUpdate:!0,addSlidesBefore:0,addSlidesAfter:0}});const n=a();e.virtual={cache:{},from:void 0,to:void 0,slides:[],offset:0,slidesGrid:[]};const l=n.createElement("div");function o(t,s){const a=e.params.virtual;if(a.cache&&e.virtual.cache[s])return e.virtual.cache[s];let i;return a.renderSlide?(i=a.renderSlide.call(e,t,s),"string"==typeof i&&(P(l,i),i=l.children[0])):i=e.isElement?w("swiper-slide"):w("div",e.params.slideClass),i.setAttribute("data-swiper-slide-index",s),a.renderSlide||P(i,t),a.cache&&(e.virtual.cache[s]=i),i}function d(t,s,a){const{slidesPerGroup:r,centeredSlides:n,slidesPerView:l,loop:d,initialSlide:c}=e.params;if(s&&!d&&c>0)return;const{addSlidesBefore:p,addSlidesAfter:u,slidesPerViewAutoSlideSize:m}=e.params.virtual,{from:h,to:f,slides:v,slidesGrid:w,offset:b}=e.virtual;e.params.cssMode||e.updateActiveIndex();const y=void 0===a?e.activeIndex||0:a;let E,x,S,T;if(E=e.rtlTranslate?"right":e.isHorizontal()?"left":"top","auto"===l)if(m){let t=e.size;t||(t=e.isHorizontal()?e.el.getBoundingClientRect().width:e.el.getBoundingClientRect().height),x=Math.max(1,Math.ceil(t/m))}else x=1;else x=l;n?(S=Math.floor(x/2)+r+u,T=Math.floor(x/2)+r+p):(S=x+(r-1)+u,T=(d?x:r)+p);let M=y-T,C=y+S;d||(M=Math.max(M,0),C=Math.min(C,v.length-1));let P=(e.slidesGrid[M]||0)-(e.slidesGrid[0]||0);function L(){e.updateSlides(),e.updateProgress(),e.updateSlidesClasses(),i("virtualUpdate")}if(d&&y>=T?(M-=T,n||(P+=e.slidesGrid[0])):d&&y{t.style[E]=P-Math.abs(e.cssOverflowAdjustment())+"px"}),e.updateProgress(),void i("virtualUpdate");if(e.params.virtual.renderExternal)return e.params.virtual.renderExternal.call(e,{offset:P,from:M,to:C,slides:function(){const e=[];for(let t=M;t<=C;t+=1)e.push(v[t]);return e}()}),void(e.params.virtual.renderExternalUpdate?L():i("virtualUpdate"));const I=[],z=[],A=e=>{let t=e;return e<0?t=v.length+e:t>=v.length&&(t-=v.length),t};if(t)e.slides.filter(t=>t.matches(`.${e.params.slideClass}, swiper-slide`)).forEach(e=>{e.remove()});else for(let t=h;t<=f;t+=1)if(tC){const s=A(t);e.slides.filter(t=>t.matches(`.${e.params.slideClass}[data-swiper-slide-index="${s}"], swiper-slide[data-swiper-slide-index="${s}"]`)).forEach(e=>{e.remove()})}const $=d?-v.length:0,k=d?2*v.length:v.length;for(let e=$;e=M&&e<=C){const s=A(e);void 0===f||t?z.push(s):(e>f&&z.push(s),e{e.slidesEl.append(o(v[t],t))}),d)for(let t=I.length-1;t>=0;t-=1){const s=I[t];e.slidesEl.prepend(o(v[s],s))}else I.sort((e,t)=>t-e),I.forEach(t=>{e.slidesEl.prepend(o(v[t],t))});g(e.slidesEl,".swiper-slide, swiper-slide").forEach(t=>{t.style[E]=P-Math.abs(e.cssOverflowAdjustment())+"px"}),L()}s("beforeInit",()=>{if(!e.params.virtual.enabled)return;let t;if(void 0===e.passedParams.virtual.slides){const s=[...e.slidesEl.children].filter(t=>t.matches(`.${e.params.slideClass}, swiper-slide`));s&&s.length&&(e.virtual.slides=[...s],t=!0,s.forEach((t,s)=>{t.setAttribute("data-swiper-slide-index",s),e.virtual.cache[s]=t,t.remove()}))}t||(e.virtual.slides=e.params.virtual.slides),e.classNames.push(`${e.params.containerModifierClass}virtual`),e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0,d(!1,!0)}),s("setTranslate",()=>{e.params.virtual.enabled&&(e.params.cssMode&&!e._immediateVirtual?(clearTimeout(r),r=setTimeout(()=>{d()},100)):d())}),s("init update resize",()=>{e.params.virtual.enabled&&e.params.cssMode&&m(e.wrapperEl,"--swiper-virtual-size",`${e.virtualSize}px`)}),Object.assign(e.virtual,{appendSlide:function(t){if("object"==typeof t&&"length"in t)for(let s=0;s{const a=t[e],r=a.getAttribute("data-swiper-slide-index");r&&a.setAttribute("data-swiper-slide-index",parseInt(r,10)+i),s[parseInt(e,10)+i]=a}),e.virtual.cache=s}d(!0),e.slideTo(a,0)},removeSlide:function(t){if(null==t)return;let s=e.activeIndex;if(Array.isArray(t))for(let a=t.length-1;a>=0;a-=1)e.params.virtual.cache&&(delete e.virtual.cache[t[a]],Object.keys(e.virtual.cache).forEach(s=>{s>t&&(e.virtual.cache[s-1]=e.virtual.cache[s],e.virtual.cache[s-1].setAttribute("data-swiper-slide-index",s-1),delete e.virtual.cache[s])})),e.virtual.slides.splice(t[a],1),t[a]{s>t&&(e.virtual.cache[s-1]=e.virtual.cache[s],e.virtual.cache[s-1].setAttribute("data-swiper-slide-index",s-1),delete e.virtual.cache[s])})),e.virtual.slides.splice(t,1),t0&&0===x(e.el,`.${e.params.slideActiveClass}`).length)return;const a=e.el,i=a.clientWidth,r=a.clientHeight,n=l.innerWidth,o=l.innerHeight,d=b(a);s&&(d.left-=a.scrollLeft);const c=[[d.left,d.top],[d.left+i,d.top],[d.left,d.top+r],[d.left+i,d.top+r]];for(let e=0;e=0&&s[0]<=n&&s[1]>=0&&s[1]<=o){if(0===s[0]&&0===s[1])continue;t=!0}}if(!t)return}const f=e.params.keyboard.speed;e.isHorizontal()?((d||c||p||u)&&(a.preventDefault?a.preventDefault():a.returnValue=!1),((c||u)&&!s||(d||p)&&s)&&e.slideNext(f),((d||p)&&!s||(c||u)&&s)&&e.slidePrev(f)):((d||c||m||h)&&(a.preventDefault?a.preventDefault():a.returnValue=!1),(c||h)&&e.slideNext(f),(d||m)&&e.slidePrev(f)),i("keyPress",r)}function d(){e.keyboard.enabled||(n.addEventListener("keydown",o),e.keyboard.enabled=!0)}function c(){e.keyboard.enabled&&(n.removeEventListener("keydown",o),e.keyboard.enabled=!1)}e.keyboard={enabled:!1},t({keyboard:{enabled:!1,onlyInViewport:!0,pageUpDown:!0,speed:void 0}}),s("init",()=>{e.params.keyboard.enabled&&d()}),s("destroy",()=>{e.keyboard.enabled&&c()}),Object.assign(e.keyboard,{enable:d,disable:c})},function({swiper:e,extendParams:t,on:s,emit:a}){const i=r();let n;t({mousewheel:{enabled:!1,releaseOnEdges:!1,invert:!1,forceToAxis:!1,sensitivity:1,eventsTarget:"container",thresholdDelta:null,thresholdTime:null,noMousewheelClass:"swiper-no-mousewheel"}}),e.mousewheel={enabled:!1};let d,c=o();const p=[];function u(){e.enabled&&(e.mouseEntered=!0)}function m(){e.enabled&&(e.mouseEntered=!1)}function h(t){return!(e.params.mousewheel.thresholdDelta&&t.delta=6&&o()-c<60||(t.direction<0?e.isEnd&&!e.params.loop||e.animating||(e.slideNext(),a("scroll",t.raw)):e.isBeginning&&!e.params.loop||e.animating||(e.slidePrev(),a("scroll",t.raw)),c=(new i.Date).getTime(),!1)))}function f(t){let s=t,i=!0;if(!e.enabled)return;if(t.target.closest(`.${e.params.mousewheel.noMousewheelClass}`))return;const r=e.params.mousewheel;e.params.cssMode&&s.preventDefault();let c=e.el;"container"!==e.params.mousewheel.eventsTarget&&(c=document.querySelector(e.params.mousewheel.eventsTarget));const u=c&&c.contains(s.target);if(!e.mouseEntered&&!u&&!r.releaseOnEdges)return!0;s.originalEvent&&(s=s.originalEvent);let m=0;const f=e.rtlTranslate?-1:1,g=function(e){let t=0,s=0,a=0,i=0;return"detail"in e&&(s=e.detail),"wheelDelta"in e&&(s=-e.wheelDelta/120),"wheelDeltaY"in e&&(s=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=s,s=0),a=10*t,i=10*s,"deltaY"in e&&(i=e.deltaY),"deltaX"in e&&(a=e.deltaX),e.shiftKey&&!a&&(a=i,i=0),(a||i)&&e.deltaMode&&(1===e.deltaMode?(a*=40,i*=40):(a*=800,i*=800)),a&&!t&&(t=a<1?-1:1),i&&!s&&(s=i<1?-1:1),{spinX:t,spinY:s,pixelX:a,pixelY:i}}(s);if(r.forceToAxis)if(e.isHorizontal()){if(!(Math.abs(g.pixelX)>Math.abs(g.pixelY)))return!0;m=-g.pixelX*f}else{if(!(Math.abs(g.pixelY)>Math.abs(g.pixelX)))return!0;m=-g.pixelY}else m=Math.abs(g.pixelX)>Math.abs(g.pixelY)?-g.pixelX*f:-g.pixelY;if(0===m)return!0;r.invert&&(m=-m);let v=e.getTranslate()+m*r.sensitivity;if(v>=e.minTranslate()&&(v=e.minTranslate()),v<=e.maxTranslate()&&(v=e.maxTranslate()),i=!!e.params.loop||!(v===e.minTranslate()||v===e.maxTranslate()),i&&e.params.nested&&s.stopPropagation(),e.params.freeMode&&e.params.freeMode.enabled){const t={time:o(),delta:Math.abs(m),direction:Math.sign(m)},i=d&&t.time=e.minTranslate()&&(o=e.minTranslate()),o<=e.maxTranslate()&&(o=e.maxTranslate()),e.setTransition(0),e.setTranslate(o),e.updateProgress(),e.updateActiveIndex(),e.updateSlidesClasses(),(!c&&e.isBeginning||!u&&e.isEnd)&&e.updateSlidesClasses(),e.params.loop&&e.loopFix({direction:t.direction<0?"next":"prev",byMousewheel:!0}),e.params.freeMode.sticky){clearTimeout(n),n=void 0,p.length>=15&&p.shift();const s=p.length?p[p.length-1]:void 0,a=p[0];if(p.push(t),s&&(t.delta>s.delta||t.direction!==s.direction))p.splice(0);else if(p.length>=15&&t.time-a.time<500&&a.delta-t.delta>=1&&t.delta<=6){const s=m>0?.8:.2;d=t,p.splice(0),n=l(()=>{!e.destroyed&&e.params&&e.slideToClosest(e.params.speed,!0,void 0,s)},0)}n||(n=l(()=>{if(e.destroyed||!e.params)return;d=t,p.splice(0),e.slideToClosest(e.params.speed,!0,void 0,.5)},500))}if(i||a("scroll",s),e.params.autoplay&&e.params.autoplay.disableOnInteraction&&e.autoplay.stop(),r.releaseOnEdges&&(o===e.minTranslate()||o===e.maxTranslate()))return!0}}else{const s={time:o(),delta:Math.abs(m),direction:Math.sign(m),raw:t};p.length>=2&&p.shift();const a=p.length?p[p.length-1]:void 0;if(p.push(s),a?(s.direction!==a.direction||s.delta>a.delta||s.time>a.time+150)&&h(s):h(s),function(t){const s=e.params.mousewheel;if(t.direction<0){if(e.isEnd&&!e.params.loop&&s.releaseOnEdges)return!0}else if(e.isBeginning&&!e.params.loop&&s.releaseOnEdges)return!0;return!1}(s))return!0}return s.preventDefault?s.preventDefault():s.returnValue=!1,!1}function g(t){let s=e.el;"container"!==e.params.mousewheel.eventsTarget&&(s=document.querySelector(e.params.mousewheel.eventsTarget)),s[t]("mouseenter",u),s[t]("mouseleave",m),s[t]("wheel",f)}function v(){return e.params.cssMode?(e.wrapperEl.removeEventListener("wheel",f),!0):!e.mousewheel.enabled&&(g("addEventListener"),e.mousewheel.enabled=!0,!0)}function w(){return e.params.cssMode?(e.wrapperEl.addEventListener(event,f),!0):!!e.mousewheel.enabled&&(g("removeEventListener"),e.mousewheel.enabled=!1,!0)}s("init",()=>{!e.params.mousewheel.enabled&&e.params.cssMode&&w(),e.params.mousewheel.enabled&&v()}),s("destroy",()=>{e.params.cssMode&&v(),e.mousewheel.enabled&&w()}),Object.assign(e.mousewheel,{enable:v,disable:w})},function({swiper:e,extendParams:t,on:s,emit:a}){function i(t){let s;return t&&"string"==typeof t&&e.isElement&&(s=e.el.querySelector(t)||e.hostEl.querySelector(t),s)?s:(t&&("string"==typeof t&&(s=[...document.querySelectorAll(t)]),e.params.uniqueNavElements&&"string"==typeof t&&s&&s.length>1&&1===e.el.querySelectorAll(t).length?s=e.el.querySelector(t):s&&1===s.length&&(s=s[0])),t&&!s?t:s)}function r(t,s){const a=e.params.navigation;(t=M(t)).forEach(t=>{t&&(t.classList[s?"add":"remove"](...a.disabledClass.split(" ")),"BUTTON"===t.tagName&&(t.disabled=s),e.params.watchOverflow&&e.enabled&&t.classList[e.isLocked?"add":"remove"](a.lockClass))})}function n(){const{nextEl:t,prevEl:s}=e.navigation;if(e.params.loop)return r(s,!1),void r(t,!1);r(s,e.isBeginning&&!e.params.rewind),r(t,e.isEnd&&!e.params.rewind)}function l(t){t.preventDefault(),(!e.isBeginning||e.params.loop||e.params.rewind)&&(e.slidePrev(),a("navigationPrev"))}function o(t){t.preventDefault(),(!e.isEnd||e.params.loop||e.params.rewind)&&(e.slideNext(),a("navigationNext"))}function d(){const t=e.params.navigation;if(e.params.navigation=le(e,e.originalParams.navigation,e.params.navigation,{nextEl:"swiper-button-next",prevEl:"swiper-button-prev"}),!t.nextEl&&!t.prevEl)return;let s=i(t.nextEl),a=i(t.prevEl);Object.assign(e.navigation,{nextEl:s,prevEl:a}),s=M(s),a=M(a);const r=(s,a)=>{if(s){if(t.addIcons&&s.matches(".swiper-button-next,.swiper-button-prev")&&!s.querySelector("svg")){const e=document.createElement("div");P(e,oe),s.appendChild(e.querySelector("svg")),e.remove()}s.addEventListener("click","next"===a?o:l)}!e.enabled&&s&&s.classList.add(...t.lockClass.split(" "))};s.forEach(e=>r(e,"next")),a.forEach(e=>r(e,"prev"))}function c(){let{nextEl:t,prevEl:s}=e.navigation;t=M(t),s=M(s);const a=(t,s)=>{t.removeEventListener("click","next"===s?o:l),t.classList.remove(...e.params.navigation.disabledClass.split(" "))};t.forEach(e=>a(e,"next")),s.forEach(e=>a(e,"prev"))}t({navigation:{nextEl:null,prevEl:null,addIcons:!0,hideOnClick:!1,disabledClass:"swiper-button-disabled",hiddenClass:"swiper-button-hidden",lockClass:"swiper-button-lock",navigationDisabledClass:"swiper-navigation-disabled"}}),e.navigation={nextEl:null,prevEl:null,arrowSvg:oe},s("init",()=>{!1===e.params.navigation.enabled?p():(d(),n())}),s("toEdge fromEdge lock unlock",()=>{n()}),s("destroy",()=>{c()}),s("enable disable",()=>{let{nextEl:t,prevEl:s}=e.navigation;t=M(t),s=M(s),e.enabled?n():[...t,...s].filter(e=>!!e).forEach(t=>t.classList.add(e.params.navigation.lockClass))}),s("click",(t,s)=>{let{nextEl:i,prevEl:r}=e.navigation;i=M(i),r=M(r);const n=s.target;let l=r.includes(n)||i.includes(n);if(e.isElement&&!l){const e=s.path||s.composedPath&&s.composedPath();e&&(l=e.find(e=>i.includes(e)||r.includes(e)))}if(e.params.navigation.hideOnClick&&!l){if(e.pagination&&e.params.pagination&&e.params.pagination.clickable&&(e.pagination.el===n||e.pagination.el.contains(n)))return;let t;i.length?t=i[0].classList.contains(e.params.navigation.hiddenClass):r.length&&(t=r[0].classList.contains(e.params.navigation.hiddenClass)),a(!0===t?"navigationShow":"navigationHide"),[...i,...r].filter(e=>!!e).forEach(t=>t.classList.toggle(e.params.navigation.hiddenClass))}});const p=()=>{e.el.classList.add(...e.params.navigation.navigationDisabledClass.split(" ")),c()};Object.assign(e.navigation,{enable:()=>{e.el.classList.remove(...e.params.navigation.navigationDisabledClass.split(" ")),d(),n()},disable:p,update:n,init:d,destroy:c})},function({swiper:e,extendParams:t,on:s,emit:a}){const i="swiper-pagination";let r;t({pagination:{el:null,bulletElement:"span",clickable:!1,hideOnClick:!1,renderBullet:null,renderProgressbar:null,renderFraction:null,renderCustom:null,progressbarOpposite:!1,type:"bullets",dynamicBullets:!1,dynamicMainBullets:1,formatFractionCurrent:e=>e,formatFractionTotal:e=>e,bulletClass:`${i}-bullet`,bulletActiveClass:`${i}-bullet-active`,modifierClass:`${i}-`,currentClass:`${i}-current`,totalClass:`${i}-total`,hiddenClass:`${i}-hidden`,progressbarFillClass:`${i}-progressbar-fill`,progressbarOppositeClass:`${i}-progressbar-opposite`,clickableClass:`${i}-clickable`,lockClass:`${i}-lock`,horizontalClass:`${i}-horizontal`,verticalClass:`${i}-vertical`,paginationDisabledClass:`${i}-disabled`}}),e.pagination={el:null,bullets:[]};let n=0;function l(){return!e.params.pagination.el||!e.pagination.el||Array.isArray(e.pagination.el)&&0===e.pagination.el.length}function o(t,s){const{bulletActiveClass:a}=e.params.pagination;t&&(t=t[("prev"===s?"previous":"next")+"ElementSibling"])&&(t.classList.add(`${a}-${s}`),(t=t[("prev"===s?"previous":"next")+"ElementSibling"])&&t.classList.add(`${a}-${s}-${s}`))}function d(t){const s=t.target.closest(de(e.params.pagination.bulletClass));if(!s)return;t.preventDefault();const a=E(s)*e.params.slidesPerGroup;if(e.params.loop){if(e.realIndex===a)return;const t=(i=e.realIndex,r=a,n=e.slides.length,(r%=n)===1+(i%=n)?"next":r===i-1?"previous":void 0);"next"===t?e.slideNext():"previous"===t?e.slidePrev():e.slideToLoop(a)}else e.slideTo(a);var i,r,n}function c(){const t=e.rtl,s=e.params.pagination;if(l())return;let i,d,c=e.pagination.el;c=M(c);const p=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,u=e.params.loop?Math.ceil(p/e.params.slidesPerGroup):e.snapGrid.length;if(e.params.loop?(d=e.previousRealIndex||0,i=e.params.slidesPerGroup>1?Math.floor(e.realIndex/e.params.slidesPerGroup):e.realIndex):void 0!==e.snapIndex?(i=e.snapIndex,d=e.previousSnapIndex):(d=e.previousIndex||0,i=e.activeIndex||0),"bullets"===s.type&&e.pagination.bullets&&e.pagination.bullets.length>0){const a=e.pagination.bullets;let l,p,u;if(s.dynamicBullets&&(r=T(a[0],e.isHorizontal()?"width":"height",!0),c.forEach(t=>{t.style[e.isHorizontal()?"width":"height"]=r*(s.dynamicMainBullets+4)+"px"}),s.dynamicMainBullets>1&&void 0!==d&&(n+=i-(d||0),n>s.dynamicMainBullets-1?n=s.dynamicMainBullets-1:n<0&&(n=0)),l=Math.max(i-n,0),p=l+(Math.min(a.length,s.dynamicMainBullets)-1),u=(p+l)/2),a.forEach(e=>{const t=[...["","-next","-next-next","-prev","-prev-prev","-main"].map(e=>`${s.bulletActiveClass}${e}`)].map(e=>"string"==typeof e&&e.includes(" ")?e.split(" "):e).flat();e.classList.remove(...t)}),c.length>1)a.forEach(t=>{const a=E(t);a===i?t.classList.add(...s.bulletActiveClass.split(" ")):e.isElement&&t.setAttribute("part","bullet"),s.dynamicBullets&&(a>=l&&a<=p&&t.classList.add(...`${s.bulletActiveClass}-main`.split(" ")),a===l&&o(t,"prev"),a===p&&o(t,"next"))});else{const t=a[i];if(t&&t.classList.add(...s.bulletActiveClass.split(" ")),e.isElement&&a.forEach((e,t)=>{e.setAttribute("part",t===i?"bullet-active":"bullet")}),s.dynamicBullets){const e=a[l],t=a[p];for(let e=l;e<=p;e+=1)a[e]&&a[e].classList.add(...`${s.bulletActiveClass}-main`.split(" "));o(e,"prev"),o(t,"next")}}if(s.dynamicBullets){const i=Math.min(a.length,s.dynamicMainBullets+4),n=(r*i-r)/2-u*r,l=t?"right":"left";a.forEach(t=>{t.style[e.isHorizontal()?l:"top"]=`${n}px`})}}c.forEach((t,r)=>{if("fraction"===s.type&&(t.querySelectorAll(de(s.currentClass)).forEach(e=>{e.textContent=s.formatFractionCurrent(i+1)}),t.querySelectorAll(de(s.totalClass)).forEach(e=>{e.textContent=s.formatFractionTotal(u)})),"progressbar"===s.type){let a;a=s.progressbarOpposite?e.isHorizontal()?"vertical":"horizontal":e.isHorizontal()?"horizontal":"vertical";const r=(i+1)/u;let n=1,l=1;"horizontal"===a?n=r:l=r,t.querySelectorAll(de(s.progressbarFillClass)).forEach(t=>{t.style.transform=`translate3d(0,0,0) scaleX(${n}) scaleY(${l})`,t.style.transitionDuration=`${e.params.speed}ms`})}"custom"===s.type&&s.renderCustom?(P(t,s.renderCustom(e,i+1,u)),0===r&&a("paginationRender",t)):(0===r&&a("paginationRender",t),a("paginationUpdate",t)),e.params.watchOverflow&&e.enabled&&t.classList[e.isLocked?"add":"remove"](s.lockClass)})}function p(){const t=e.params.pagination;if(l())return;const s=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.grid&&e.params.grid.rows>1?e.slides.length/Math.ceil(e.params.grid.rows):e.slides.length;let i=e.pagination.el;i=M(i);let r="";if("bullets"===t.type){let a=e.params.loop?Math.ceil(s/e.params.slidesPerGroup):e.snapGrid.length;e.params.freeMode&&e.params.freeMode.enabled&&a>s&&(a=s);for(let s=0;s`}"fraction"===t.type&&(r=t.renderFraction?t.renderFraction.call(e,t.currentClass,t.totalClass):` / `),"progressbar"===t.type&&(r=t.renderProgressbar?t.renderProgressbar.call(e,t.progressbarFillClass):``),e.pagination.bullets=[],i.forEach(s=>{"custom"!==t.type&&P(s,r||""),"bullets"===t.type&&e.pagination.bullets.push(...s.querySelectorAll(de(t.bulletClass)))}),"custom"!==t.type&&a("paginationRender",i[0])}function u(){e.params.pagination=le(e,e.originalParams.pagination,e.params.pagination,{el:"swiper-pagination"});const t=e.params.pagination;if(!t.el)return;let s;"string"==typeof t.el&&e.isElement&&(s=e.el.querySelector(t.el)),s||"string"!=typeof t.el||(s=[...document.querySelectorAll(t.el)]),s||(s=t.el),s&&0!==s.length&&(e.params.uniqueNavElements&&"string"==typeof t.el&&Array.isArray(s)&&s.length>1&&(s=[...e.el.querySelectorAll(t.el)],s.length>1&&(s=s.find(t=>x(t,".swiper")[0]===e.el))),Array.isArray(s)&&1===s.length&&(s=s[0]),Object.assign(e.pagination,{el:s}),s=M(s),s.forEach(s=>{"bullets"===t.type&&t.clickable&&s.classList.add(...(t.clickableClass||"").split(" ")),s.classList.add(t.modifierClass+t.type),s.classList.add(e.isHorizontal()?t.horizontalClass:t.verticalClass),"bullets"===t.type&&t.dynamicBullets&&(s.classList.add(`${t.modifierClass}${t.type}-dynamic`),n=0,t.dynamicMainBullets<1&&(t.dynamicMainBullets=1)),"progressbar"===t.type&&t.progressbarOpposite&&s.classList.add(t.progressbarOppositeClass),t.clickable&&s.addEventListener("click",d),e.enabled||s.classList.add(t.lockClass)}))}function m(){const t=e.params.pagination;if(l())return;let s=e.pagination.el;s&&(s=M(s),s.forEach(s=>{s.classList.remove(t.hiddenClass),s.classList.remove(t.modifierClass+t.type),s.classList.remove(e.isHorizontal()?t.horizontalClass:t.verticalClass),t.clickable&&(s.classList.remove(...(t.clickableClass||"").split(" ")),s.removeEventListener("click",d))})),e.pagination.bullets&&e.pagination.bullets.forEach(e=>e.classList.remove(...t.bulletActiveClass.split(" ")))}s("changeDirection",()=>{if(!e.pagination||!e.pagination.el)return;const t=e.params.pagination;let{el:s}=e.pagination;s=M(s),s.forEach(s=>{s.classList.remove(t.horizontalClass,t.verticalClass),s.classList.add(e.isHorizontal()?t.horizontalClass:t.verticalClass)})}),s("init",()=>{!1===e.params.pagination.enabled?h():(u(),p(),c())}),s("activeIndexChange",()=>{void 0===e.snapIndex&&c()}),s("snapIndexChange",()=>{c()}),s("snapGridLengthChange",()=>{p(),c()}),s("destroy",()=>{m()}),s("enable disable",()=>{let{el:t}=e.pagination;t&&(t=M(t),t.forEach(t=>t.classList[e.enabled?"remove":"add"](e.params.pagination.lockClass)))}),s("lock unlock",()=>{c()}),s("click",(t,s)=>{const i=s.target,r=M(e.pagination.el);if(e.params.pagination.el&&e.params.pagination.hideOnClick&&r&&r.length>0&&!i.classList.contains(e.params.pagination.bulletClass)){if(e.navigation&&(e.navigation.nextEl&&i===e.navigation.nextEl||e.navigation.prevEl&&i===e.navigation.prevEl))return;const t=r[0].classList.contains(e.params.pagination.hiddenClass);a(!0===t?"paginationShow":"paginationHide"),r.forEach(t=>t.classList.toggle(e.params.pagination.hiddenClass))}});const h=()=>{e.el.classList.add(e.params.pagination.paginationDisabledClass);let{el:t}=e.pagination;t&&(t=M(t),t.forEach(t=>t.classList.add(e.params.pagination.paginationDisabledClass))),m()};Object.assign(e.pagination,{enable:()=>{e.el.classList.remove(e.params.pagination.paginationDisabledClass);let{el:t}=e.pagination;t&&(t=M(t),t.forEach(t=>t.classList.remove(e.params.pagination.paginationDisabledClass))),u(),p(),c()},disable:h,render:p,update:c,init:u,destroy:m})},function({swiper:e,extendParams:t,on:s,emit:i}){const r=a();let o,d,c,p,u=!1,m=null,h=null;function f(){if(!e.params.scrollbar.el||!e.scrollbar.el)return;const{scrollbar:t,rtlTranslate:s}=e,{dragEl:a,el:i}=t,r=e.params.scrollbar,n=e.params.loop?e.progressLoop:e.progress;let l=d,o=(c-d)*n;s?(o=-o,o>0?(l=d-o,o=0):-o+d>c&&(l=c+o)):o<0?(l=d+o,o=0):o+d>c&&(l=c-o),e.isHorizontal()?(a.style.transform=`translate3d(${o}px, 0, 0)`,a.style.width=`${l}px`):(a.style.transform=`translate3d(0px, ${o}px, 0)`,a.style.height=`${l}px`),r.hide&&(clearTimeout(m),i.style.opacity=1,m=setTimeout(()=>{i.style.opacity=0,i.style.transitionDuration="400ms"},1e3))}function g(){if(!e.params.scrollbar.el||!e.scrollbar.el)return;const{scrollbar:t}=e,{dragEl:s,el:a}=t;s.style.width="",s.style.height="",c=e.isHorizontal()?a.offsetWidth:a.offsetHeight,p=e.size/(e.virtualSize+e.params.slidesOffsetBefore-(e.params.centeredSlides?e.snapGrid[0]:0)),d="auto"===e.params.scrollbar.dragSize?c*p:parseInt(e.params.scrollbar.dragSize,10),e.isHorizontal()?s.style.width=`${d}px`:s.style.height=`${d}px`,a.style.display=p>=1?"none":"",e.params.scrollbar.hide&&(a.style.opacity=0),e.params.watchOverflow&&e.enabled&&t.el.classList[e.isLocked?"add":"remove"](e.params.scrollbar.lockClass)}function v(t){return e.isHorizontal()?t.clientX:t.clientY}function y(t){const{scrollbar:s,rtlTranslate:a}=e,{el:i}=s;let r;r=(v(t)-b(i)[e.isHorizontal()?"left":"top"]-(null!==o?o:d/2))/(c-d),r=Math.max(Math.min(r,1),0),a&&(r=1-r);const n=e.minTranslate()+(e.maxTranslate()-e.minTranslate())*r;e.updateProgress(n),e.setTranslate(n),e.updateActiveIndex(),e.updateSlidesClasses()}function E(t){const s=e.params.scrollbar,{scrollbar:a,wrapperEl:r}=e,{el:n,dragEl:l}=a;u=!0,o=t.target===l?v(t)-t.target.getBoundingClientRect()[e.isHorizontal()?"left":"top"]:null,t.preventDefault(),t.stopPropagation(),r.style.transitionDuration="100ms",l.style.transitionDuration="100ms",y(t),clearTimeout(h),n.style.transitionDuration="0ms",s.hide&&(n.style.opacity=1),e.params.cssMode&&(e.wrapperEl.style["scroll-snap-type"]="none"),i("scrollbarDragStart",t)}function x(t){const{scrollbar:s,wrapperEl:a}=e,{el:r,dragEl:n}=s;u&&(t.preventDefault&&t.cancelable?t.preventDefault():t.returnValue=!1,y(t),a.style.transitionDuration="0ms",r.style.transitionDuration="0ms",n.style.transitionDuration="0ms",i("scrollbarDragMove",t))}function S(t){const s=e.params.scrollbar,{scrollbar:a,wrapperEl:r}=e,{el:n}=a;u&&(u=!1,e.params.cssMode&&(e.wrapperEl.style["scroll-snap-type"]="",r.style.transitionDuration=""),s.hide&&(clearTimeout(h),h=l(()=>{n.style.opacity=0,n.style.transitionDuration="400ms"},1e3)),i("scrollbarDragEnd",t),s.snapOnRelease&&e.slideToClosest())}function T(t){const{scrollbar:s,params:a}=e,i=s.el;if(!i)return;const n=i,l=!!a.passiveListeners&&{passive:!1,capture:!1},o=!!a.passiveListeners&&{passive:!0,capture:!1};if(!n)return;const d="on"===t?"addEventListener":"removeEventListener";n[d]("pointerdown",E,l),r[d]("pointermove",x,l),r[d]("pointerup",S,o)}function C(){const{scrollbar:t,el:s}=e;e.params.scrollbar=le(e,e.originalParams.scrollbar,e.params.scrollbar,{el:"swiper-scrollbar"});const a=e.params.scrollbar;if(!a.el)return;let i,l;if("string"==typeof a.el&&e.isElement&&(i=e.el.querySelector(a.el)),i||"string"!=typeof a.el)i||(i=a.el);else if(i=r.querySelectorAll(a.el),!i.length)return;e.params.uniqueNavElements&&"string"==typeof a.el&&i.length>1&&1===s.querySelectorAll(a.el).length&&(i=s.querySelector(a.el)),i.length>0&&(i=i[0]),i.classList.add(e.isHorizontal()?a.horizontalClass:a.verticalClass),i&&(l=i.querySelector(de(e.params.scrollbar.dragClass)),l||(l=w("div",e.params.scrollbar.dragClass),i.append(l))),Object.assign(t,{el:i,dragEl:l}),a.draggable&&e.params.scrollbar.el&&e.scrollbar.el&&T("on"),i&&i.classList[e.enabled?"remove":"add"](...n(e.params.scrollbar.lockClass))}function P(){const t=e.params.scrollbar,s=e.scrollbar.el;s&&s.classList.remove(...n(e.isHorizontal()?t.horizontalClass:t.verticalClass)),e.params.scrollbar.el&&e.scrollbar.el&&T("off")}t({scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag",scrollbarDisabledClass:"swiper-scrollbar-disabled",horizontalClass:"swiper-scrollbar-horizontal",verticalClass:"swiper-scrollbar-vertical"}}),e.scrollbar={el:null,dragEl:null},s("changeDirection",()=>{if(!e.scrollbar||!e.scrollbar.el)return;const t=e.params.scrollbar;let{el:s}=e.scrollbar;s=M(s),s.forEach(s=>{s.classList.remove(t.horizontalClass,t.verticalClass),s.classList.add(e.isHorizontal()?t.horizontalClass:t.verticalClass)})}),s("init",()=>{!1===e.params.scrollbar.enabled?L():(C(),g(),f())}),s("update resize observerUpdate lock unlock changeDirection",()=>{g()}),s("setTranslate",()=>{f()}),s("setTransition",(t,s)=>{!function(t){e.params.scrollbar.el&&e.scrollbar.el&&(e.scrollbar.dragEl.style.transitionDuration=`${t}ms`)}(s)}),s("enable disable",()=>{const{el:t}=e.scrollbar;t&&t.classList[e.enabled?"remove":"add"](...n(e.params.scrollbar.lockClass))}),s("destroy",()=>{P()});const L=()=>{e.el.classList.add(...n(e.params.scrollbar.scrollbarDisabledClass)),e.scrollbar.el&&e.scrollbar.el.classList.add(...n(e.params.scrollbar.scrollbarDisabledClass)),P()};Object.assign(e.scrollbar,{enable:()=>{e.el.classList.remove(...n(e.params.scrollbar.scrollbarDisabledClass)),e.scrollbar.el&&e.scrollbar.el.classList.remove(...n(e.params.scrollbar.scrollbarDisabledClass)),C(),g(),f()},disable:L,updateSize:g,setTranslate:f,init:C,destroy:P})},function({swiper:e,extendParams:t,on:s}){t({parallax:{enabled:!1}});const a="[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]",i=(t,s)=>{const{rtl:a}=e,i=a?-1:1,r=t.getAttribute("data-swiper-parallax")||"0";let n=t.getAttribute("data-swiper-parallax-x"),l=t.getAttribute("data-swiper-parallax-y");const o=t.getAttribute("data-swiper-parallax-scale"),d=t.getAttribute("data-swiper-parallax-opacity"),c=t.getAttribute("data-swiper-parallax-rotate");if(n||l?(n=n||"0",l=l||"0"):e.isHorizontal()?(n=r,l="0"):(l=r,n="0"),n=n.indexOf("%")>=0?parseInt(n,10)*s*i+"%":n*s*i+"px",l=l.indexOf("%")>=0?parseInt(l,10)*s+"%":l*s+"px",null!=d){const e=d-(d-1)*(1-Math.abs(s));t.style.opacity=e}let p=`translate3d(${n}, ${l}, 0px)`;if(null!=o){p+=` scale(${o-(o-1)*(1-Math.abs(s))})`}if(c&&null!=c){p+=` rotate(${c*s*-1}deg)`}t.style.transform=p},r=()=>{const{el:t,slides:s,progress:r,snapGrid:n,isElement:l}=e,o=g(t,a);e.isElement&&o.push(...g(e.hostEl,a)),o.forEach(e=>{i(e,r)}),s.forEach((t,s)=>{let l=t.progress;e.params.slidesPerGroup>1&&"auto"!==e.params.slidesPerView&&(l+=Math.ceil(s/2)-r*(n.length-1)),l=Math.min(Math.max(l,-1),1),t.querySelectorAll(`${a}, [data-swiper-parallax-rotate]`).forEach(e=>{i(e,l)})})};s("beforeInit",()=>{e.params.parallax.enabled&&(e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)}),s("init",()=>{e.params.parallax.enabled&&r()}),s("setTranslate",()=>{e.params.parallax.enabled&&r()}),s("setTransition",(t,s)=>{e.params.parallax.enabled&&((t=e.params.speed)=>{const{el:s,hostEl:i}=e,r=[...s.querySelectorAll(a)];e.isElement&&r.push(...i.querySelectorAll(a)),r.forEach(e=>{let s=parseInt(e.getAttribute("data-swiper-parallax-duration"),10)||t;0===t&&(s=0),e.style.transitionDuration=`${s}ms`})})(s)})},function({swiper:e,extendParams:t,on:s,emit:a}){const i=r();t({zoom:{enabled:!1,limitToOriginalSize:!1,maxRatio:3,minRatio:1,panOnMouseMove:!1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}}),e.zoom={enabled:!1};let n,l,o=1,c=!1,p=!1,u={x:0,y:0};const m=[],h={originX:0,originY:0,slideEl:void 0,slideWidth:void 0,slideHeight:void 0,imageEl:void 0,imageWrapEl:void 0,maxRatio:3},f={isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},v={x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0};let w,y=1;function E(){if(m.length<2)return 1;const e=m[0].pageX,t=m[0].pageY,s=m[1].pageX,a=m[1].pageY;return Math.sqrt((s-e)**2+(a-t)**2)}function S(){const t=e.params.zoom,s=h.imageWrapEl.getAttribute("data-swiper-zoom")||t.maxRatio;if(t.limitToOriginalSize&&h.imageEl&&h.imageEl.naturalWidth){const e=h.imageEl.naturalWidth/h.imageEl.offsetWidth;return Math.min(e,s)}return s}function T(t){const s=e.isElement?"swiper-slide":`.${e.params.slideClass}`;return!!t.target.matches(s)||e.slides.filter(e=>e.contains(t.target)).length>0}function M(t){const s=`.${e.params.zoom.containerClass}`;return!!t.target.matches(s)||[...e.hostEl.querySelectorAll(s)].filter(e=>e.contains(t.target)).length>0}function C(t){if("mouse"===t.pointerType&&m.splice(0,m.length),!T(t))return;const s=e.params.zoom;if(n=!1,l=!1,m.push(t),!(m.length<2)){if(n=!0,h.scaleStart=E(),!h.slideEl){h.slideEl=t.target.closest(`.${e.params.slideClass}, swiper-slide`),h.slideEl||(h.slideEl=e.slides[e.activeIndex]);let a=h.slideEl.querySelector(`.${s.containerClass}`);if(a&&(a=a.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]),h.imageEl=a,h.imageWrapEl=a?x(h.imageEl,`.${s.containerClass}`)[0]:void 0,!h.imageWrapEl)return void(h.imageEl=void 0);h.maxRatio=S()}if(h.imageEl){const[e,t]=function(){if(m.length<2)return{x:null,y:null};const e=h.imageEl.getBoundingClientRect();return[(m[0].pageX+(m[1].pageX-m[0].pageX)/2-e.x-i.scrollX)/o,(m[0].pageY+(m[1].pageY-m[0].pageY)/2-e.y-i.scrollY)/o]}();h.originX=e,h.originY=t,h.imageEl.style.transitionDuration="0ms"}c=!0}}function P(t){if(!T(t))return;const s=e.params.zoom,a=e.zoom,i=m.findIndex(e=>e.pointerId===t.pointerId);i>=0&&(m[i]=t),m.length<2||(l=!0,h.scaleMove=E(),h.imageEl&&(a.scale=h.scaleMove/h.scaleStart*o,a.scale>h.maxRatio&&(a.scale=h.maxRatio-1+(a.scale-h.maxRatio+1)**.5),a.scalee.pointerId===t.pointerId);i>=0&&m.splice(i,1),n&&l&&(n=!1,l=!1,h.imageEl&&(a.scale=Math.max(Math.min(a.scale,h.maxRatio),s.minRatio),h.imageEl.style.transitionDuration=`${e.params.speed}ms`,h.imageEl.style.transform=`translate3d(0,0,0) scale(${a.scale})`,o=a.scale,c=!1,a.scale>1&&h.slideEl?h.slideEl.classList.add(`${s.zoomedSlideClass}`):a.scale<=1&&h.slideEl&&h.slideEl.classList.remove(`${s.zoomedSlideClass}`),1===a.scale&&(h.originX=0,h.originY=0,h.slideEl=void 0)))}function I(){e.touchEventsData.preventTouchMoveFromPointerMove=!1}function z(t){const s="mouse"===t.pointerType&&e.params.zoom.panOnMouseMove;if(!T(t)||!M(t))return;const a=e.zoom;if(!h.imageEl)return;if(!f.isTouched||!h.slideEl)return void(s&&$(t));if(s)return void $(t);f.isMoved||(f.width=h.imageEl.offsetWidth||h.imageEl.clientWidth,f.height=h.imageEl.offsetHeight||h.imageEl.clientHeight,f.startX=d(h.imageWrapEl,"x")||0,f.startY=d(h.imageWrapEl,"y")||0,h.slideWidth=h.slideEl.offsetWidth,h.slideHeight=h.slideEl.offsetHeight,h.imageWrapEl.style.transitionDuration="0ms");const i=f.width*a.scale,r=f.height*a.scale;f.minX=Math.min(h.slideWidth/2-i/2,0),f.maxX=-f.minX,f.minY=Math.min(h.slideHeight/2-r/2,0),f.maxY=-f.minY,f.touchesCurrent.x=m.length>0?m[0].pageX:t.pageX,f.touchesCurrent.y=m.length>0?m[0].pageY:t.pageY;if(Math.max(Math.abs(f.touchesCurrent.x-f.touchesStart.x),Math.abs(f.touchesCurrent.y-f.touchesStart.y))>5&&(e.allowClick=!1),!f.isMoved&&!c){if(e.isHorizontal()&&(Math.floor(f.minX)===Math.floor(f.startX)&&f.touchesCurrent.xf.touchesStart.x))return f.isTouched=!1,void I();if(!e.isHorizontal()&&(Math.floor(f.minY)===Math.floor(f.startY)&&f.touchesCurrent.yf.touchesStart.y))return f.isTouched=!1,void I()}t.cancelable&&t.preventDefault(),t.stopPropagation(),clearTimeout(w),e.touchEventsData.preventTouchMoveFromPointerMove=!0,w=setTimeout(()=>{e.destroyed||I()}),f.isMoved=!0;const n=(a.scale-o)/(h.maxRatio-e.params.zoom.minRatio),{originX:l,originY:p}=h;f.currentX=f.touchesCurrent.x-f.touchesStart.x+f.startX+n*(f.width-2*l),f.currentY=f.touchesCurrent.y-f.touchesStart.y+f.startY+n*(f.height-2*p),f.currentXf.maxX&&(f.currentX=f.maxX-1+(f.currentX-f.maxX+1)**.8),f.currentYf.maxY&&(f.currentY=f.maxY-1+(f.currentY-f.maxY+1)**.8),v.prevPositionX||(v.prevPositionX=f.touchesCurrent.x),v.prevPositionY||(v.prevPositionY=f.touchesCurrent.y),v.prevTime||(v.prevTime=Date.now()),v.x=(f.touchesCurrent.x-v.prevPositionX)/(Date.now()-v.prevTime)/2,v.y=(f.touchesCurrent.y-v.prevPositionY)/(Date.now()-v.prevTime)/2,Math.abs(f.touchesCurrent.x-v.prevPositionX)<2&&(v.x=0),Math.abs(f.touchesCurrent.y-v.prevPositionY)<2&&(v.y=0),v.prevPositionX=f.touchesCurrent.x,v.prevPositionY=f.touchesCurrent.y,v.prevTime=Date.now(),h.imageWrapEl.style.transform=`translate3d(${f.currentX}px, ${f.currentY}px,0)`}function A(){const t=e.zoom;h.slideEl&&e.activeIndex!==e.slides.indexOf(h.slideEl)&&(h.imageEl&&(h.imageEl.style.transform="translate3d(0,0,0) scale(1)"),h.imageWrapEl&&(h.imageWrapEl.style.transform="translate3d(0,0,0)"),h.slideEl.classList.remove(`${e.params.zoom.zoomedSlideClass}`),t.scale=1,o=1,h.slideEl=void 0,h.imageEl=void 0,h.imageWrapEl=void 0,h.originX=0,h.originY=0)}function $(e){if(o<=1||!h.imageWrapEl)return;if(!T(e)||!M(e))return;const t=i.getComputedStyle(h.imageWrapEl).transform,s=new i.DOMMatrix(t);if(!p)return p=!0,u.x=e.clientX,u.y=e.clientY,f.startX=s.e,f.startY=s.f,f.width=h.imageEl.offsetWidth||h.imageEl.clientWidth,f.height=h.imageEl.offsetHeight||h.imageEl.clientHeight,h.slideWidth=h.slideEl.offsetWidth,void(h.slideHeight=h.slideEl.offsetHeight);const a=-3*(e.clientX-u.x),r=-3*(e.clientY-u.y),n=f.width*o,l=f.height*o,d=h.slideWidth,c=h.slideHeight,m=Math.min(d/2-n/2,0),g=-m,v=Math.min(c/2-l/2,0),w=-v,b=Math.max(Math.min(f.startX+a,g),m),y=Math.max(Math.min(f.startY+r,w),v);h.imageWrapEl.style.transitionDuration="0ms",h.imageWrapEl.style.transform=`translate3d(${b}px, ${y}px, 0)`,u.x=e.clientX,u.y=e.clientY,f.startX=b,f.startY=y,f.currentX=b,f.currentY=y}function k(t){const s=e.zoom,a=e.params.zoom;if(!h.slideEl){t&&t.target&&(h.slideEl=t.target.closest(`.${e.params.slideClass}, swiper-slide`)),h.slideEl||(e.params.virtual&&e.params.virtual.enabled&&e.virtual?h.slideEl=g(e.slidesEl,`.${e.params.slideActiveClass}`)[0]:h.slideEl=e.slides[e.activeIndex]);let s=h.slideEl.querySelector(`.${a.containerClass}`);s&&(s=s.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]),h.imageEl=s,h.imageWrapEl=s?x(h.imageEl,`.${a.containerClass}`)[0]:void 0}if(!h.imageEl||!h.imageWrapEl)return;let r,n,l,d,c,p,u,m,v,w,y,E,T,M,C,P,L,I;h.maxRatio=S(),e.params.cssMode&&(e.wrapperEl.style.overflow="hidden",e.wrapperEl.style.touchAction="none"),h.slideEl.classList.add(`${a.zoomedSlideClass}`),void 0===f.touchesStart.x&&t?(r=t.pageX,n=t.pageY):(r=f.touchesStart.x,n=f.touchesStart.y);const z=o,A="number"==typeof t?t:null;1===o&&A&&(r=void 0,n=void 0,f.touchesStart.x=void 0,f.touchesStart.y=void 0);const $=S();s.scale=A||$,o=A||$,!t||1===o&&A?(u=0,m=0):(L=h.slideEl.offsetWidth,I=h.slideEl.offsetHeight,l=b(h.slideEl).left+i.scrollX,d=b(h.slideEl).top+i.scrollY,c=l+L/2-r,p=d+I/2-n,v=h.imageEl.offsetWidth||h.imageEl.clientWidth,w=h.imageEl.offsetHeight||h.imageEl.clientHeight,y=v*s.scale,E=w*s.scale,T=Math.min(L/2-y/2,0),M=Math.min(I/2-E/2,0),C=-T,P=-M,z>0&&A&&"number"==typeof f.currentX&&"number"==typeof f.currentY?(u=f.currentX*s.scale/z,m=f.currentY*s.scale/z):(u=c*s.scale,m=p*s.scale),uC&&(u=C),mP&&(m=P)),A&&1===s.scale&&(h.originX=0,h.originY=0),f.currentX=u,f.currentY=m,h.imageWrapEl.style.transitionDuration="300ms",h.imageWrapEl.style.transform=`translate3d(${u}px, ${m}px,0)`,h.imageEl.style.transitionDuration="300ms",h.imageEl.style.transform=`translate3d(0,0,0) scale(${s.scale})`}function O(){const t=e.zoom,s=e.params.zoom;if(!h.slideEl){e.params.virtual&&e.params.virtual.enabled&&e.virtual?h.slideEl=g(e.slidesEl,`.${e.params.slideActiveClass}`)[0]:h.slideEl=e.slides[e.activeIndex];let t=h.slideEl.querySelector(`.${s.containerClass}`);t&&(t=t.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]),h.imageEl=t,h.imageWrapEl=t?x(h.imageEl,`.${s.containerClass}`)[0]:void 0}h.imageEl&&h.imageWrapEl&&(h.maxRatio=S(),e.params.cssMode&&(e.wrapperEl.style.overflow="",e.wrapperEl.style.touchAction=""),t.scale=1,o=1,f.currentX=void 0,f.currentY=void 0,f.touchesStart.x=void 0,f.touchesStart.y=void 0,h.imageWrapEl.style.transitionDuration="300ms",h.imageWrapEl.style.transform="translate3d(0,0,0)",h.imageEl.style.transitionDuration="300ms",h.imageEl.style.transform="translate3d(0,0,0) scale(1)",h.slideEl.classList.remove(`${s.zoomedSlideClass}`),h.slideEl=void 0,h.originX=0,h.originY=0,e.params.zoom.panOnMouseMove&&(u={x:0,y:0},p&&(p=!1,f.startX=0,f.startY=0)))}function D(t){const s=e.zoom;s.scale&&1!==s.scale?O():k(t)}function G(){return{passiveListener:!!e.params.passiveListeners&&{passive:!0,capture:!1},activeListenerWithCapture:!e.params.passiveListeners||{passive:!1,capture:!0}}}function X(){const t=e.zoom;if(t.enabled)return;t.enabled=!0;const{passiveListener:s,activeListenerWithCapture:a}=G();e.wrapperEl.addEventListener("pointerdown",C,s),e.wrapperEl.addEventListener("pointermove",P,a),["pointerup","pointercancel","pointerout"].forEach(t=>{e.wrapperEl.addEventListener(t,L,s)}),e.wrapperEl.addEventListener("pointermove",z,a)}function B(){const t=e.zoom;if(!t.enabled)return;t.enabled=!1;const{passiveListener:s,activeListenerWithCapture:a}=G();e.wrapperEl.removeEventListener("pointerdown",C,s),e.wrapperEl.removeEventListener("pointermove",P,a),["pointerup","pointercancel","pointerout"].forEach(t=>{e.wrapperEl.removeEventListener(t,L,s)}),e.wrapperEl.removeEventListener("pointermove",z,a)}Object.defineProperty(e.zoom,"scale",{get:()=>y,set(e){if(y!==e){const t=h.imageEl,s=h.slideEl;a("zoomChange",e,t,s)}y=e}}),s("init",()=>{e.params.zoom.enabled&&X()}),s("destroy",()=>{B()}),s("touchStart",(t,s)=>{e.zoom.enabled&&function(t){const s=e.device;if(!h.imageEl)return;if(f.isTouched)return;s.android&&t.cancelable&&t.preventDefault(),f.isTouched=!0;const a=m.length>0?m[0]:t;f.touchesStart.x=a.pageX,f.touchesStart.y=a.pageY}(s)}),s("touchEnd",(t,s)=>{e.zoom.enabled&&function(){const t=e.zoom;if(m.length=0,!h.imageEl)return;if(!f.isTouched||!f.isMoved)return f.isTouched=!1,void(f.isMoved=!1);f.isTouched=!1,f.isMoved=!1;let s=300,a=300;const i=v.x*s,r=f.currentX+i,n=v.y*a,l=f.currentY+n;0!==v.x&&(s=Math.abs((r-f.currentX)/v.x)),0!==v.y&&(a=Math.abs((l-f.currentY)/v.y));const o=Math.max(s,a);f.currentX=r,f.currentY=l;const d=f.width*t.scale,c=f.height*t.scale;f.minX=Math.min(h.slideWidth/2-d/2,0),f.maxX=-f.minX,f.minY=Math.min(h.slideHeight/2-c/2,0),f.maxY=-f.minY,f.currentX=Math.max(Math.min(f.currentX,f.maxX),f.minX),f.currentY=Math.max(Math.min(f.currentY,f.maxY),f.minY),h.imageWrapEl.style.transitionDuration=`${o}ms`,h.imageWrapEl.style.transform=`translate3d(${f.currentX}px, ${f.currentY}px,0)`}()}),s("doubleTap",(t,s)=>{!e.animating&&e.params.zoom.enabled&&e.zoom.enabled&&e.params.zoom.toggle&&D(s)}),s("transitionEnd",()=>{e.zoom.enabled&&e.params.zoom.enabled&&A()}),s("slideChange",()=>{e.zoom.enabled&&e.params.zoom.enabled&&e.params.cssMode&&A()}),Object.assign(e.zoom,{enable:X,disable:B,in:k,out:O,toggle:D})},function({swiper:e,extendParams:t,on:s}){function a(e,t){const s=function(){let e,t,s;return(a,i)=>{for(t=-1,e=a.length;e-t>1;)s=e+t>>1,a[s]<=i?t=s:e=s;return e}}();let a,i;return this.x=e,this.y=t,this.lastIndex=e.length-1,this.interpolate=function(e){return e?(i=s(this.x,e),a=i-1,(e-this.x[a])*(this.y[i]-this.y[a])/(this.x[i]-this.x[a])+this.y[a]):0},this}function i(){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)}t({controller:{control:void 0,inverse:!1,by:"slide"}}),e.controller={control:void 0},s("beforeInit",()=>{if("undefined"!=typeof window&&("string"==typeof e.params.controller.control||e.params.controller.control instanceof HTMLElement)){return void("string"==typeof e.params.controller.control?[...document.querySelectorAll(e.params.controller.control)]:[e.params.controller.control]).forEach(t=>{if(e.controller.control||(e.controller.control=[]),t&&t.swiper)e.controller.control.push(t.swiper);else if(t){const s=`${e.params.eventsPrefix}init`,a=i=>{e.controller.control.push(i.detail[0]),e.update(),t.removeEventListener(s,a)};t.addEventListener(s,a)}})}e.controller.control=e.params.controller.control}),s("update",()=>{i()}),s("resize",()=>{i()}),s("observerUpdate",()=>{i()}),s("setTranslate",(t,s,a)=>{e.controller.control&&!e.controller.control.destroyed&&e.controller.setTranslate(s,a)}),s("setTransition",(t,s,a)=>{e.controller.control&&!e.controller.control.destroyed&&e.controller.setTransition(s,a)}),Object.assign(e.controller,{setTranslate:function(t,s){const i=e.controller.control;let r,n;const l=e.constructor;function o(t){if(t.destroyed)return;const s=e.rtlTranslate?-e.translate:e.translate;"slide"===e.params.controller.by&&(!function(t){e.controller.spline=e.params.loop?new a(e.slidesGrid,t.slidesGrid):new a(e.snapGrid,t.snapGrid)}(t),n=-e.controller.spline.interpolate(-s)),n&&"container"!==e.params.controller.by||(r=(t.maxTranslate()-t.minTranslate())/(e.maxTranslate()-e.minTranslate()),!Number.isNaN(r)&&Number.isFinite(r)||(r=1),n=(s-e.minTranslate())*r+t.minTranslate()),e.params.controller.inverse&&(n=t.maxTranslate()-n),t.updateProgress(n),t.setTranslate(n,e),t.updateActiveIndex(),t.updateSlidesClasses()}if(Array.isArray(i))for(let e=0;e{s.updateAutoHeight()}),S(s.wrapperEl,()=>{i&&s.transitionEnd()})))}if(Array.isArray(i))for(r=0;r{e.setAttribute("tabIndex","0")})}function c(e){(e=M(e)).forEach(e=>{e.setAttribute("tabIndex","-1")})}function p(e,t){(e=M(e)).forEach(e=>{e.setAttribute("role",t)})}function u(e,t){(e=M(e)).forEach(e=>{e.setAttribute("aria-roledescription",t)})}function m(e,t){(e=M(e)).forEach(e=>{e.setAttribute("aria-label",t)})}function h(e){(e=M(e)).forEach(e=>{e.setAttribute("aria-disabled",!0)})}function f(e){(e=M(e)).forEach(e=>{e.removeAttribute("aria-disabled")})}function g(t){if(13!==t.keyCode&&32!==t.keyCode)return;const s=e.params.a11y,a=t.target;if(!e.pagination||!e.pagination.el||a!==e.pagination.el&&!e.pagination.el.contains(t.target)||t.target.matches(de(e.params.pagination.bulletClass))){if(e.navigation&&e.navigation.prevEl&&e.navigation.nextEl){const t=M(e.navigation.prevEl);M(e.navigation.nextEl).includes(a)&&(e.isEnd&&!e.params.loop||e.slideNext(),e.isEnd?o(s.lastSlideMessage):o(s.nextSlideMessage)),t.includes(a)&&(e.isBeginning&&!e.params.loop||e.slidePrev(),e.isBeginning?o(s.firstSlideMessage):o(s.prevSlideMessage))}e.pagination&&a.matches(de(e.params.pagination.bulletClass))&&a.click()}}function v(){return e.pagination&&e.pagination.bullets&&e.pagination.bullets.length}function b(){return v()&&e.params.pagination.clickable}const y=(e,t,s)=>{d(e),"BUTTON"!==e.tagName&&(p(e,"button"),e.addEventListener("keydown",g)),m(e,s)},x=t=>{r&&r!==t.target&&!r.contains(t.target)&&(i=!0),e.a11y.clicked=!0},S=()=>{i=!1,requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.destroyed||(e.a11y.clicked=!1)})})},T=e=>{l=(new Date).getTime()},C=t=>{if(e.a11y.clicked||!e.params.a11y.scrollOnFocus)return;if((new Date).getTime()-l<100)return;const s=t.target.closest(`.${e.params.slideClass}, swiper-slide`);if(!s||!e.slides.includes(s))return;r=s;const a=e.virtual&&e.params.virtual.enabled,n=(a?parseInt(s.getAttribute("data-swiper-slide-index"),10):e.slides.indexOf(s))===e.activeIndex,o=e.params.watchSlidesProgress&&e.visibleSlides&&e.visibleSlides.includes(s);n||o||t.sourceCapabilities&&t.sourceCapabilities.firesTouchEvents||(e.isHorizontal()?e.el.scrollLeft=0:e.el.scrollTop=0,requestAnimationFrame(()=>{i||(e.params.loop?e.slideToLoop(e.getSlideIndexWhenGrid(parseInt(s.getAttribute("data-swiper-slide-index"))),0):a?e.slideTo(e.getSlideIndexWhenGrid(parseInt(s.getAttribute("data-swiper-slide-index"),10)),0):e.slideTo(e.getSlideIndexWhenGrid(e.slides.indexOf(s)),0),i=!1)}))},L=()=>{const t=e.params.a11y;t.itemRoleDescriptionMessage&&u(e.slides,t.itemRoleDescriptionMessage),t.slideRole&&p(e.slides,t.slideRole);const s=e.slides.length;t.slideLabelMessage&&e.slides.forEach((a,i)=>{const r=e.params.loop?parseInt(a.getAttribute("data-swiper-slide-index"),10):i;m(a,t.slideLabelMessage.replace(/\{\{index\}\}/,r+1).replace(/\{\{slidesLength\}\}/,s))})},I=()=>{const t=e.params.a11y;e.el.append(n);const s=e.el;t.containerRoleDescriptionMessage&&u(s,t.containerRoleDescriptionMessage),t.containerMessage&&m(s,t.containerMessage),t.containerRole&&p(s,t.containerRole);const i=e.wrapperEl,r=t.id||i.getAttribute("id")||`swiper-wrapper-${function(e=16){return"x".repeat(e).replace(/x/g,()=>Math.round(16*Math.random()).toString(16))}(16)}`;var l;if(l=r,M(i).forEach(e=>{e.setAttribute("id",l)}),t.wrapperLiveRegion){!function(e,t){(e=M(e)).forEach(e=>{e.setAttribute("aria-live",t)})}(i,e.params.autoplay&&e.params.autoplay.enabled?"off":"polite")}L();let{nextEl:o,prevEl:d}=e.navigation?e.navigation:{};if(o=M(o),d=M(d),o&&o.forEach(e=>y(e,0,t.nextSlideMessage)),d&&d.forEach(e=>y(e,0,t.prevSlideMessage)),b()){M(e.pagination.el).forEach(e=>{e.addEventListener("keydown",g)})}a().addEventListener("visibilitychange",T),e.el.addEventListener("focus",C,!0),e.el.addEventListener("pointerdown",x,!0),e.el.addEventListener("pointerup",S,!0)};s("beforeInit",()=>{n=w("span",e.params.a11y.notificationClass),n.setAttribute("aria-live","assertive"),n.setAttribute("aria-atomic","true")}),s("afterInit",()=>{e.params.a11y.enabled&&I()}),s("slidesLengthChange snapGridLengthChange slidesGridLengthChange",()=>{e.params.a11y.enabled&&L()}),s("fromEdge toEdge afterInit lock unlock",()=>{e.params.a11y.enabled&&function(){if(e.params.loop||e.params.rewind||!e.navigation)return;const{nextEl:t,prevEl:s}=e.navigation;s&&(e.isBeginning?(h(s),c(s)):(f(s),d(s))),t&&(e.isEnd?(h(t),c(t)):(f(t),d(t)))}()}),s("paginationUpdate",()=>{e.params.a11y.enabled&&function(){const t=e.params.a11y;v()&&e.pagination.bullets.forEach(s=>{e.params.pagination.clickable&&(d(s),e.params.pagination.renderBullet||(p(s,"button"),m(s,t.paginationBulletMessage.replace(/\{\{index\}\}/,E(s)+1)))),s.matches(de(e.params.pagination.bulletActiveClass))?s.setAttribute("aria-current","true"):s.removeAttribute("aria-current")})}()}),s("destroy",()=>{e.params.a11y.enabled&&function(){n&&n.remove();let{nextEl:t,prevEl:s}=e.navigation?e.navigation:{};t=M(t),s=M(s),t&&t.forEach(e=>e.removeEventListener("keydown",g)),s&&s.forEach(e=>e.removeEventListener("keydown",g)),b()&&M(e.pagination.el).forEach(e=>{e.removeEventListener("keydown",g)});a().removeEventListener("visibilitychange",T),e.el&&"string"!=typeof e.el&&(e.el.removeEventListener("focus",C,!0),e.el.removeEventListener("pointerdown",x,!0),e.el.removeEventListener("pointerup",S,!0))}()})},function({swiper:e,extendParams:t,on:s}){t({history:{enabled:!1,root:"",replaceState:!1,key:"slides",keepQuery:!1}});let a=!1,i={};const n=e=>e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,""),l=e=>{const t=r();let s;s=e?new URL(e):t.location;const a=s.pathname.slice(1).split("/").filter(e=>""!==e),i=a.length;return{key:a[i-2],value:a[i-1]}},o=(t,s)=>{const i=r();if(!a||!e.params.history.enabled)return;let l;l=e.params.url?new URL(e.params.url):i.location;const o=e.virtual&&e.params.virtual.enabled?e.slidesEl.querySelector(`[data-swiper-slide-index="${s}"]`):e.slides[s];let d=n(o.getAttribute("data-history"));if(e.params.history.root.length>0){let s=e.params.history.root;"/"===s[s.length-1]&&(s=s.slice(0,s.length-1)),d=`${s}/${t?`${t}/`:""}${d}`}else l.pathname.includes(t)||(d=`${t?`${t}/`:""}${d}`);e.params.history.keepQuery&&(d+=l.search);const c=i.history.state;c&&c.value===d||(e.params.history.replaceState?i.history.replaceState({value:d},null,d):i.history.pushState({value:d},null,d))},d=(t,s,a)=>{if(s)for(let i=0,r=e.slides.length;i{i=l(e.params.url),d(e.params.speed,i.value,!1)};s("init",()=>{e.params.history.enabled&&(()=>{const t=r();if(e.params.history){if(!t.history||!t.history.pushState)return e.params.history.enabled=!1,void(e.params.hashNavigation.enabled=!0);a=!0,i=l(e.params.url),i.key||i.value?(d(0,i.value,e.params.runCallbacksOnInit),e.params.history.replaceState||t.addEventListener("popstate",c)):e.params.history.replaceState||t.addEventListener("popstate",c)}})()}),s("destroy",()=>{e.params.history.enabled&&(()=>{const t=r();e.params.history.replaceState||t.removeEventListener("popstate",c)})()}),s("transitionEnd _freeModeNoMomentumRelease",()=>{a&&o(e.params.history.key,e.activeIndex)}),s("slideChange",()=>{a&&e.params.cssMode&&o(e.params.history.key,e.activeIndex)})},function({swiper:e,extendParams:t,emit:s,on:i}){let n=!1;const l=a(),o=r();t({hashNavigation:{enabled:!1,replaceState:!1,watchState:!1,getSlideIndex(t,s){if(e.virtual&&e.params.virtual.enabled){const t=e.slides.find(e=>e.getAttribute("data-hash")===s);if(!t)return 0;return parseInt(t.getAttribute("data-swiper-slide-index"),10)}return e.getSlideIndex(g(e.slidesEl,`.${e.params.slideClass}[data-hash="${s}"], swiper-slide[data-hash="${s}"]`)[0])}}});const d=()=>{s("hashChange");const t=l.location.hash.replace("#",""),a=e.virtual&&e.params.virtual.enabled?e.slidesEl.querySelector(`[data-swiper-slide-index="${e.activeIndex}"]`):e.slides[e.activeIndex];if(t!==(a?a.getAttribute("data-hash"):"")){const s=e.params.hashNavigation.getSlideIndex(e,t);if(void 0===s||Number.isNaN(s))return;e.slideTo(s)}},c=()=>{if(!n||!e.params.hashNavigation.enabled)return;const t=e.virtual&&e.params.virtual.enabled?e.slidesEl.querySelector(`[data-swiper-slide-index="${e.activeIndex}"]`):e.slides[e.activeIndex],a=t?t.getAttribute("data-hash")||t.getAttribute("data-history"):"";e.params.hashNavigation.replaceState&&o.history&&o.history.replaceState?(o.history.replaceState(null,null,`#${a}`||""),s("hashSet")):(l.location.hash=a||"",s("hashSet"))};i("init",()=>{e.params.hashNavigation.enabled&&(()=>{if(!e.params.hashNavigation.enabled||e.params.history&&e.params.history.enabled)return;n=!0;const t=l.location.hash.replace("#","");if(t){const s=0,a=e.params.hashNavigation.getSlideIndex(e,t);e.slideTo(a||0,s,e.params.runCallbacksOnInit,!0)}e.params.hashNavigation.watchState&&o.addEventListener("hashchange",d)})()}),i("destroy",()=>{e.params.hashNavigation.enabled&&e.params.hashNavigation.watchState&&o.removeEventListener("hashchange",d)}),i("transitionEnd _freeModeNoMomentumRelease",()=>{n&&c()}),i("slideChange",()=>{n&&e.params.cssMode&&c()})},function({swiper:e,extendParams:t,on:s,emit:i,params:r}){let n,l;e.autoplay={running:!1,paused:!1,timeLeft:0},t({autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!1,stopOnLastSlide:!1,reverseDirection:!1,pauseOnMouseEnter:!1}});let o,d,c,p,u,m,h,f=r&&r.autoplay?r.autoplay.delay:3e3,g=r&&r.autoplay?r.autoplay.delay:3e3,v=(new Date).getTime();function w(t){e&&!e.destroyed&&e.wrapperEl&&t.target===e.wrapperEl&&(e.wrapperEl.removeEventListener("transitionend",w),h||t.detail&&t.detail.bySwiperTouchMove||M())}const b=()=>{if(e.destroyed||!e.autoplay.running)return;e.autoplay.paused?d=!0:d&&(g=o,d=!1);const t=e.autoplay.paused?o:v+g-(new Date).getTime();e.autoplay.timeLeft=t,i("autoplayTimeLeft",t,t/f),l=requestAnimationFrame(()=>{b()})},y=()=>{let t=e.params.autoplay.delay;const s=(()=>{let t;if(t=e.virtual&&e.params.virtual.enabled?e.slides.find(e=>e.classList.contains("swiper-slide-active")):e.slides[e.activeIndex],!t)return;return parseInt(t.getAttribute("data-swiper-autoplay"),10)})();return!Number.isNaN(s)&&s>0&&(t=s),t},E=t=>{if(e.destroyed||!e.autoplay.running)return;cancelAnimationFrame(l),b();let s=t;void 0===s&&(s=y(),f=s,g=s),o=s;const a=e.params.speed,r=()=>{e&&!e.destroyed&&(e.params.autoplay.reverseDirection?!e.isBeginning||e.params.loop||e.params.rewind?(e.slidePrev(a,!0,!0),i("autoplay")):e.params.autoplay.stopOnLastSlide||(e.slideTo(e.slides.length-1,a,!0,!0),i("autoplay")):!e.isEnd||e.params.loop||e.params.rewind?(e.slideNext(a,!0,!0),i("autoplay")):e.params.autoplay.stopOnLastSlide||(e.slideTo(0,a,!0,!0),i("autoplay")),e.params.cssMode&&(v=(new Date).getTime(),requestAnimationFrame(()=>{E()})))};return s>0?(clearTimeout(n),n=setTimeout(()=>{r()},s)):requestAnimationFrame(()=>{r()}),s},x=()=>{v=(new Date).getTime(),e.autoplay.running=!0,E(),i("autoplayStart")},S=()=>{e.autoplay.running=!1,clearTimeout(n),cancelAnimationFrame(l),i("autoplayStop")},T=(t,s)=>{if(e.destroyed||!e.autoplay.running)return;clearTimeout(n),t||(m=!0);const a=()=>{i("autoplayPause"),e.params.autoplay.waitForTransition?e.wrapperEl.addEventListener("transitionend",w):M()};if(e.autoplay.paused=!0,s)return void a();const r=o||e.params.autoplay.delay;o=r-((new Date).getTime()-v),e.isEnd&&o<0&&!e.params.loop||(o<0&&(o=0),a())},M=()=>{e.isEnd&&o<0&&!e.params.loop||e.destroyed||!e.autoplay.running||(v=(new Date).getTime(),m?(m=!1,E(o)):E(),e.autoplay.paused=!1,i("autoplayResume"))},C=()=>{if(e.destroyed||!e.autoplay.running)return;const t=a();"hidden"===t.visibilityState&&(m=!0,T(!0)),"visible"===t.visibilityState&&M()},P=t=>{"mouse"===t.pointerType&&(m=!0,h=!0,e.animating||e.autoplay.paused||T(!0))},L=t=>{"mouse"===t.pointerType&&(h=!1,e.autoplay.paused&&M())};s("init",()=>{e.params.autoplay.enabled&&(e.params.autoplay.pauseOnMouseEnter&&(e.el.addEventListener("pointerenter",P),e.el.addEventListener("pointerleave",L)),a().addEventListener("visibilitychange",C),x())}),s("destroy",()=>{e.el&&"string"!=typeof e.el&&(e.el.removeEventListener("pointerenter",P),e.el.removeEventListener("pointerleave",L)),a().removeEventListener("visibilitychange",C),e.autoplay.running&&S()}),s("_freeModeStaticRelease",()=>{(p||m)&&M()}),s("_freeModeNoMomentumRelease",()=>{e.params.autoplay.disableOnInteraction?S():T(!0,!0)}),s("beforeTransitionStart",(t,s,a)=>{!e.destroyed&&e.autoplay.running&&(a||!e.params.autoplay.disableOnInteraction?T(!0,!0):S())}),s("sliderFirstMove",()=>{!e.destroyed&&e.autoplay.running&&(e.params.autoplay.disableOnInteraction?S():(c=!0,p=!1,m=!1,u=setTimeout(()=>{m=!0,p=!0,T(!0)},200)))}),s("touchEnd",()=>{if(!e.destroyed&&e.autoplay.running&&c){if(clearTimeout(u),clearTimeout(n),e.params.autoplay.disableOnInteraction)return p=!1,void(c=!1);p&&e.params.cssMode&&M(),p=!1,c=!1}}),s("slideChange",()=>{!e.destroyed&&e.autoplay.running&&e.autoplay.paused&&(o=y(),f=y())}),Object.assign(e.autoplay,{start:x,stop:S,pause:T,resume:M})},function({swiper:e,extendParams:t,on:s}){t({thumbs:{swiper:null,multipleActiveThumbs:!0,autoScrollOffset:0,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-thumbs"}});let i=!1,r=!1;function n(){const t=e.thumbs.swiper;return!(!t||t.destroyed)&&(t.params.virtual&&t.params.virtual.enabled)}function l(){const t=e.thumbs.swiper;if(!t||t.destroyed)return;const s=t.clickedIndex,a=t.clickedSlide;if(a&&a.classList.contains(e.params.thumbs.slideThumbActiveClass))return;if(null==s)return;let i;i=t.params.loop?parseInt(t.clickedSlide.getAttribute("data-swiper-slide-index"),10):s,e.params.loop?e.slideToLoop(i):e.slideTo(i)}function o(){const{thumbs:t}=e.params;if(i)return!1;i=!0;const s=e.constructor;if(t.swiper instanceof s){if(t.swiper.destroyed)return i=!1,!1;e.thumbs.swiper=t.swiper,Object.assign(e.thumbs.swiper.originalParams,{watchSlidesProgress:!0,slideToClickedSlide:!1}),Object.assign(e.thumbs.swiper.params,{watchSlidesProgress:!0,slideToClickedSlide:!1}),e.thumbs.swiper.update()}else if(c(t.swiper)){const a=Object.assign({},t.swiper);Object.assign(a,{watchSlidesProgress:!0,slideToClickedSlide:!1}),e.thumbs.swiper=new s(a),r=!0}return e.thumbs.swiper.el.classList.add(e.params.thumbs.thumbsContainerClass),e.thumbs.swiper.on("tap",l),n()&&e.thumbs.swiper.on("virtualUpdate",()=>{d(!1,{autoScroll:!1})}),!0}function d(t,s){const a=e.thumbs.swiper;if(!a||a.destroyed)return;let i=1;const r=e.params.thumbs.slideThumbActiveClass;if(e.params.slidesPerView>1&&!e.params.centeredSlides&&(i=e.params.slidesPerView),e.params.thumbs.multipleActiveThumbs||(i=1),i=Math.floor(i),a.slides.forEach(e=>e.classList.remove(r)),a.params.loop||n())for(let t=0;t{e.classList.add(r)});else for(let t=0;tt.getAttribute("data-swiper-slide-index")===`${e.realIndex}`);l=s.slides.indexOf(t),o=e.activeIndex>e.previousIndex?"next":"prev"}else l=e.realIndex,o=l>e.previousIndex?"next":"prev";r&&(l+="next"===o?i:-1*i),s.visibleSlidesIndexes&&s.visibleSlidesIndexes.indexOf(l)<0&&(s.params.centeredSlides?l=l>n?l-Math.floor(a/2)+1:l+Math.floor(a/2)-1:l>n&&s.params.slidesPerGroup,s.slideTo(l,t))}}(t?0:void 0)}e.thumbs={swiper:null},s("beforeInit",()=>{const{thumbs:t}=e.params;if(t&&t.swiper)if("string"==typeof t.swiper||t.swiper instanceof HTMLElement){const s=a(),i=()=>{const a="string"==typeof t.swiper?s.querySelector(t.swiper):t.swiper;if(a&&a.swiper)t.swiper=a.swiper,o(),d(!0);else if(a){const s=`${e.params.eventsPrefix}init`,i=r=>{t.swiper=r.detail[0],a.removeEventListener(s,i),o(),d(!0),t.swiper.update(),e.update()};a.addEventListener(s,i)}return a},r=()=>{if(e.destroyed)return;i()||requestAnimationFrame(r)};requestAnimationFrame(r)}else o(),d(!0)}),s("slideChange update resize observerUpdate",()=>{d()}),s("setTransition",(t,s)=>{const a=e.thumbs.swiper;a&&!a.destroyed&&a.setTransition(s)}),s("beforeDestroy",()=>{const t=e.thumbs.swiper;t&&!t.destroyed&&r&&t.destroy()}),Object.assign(e.thumbs,{init:o,update:d})},function({swiper:e,extendParams:t,emit:s,once:a}){t({freeMode:{enabled:!1,momentum:!0,momentumRatio:1,momentumBounce:!0,momentumBounceRatio:1,momentumVelocityRatio:1,sticky:!1,minimumVelocity:.02}}),Object.assign(e,{freeMode:{onTouchStart:function(){if(e.params.cssMode)return;const t=e.getTranslate();e.setTranslate(t),e.setTransition(0),e.touchEventsData.velocities.length=0,e.freeMode.onTouchEnd({currentPos:e.rtl?e.translate:-e.translate})},onTouchMove:function(){if(e.params.cssMode)return;const{touchEventsData:t,touches:s}=e;0===t.velocities.length&&t.velocities.push({position:s[e.isHorizontal()?"startX":"startY"],time:t.touchStartTime}),t.velocities.push({position:s[e.isHorizontal()?"currentX":"currentY"],time:o()})},onTouchEnd:function({currentPos:t}){if(e.params.cssMode)return;const{params:i,wrapperEl:r,rtlTranslate:n,snapGrid:l,touchEventsData:d}=e,c=o()-d.touchStartTime;if(t<-e.minTranslate())e.slideTo(e.activeIndex);else if(t>-e.maxTranslate())e.slides.length1){const t=d.velocities.pop(),s=d.velocities.pop(),a=t.position-s.position,r=t.time-s.time;e.velocity=a/r,e.velocity/=2,Math.abs(e.velocity)150||o()-t.time>300)&&(e.velocity=0)}else e.velocity=0;e.velocity*=i.freeMode.momentumVelocityRatio,d.velocities.length=0;let t=1e3*i.freeMode.momentumRatio;const c=e.velocity*t;let p=e.translate+c;n&&(p=-p);let u,m=!1;const h=20*Math.abs(e.velocity)*i.freeMode.momentumBounceRatio;let f;if(pe.minTranslate())i.freeMode.momentumBounce?(p-e.minTranslate()>h&&(p=e.minTranslate()+h),u=e.minTranslate(),m=!0,d.allowMomentumBounce=!0):p=e.minTranslate(),i.loop&&i.centeredSlides&&(f=!0);else if(i.freeMode.sticky){let t;for(let e=0;e-p){t=e;break}p=Math.abs(l[t]-p){e.loopFix()}),0!==e.velocity){if(t=n?Math.abs((-p-e.translate)/e.velocity):Math.abs((p-e.translate)/e.velocity),i.freeMode.sticky){const s=Math.abs((n?-p:p)-e.translate),a=e.slidesSizesGrid[e.activeIndex];t=s{e&&!e.destroyed&&d.allowMomentumBounce&&(s("momentumBounce"),e.setTransition(i.speed),setTimeout(()=>{e.setTranslate(u),S(r,()=>{e&&!e.destroyed&&e.transitionEnd()})},0))})):e.velocity?(s("_freeModeNoMomentumRelease"),e.updateProgress(p),e.setTransition(t),e.setTranslate(p),e.transitionStart(!0,e.swipeDirection),e.animating||(e.animating=!0,S(r,()=>{e&&!e.destroyed&&e.transitionEnd()}))):e.updateProgress(p),e.updateActiveIndex(),e.updateSlidesClasses()}else{if(i.freeMode.sticky)return void e.slideToClosest();i.freeMode&&s("_freeModeNoMomentumRelease")}(!i.freeMode.momentum||c>=i.longSwipesMs)&&(s("_freeModeStaticRelease"),e.updateProgress(),e.updateActiveIndex(),e.updateSlidesClasses())}}}})},function({swiper:e,extendParams:t,on:s}){let a,i,r,n;t({grid:{rows:1,fill:"column"}});const l=()=>{let t=e.params.spaceBetween;return"string"==typeof t&&t.indexOf("%")>=0?t=parseFloat(t.replace("%",""))/100*e.size:"string"==typeof t&&(t=parseFloat(t)),t};s("init",()=>{n=e.params.grid&&e.params.grid.rows>1}),s("update",()=>{const{params:t,el:s}=e,a=t.grid&&t.grid.rows>1;n&&!a?(s.classList.remove(`${t.containerModifierClass}grid`,`${t.containerModifierClass}grid-column`),r=1,e.emitContainerClasses()):!n&&a&&(s.classList.add(`${t.containerModifierClass}grid`),"column"===t.grid.fill&&s.classList.add(`${t.containerModifierClass}grid-column`),e.emitContainerClasses()),n=a}),e.grid={initSlides:t=>{const{slidesPerView:s}=e.params,{rows:n,fill:l}=e.params.grid,o=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:t.length;r=Math.floor(o/n),a=Math.floor(o/n)===o/n?o:Math.ceil(o/n)*n,"auto"!==s&&"row"===l&&(a=Math.max(a,Math.floor(s)*n)),i=a/n},unsetSlides:()=>{e.slides&&e.slides.forEach(t=>{t.swiperSlideGridSet&&(t.style.height="",t.style[e.getDirectionLabel("margin-top")]="")})},updateSlide:(t,s,n)=>{const{slidesPerGroup:o}=e.params,d=l(),{rows:c,fill:p}=e.params.grid,u=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:n.length;let m,h,f;if("row"===p&&o>1){const e=Math.floor(t/(o*c)),i=t-c*o*e,r=0===e?o:Math.min(Math.ceil((u-e*c*o)/c),o);f=Math.floor(i/r),h=i-f*r+e*o,m=h+f*a/c,s.style.order=m}else"column"===p?(h=Math.floor(t/c),f=t-h*c,(h>r||h===r&&f===c-1)&&(f+=1,f>=c&&(f=0,h+=1))):(f=Math.floor(t/i),h=t-f*i);s.row=f,s.column=h,s.style.height=`calc((100% - ${(c-1)*d}px) / ${c})`,s.style[e.getDirectionLabel("margin-top")]=0!==f?d&&`${d}px`:"",s.swiperSlideGridSet=!0},updateWrapperSize:(t,s)=>{const{centeredSlides:i,roundLengths:r}=e.params,n=l(),{rows:o}=e.params.grid;if(e.virtualSize=(t+n)*a,e.virtualSize=Math.ceil(e.virtualSize/o)-n,e.params.cssMode||(e.wrapperEl.style[e.getDirectionLabel("width")]=`${e.virtualSize+n}px`),i){const t=[];for(let a=0;a{const{slides:t}=e;e.params.fadeEffect;for(let s=0;s{const s=e.slides.map(e=>f(e));s.forEach(e=>{e.style.transitionDuration=`${t}ms`}),ve({swiper:e,duration:t,transformElements:s,allSlides:!0})},overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!e.params.cssMode})})},function({swiper:e,extendParams:t,on:s}){t({cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}});const a=(e,t,s)=>{let a=s?e.querySelector(".swiper-slide-shadow-left"):e.querySelector(".swiper-slide-shadow-top"),i=s?e.querySelector(".swiper-slide-shadow-right"):e.querySelector(".swiper-slide-shadow-bottom");a||(a=w("div",("swiper-slide-shadow-cube swiper-slide-shadow-"+(s?"left":"top")).split(" ")),e.append(a)),i||(i=w("div",("swiper-slide-shadow-cube swiper-slide-shadow-"+(s?"right":"bottom")).split(" ")),e.append(i)),a&&(a.style.opacity=Math.max(-t,0)),i&&(i.style.opacity=Math.max(t,0))};fe({effect:"cube",swiper:e,on:s,setTranslate:()=>{const{el:t,wrapperEl:s,slides:i,width:r,height:n,rtlTranslate:l,size:o,browser:d}=e,c=C(e),p=e.params.cubeEffect,u=e.isHorizontal(),m=e.virtual&&e.params.virtual.enabled;let h,f=0;p.shadow&&(u?(h=e.wrapperEl.querySelector(".swiper-cube-shadow"),h||(h=w("div","swiper-cube-shadow"),e.wrapperEl.append(h)),h.style.height=`${r}px`):(h=t.querySelector(".swiper-cube-shadow"),h||(h=w("div","swiper-cube-shadow"),t.append(h))));for(let e=0;e-1&&(f=90*s+90*d,l&&(f=90*-s-90*d)),t.style.transform=w,p.slideShadows&&a(t,d,u)}if(s.style.transformOrigin=`50% 50% -${o/2}px`,s.style["-webkit-transform-origin"]=`50% 50% -${o/2}px`,p.shadow)if(u)h.style.transform=`translate3d(0px, ${r/2+p.shadowOffset}px, ${-r/2}px) rotateX(89.99deg) rotateZ(0deg) scale(${p.shadowScale})`;else{const e=Math.abs(f)-90*Math.floor(Math.abs(f)/90),t=1.5-(Math.sin(2*e*Math.PI/360)/2+Math.cos(2*e*Math.PI/360)/2),s=p.shadowScale,a=p.shadowScale/t,i=p.shadowOffset;h.style.transform=`scale3d(${s}, 1, ${a}) translate3d(0px, ${n/2+i}px, ${-n/2/a}px) rotateX(-89.99deg)`}const g=(d.isSafari||d.isWebView)&&d.needPerspectiveFix?-o/2:0;s.style.transform=`translate3d(0px,0,${g}px) rotateX(${c(e.isHorizontal()?0:f)}deg) rotateY(${c(e.isHorizontal()?-f:0)}deg)`,s.style.setProperty("--swiper-cube-translate-z",`${g}px`)},setTransition:t=>{const{el:s,slides:a}=e;if(a.forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach(e=>{e.style.transitionDuration=`${t}ms`})}),e.params.cubeEffect.shadow&&!e.isHorizontal()){const e=s.querySelector(".swiper-cube-shadow");e&&(e.style.transitionDuration=`${t}ms`)}},recreateShadows:()=>{const t=e.isHorizontal();e.slides.forEach(e=>{const s=Math.max(Math.min(e.progress,1),-1);a(e,s,t)})},getEffectParams:()=>e.params.cubeEffect,perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0})})},function({swiper:e,extendParams:t,on:s}){t({flipEffect:{slideShadows:!0,limitRotation:!0}});const a=(t,s)=>{let a=e.isHorizontal()?t.querySelector(".swiper-slide-shadow-left"):t.querySelector(".swiper-slide-shadow-top"),i=e.isHorizontal()?t.querySelector(".swiper-slide-shadow-right"):t.querySelector(".swiper-slide-shadow-bottom");a||(a=we("flip",t,e.isHorizontal()?"left":"top")),i||(i=we("flip",t,e.isHorizontal()?"right":"bottom")),a&&(a.style.opacity=Math.max(-s,0)),i&&(i.style.opacity=Math.max(s,0))};fe({effect:"flip",swiper:e,on:s,setTranslate:()=>{const{slides:t,rtlTranslate:s}=e,i=e.params.flipEffect,r=C(e);for(let n=0;n{const s=e.slides.map(e=>f(e));s.forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach(e=>{e.style.transitionDuration=`${t}ms`})}),ve({swiper:e,duration:t,transformElements:s})},recreateShadows:()=>{e.params.flipEffect,e.slides.forEach(t=>{let s=t.progress;e.params.flipEffect.limitRotation&&(s=Math.max(Math.min(t.progress,1),-1)),a(t,s)})},getEffectParams:()=>e.params.flipEffect,perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!e.params.cssMode})})},function({swiper:e,extendParams:t,on:s}){t({coverflowEffect:{rotate:50,stretch:0,depth:100,scale:1,modifier:1,slideShadows:!0}}),fe({effect:"coverflow",swiper:e,on:s,setTranslate:()=>{const{width:t,height:s,slides:a,slidesSizesGrid:i}=e,r=e.params.coverflowEffect,n=e.isHorizontal(),l=e.translate,o=n?t/2-l:s/2-l,d=n?r.rotate:-r.rotate,c=r.depth,p=C(e);for(let e=0,t=a.length;e0?u:0),s&&(s.style.opacity=-u>0?-u:0)}}},setTransition:t=>{e.slides.map(e=>f(e)).forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach(e=>{e.style.transitionDuration=`${t}ms`})})},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0})})},function({swiper:e,extendParams:t,on:s}){t({creativeEffect:{limitProgress:1,shadowPerProgress:!1,progressMultiplier:1,perspective:!0,prev:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1},next:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1}}});const a=e=>"string"==typeof e?e:`${e}px`;fe({effect:"creative",swiper:e,on:s,setTranslate:()=>{const{slides:t,wrapperEl:s,slidesSizesGrid:i}=e,r=e.params.creativeEffect,{progressMultiplier:n}=r,l=e.params.centeredSlides,o=C(e);if(l){const t=i[0]/2-e.params.slidesOffsetBefore||0;s.style.transform=`translateX(calc(50% - ${t}px))`}for(let s=0;s0&&(g=r.prev,f=!0),m.forEach((e,t)=>{m[t]=`calc(${e}px + (${a(g.translate[t])} * ${Math.abs(c*n)}))`}),h.forEach((e,t)=>{let s=g.rotate[t]*Math.abs(c*n);h[t]=s}),i.style.zIndex=-Math.abs(Math.round(d))+t.length;const v=m.join(", "),w=`rotateX(${o(h[0])}deg) rotateY(${o(h[1])}deg) rotateZ(${o(h[2])}deg)`,b=p<0?`scale(${1+(1-g.scale)*p*n})`:`scale(${1-(1-g.scale)*p*n})`,y=p<0?1+(1-g.opacity)*p*n:1-(1-g.opacity)*p*n,E=`translate3d(${v}) ${w} ${b}`;if(f&&g.shadow||!f){let e=i.querySelector(".swiper-slide-shadow");if(!e&&g.shadow&&(e=we("creative",i)),e){const t=r.shadowPerProgress?c*(1/r.limitProgress):c;e.style.opacity=Math.min(Math.max(Math.abs(t),0),1)}}const x=ge(0,i);x.style.transform=E,x.style.opacity=y,g.origin&&(x.style.transformOrigin=g.origin)}},setTransition:t=>{const s=e.slides.map(e=>f(e));s.forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow").forEach(e=>{e.style.transitionDuration=`${t}ms`})}),ve({swiper:e,duration:t,transformElements:s,allSlides:!0})},perspective:()=>e.params.creativeEffect.perspective,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!e.params.cssMode})})},function({swiper:e,extendParams:t,on:s}){t({cardsEffect:{slideShadows:!0,rotate:!0,perSlideRotate:2,perSlideOffset:8}}),fe({effect:"cards",swiper:e,on:s,setTranslate:()=>{const{slides:t,activeIndex:s,rtlTranslate:a}=e,i=e.params.cardsEffect,{startTranslate:r,isTouched:n}=e.touchEventsData,l=a?-e.translate:e.translate;for(let o=0;o0&&p<1&&(n||e.params.cssMode)&&l-1&&(n||e.params.cssMode)&&l>r;if(y||E){const t=(1-Math.abs((Math.abs(p)-.5)/.5))**.5;v+=-28*p*t,g+=-.5*t,w+=96*t,h=(i.rotate||e.isHorizontal()?-25:0)*t*Math.abs(p)+"%"}if(m=p<0?`calc(${m}px ${a?"-":"+"} (${w*Math.abs(p)}%))`:p>0?`calc(${m}px ${a?"-":"+"} (-${w*Math.abs(p)}%))`:`${m}px`,!e.isHorizontal()){const e=h;h=m,m=e}const x=p<0?""+(1+(1-g)*p):""+(1-(1-g)*p),S=`\n translate3d(${m}, ${h}, ${f}px)\n rotateZ(${i.rotate?a?-v:v:0}deg)\n scale(${x})\n `;if(i.slideShadows){let e=d.querySelector(".swiper-slide-shadow");e||(e=we("cards",d)),e&&(e.style.opacity=Math.min(Math.max((Math.abs(p)-.5)/.5,0),1))}d.style.zIndex=-Math.abs(Math.round(c))+t.length;ge(0,d).style.transform=S}},setTransition:t=>{const s=e.slides.map(e=>f(e));s.forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow").forEach(e=>{e.style.transitionDuration=`${t}ms`})}),ve({swiper:e,duration:t,transformElements:s})},perspective:()=>!0,overwriteParams:()=>({_loopSwapReset:!1,watchSlidesProgress:!0,loopAdditionalSlides:e.params.cardsEffect.rotate?3:2,centeredSlides:!0,virtualTranslate:!e.params.cssMode})})}];return ne.use(be),ne}(); +//# sourceMappingURL=swiper-bundle.min.js.map \ No newline at end of file diff --git a/category.php b/category.php index 1a066b5..abef112 100644 --- a/category.php +++ b/category.php @@ -4,8 +4,8 @@ $category = get_queried_object(); $context['category'] = Timber::get_term($category); $context['cards'] = []; -$excluded_ids = [12, 31]; // Séance de séminaire, Non classé -if ( ! is_user_logged_in() ) $excluded_ids[] = 9; // Vie du labo +// Séance de séminaire, Non classé (+ Vie du labo pour les non-connectés) +$excluded_ids = thalim_archive_excluded_cat_ids(); // Parent category slug for color theming if ($category->parent) { @@ -54,68 +54,25 @@ $all_cats = get_categories([ 'exclude' => $excluded_ids, ]); -$filter_parents = []; -foreach ($all_cats as $cat) { - if ($cat->parent == 0) { - $link = get_category_link($cat->term_id); - if ($filter_query) $link .= '?' . $filter_query; - $filter_parents[] = [ - 'id' => $cat->term_id, - 'name' => thalim_cat_name($cat), - 'slug' => $cat->slug, - 'link' => $link, - ]; - } -} -$context['filter_parents'] = $filter_parents; +// Liens de filtre : navigation vers la page de catégorie, en conservant axe/dates +$make_cat_link = function ($cat) use ($filter_query) { + $link = get_category_link($cat->term_id); + return $filter_query ? $link . '?' . $filter_query : $link; +}; +$context['filter_parents'] = thalim_archive_filter_parents($all_cats, $make_cat_link); // Children of active rubrique for catégorie filter (with links) $active_rubrique_id = $context['active_rubrique']; $is_direct = (bool) get_query_var('thalim_direct_posts'); -$lang = thalim_current_language(); -$filter_categories = []; -foreach ($all_cats as $cat) { - if ($cat->parent == $active_rubrique_id) { - $link = get_category_link($cat->term_id); - if ($filter_query) $link .= '?' . $filter_query; - $filter_categories[] = [ - 'id' => $cat->term_id, - 'name' => thalim_cat_name($cat), - 'slug' => $cat->slug, - 'link' => $link, - ]; - } -} +$filter_categories = thalim_archive_filter_children($all_cats, $active_rubrique_id, $make_cat_link); // Add "Autres" entry if the active rubrique has posts directly assigned to it -if ($is_direct) { - $has_direct_posts = true; -} else { - $direct_check = new WP_Query([ - 'post_type' => 'post', - 'posts_per_page' => 1, - 'fields' => 'ids', - 'no_found_rows' => true, - 'lang' => '', - 'tax_query' => [[ - 'taxonomy' => 'category', - 'field' => 'term_id', - 'terms' => [$active_rubrique_id], - 'include_children' => false, - ]], - ]); - $has_direct_posts = $direct_check->have_posts(); -} +$has_direct_posts = $is_direct ?: thalim_rubrique_has_direct_posts($active_rubrique_id); if ($has_direct_posts && !empty($filter_categories)) { $autres_link = trailingslashit(get_category_link($active_rubrique_id)) . 'autres/'; if ($filter_query) $autres_link .= '?' . $filter_query; - $filter_categories[] = [ - 'id' => 'autres', - 'name' => $lang === 'en' ? 'Other' : 'Autres', - 'slug' => 'autres', - 'link' => $autres_link, - ]; + $filter_categories[] = thalim_archive_autres_entry($autres_link); } $context['filter_categories'] = $filter_categories; @@ -135,23 +92,23 @@ $children = get_categories([ 'exclude' => $excluded_ids, ]); -// Ordre personnalisé des sous-catégories (term_id => position). +// Ordre personnalisé des sous-catégories (slug => position). // Les termes absents du tableau sont placés en dernier (position 999). $subcategory_order = [ - // Publications et productions (parent: 4) - 15 => 0, // Ouvrages - 16 => 1, // Articles - 65 => 2, // Revues et collections - 17 => 3, // Multimédia - // Activités (parent: 3) - 11 => 0, // Séminaires - 10 => 1, // Colloques et journées d'études - 13 => 2, // Communications - 14 => 3, // Soutenances + // Publications et productions + 'ouvrages' => 0, + 'articles' => 1, + 'revues-et-collections' => 2, + 'multimedia' => 3, + // Manifestations scientifiques + 'seminaires' => 0, + 'colloques-et-journees-detudes' => 1, + 'communications' => 2, + 'soutenances' => 3, ]; usort($children, function($a, $b) use ($subcategory_order) { - $pos_a = $subcategory_order[$a->term_id] ?? 999; - $pos_b = $subcategory_order[$b->term_id] ?? 999; + $pos_a = $subcategory_order[$a->slug] ?? 999; + $pos_b = $subcategory_order[$b->slug] ?? 999; return $pos_a - $pos_b; }); @@ -188,7 +145,6 @@ if (!$is_direct && !empty($children)) { 'posts_per_page' => 3, 'orderby' => 'date', 'order' => 'DESC', - 'lang' => '', 'thalim_event_date_order' => true, ], $extra_query_args); $posts = $sort_with_pinned( Timber::get_posts($query_args) ); @@ -212,7 +168,6 @@ if (!$is_direct && !empty($children)) { 'posts_per_page' => 3, 'orderby' => 'date', 'order' => 'DESC', - 'lang' => '', 'thalim_event_date_order' => true, ], $extra_query_args); $direct_posts = $sort_with_pinned( Timber::get_posts($direct_query_args) ); @@ -244,7 +199,6 @@ if (!$is_direct && !empty($children)) { 'posts_per_page' => 12, 'orderby' => 'date', 'order' => 'DESC', - 'lang' => '', 'thalim_event_date_order' => true, ], $extra_query_args); if ( $pinned_ids ) { @@ -259,7 +213,6 @@ if (!$is_direct && !empty($children)) { 'post__in' => $pinned_ids, 'orderby' => 'post__in', 'posts_per_page' => -1, - 'lang' => '', ], $extra_query_args ) ) : []; $context['cards'] = thalim_get_cards_data($pinned_posts) + thalim_get_cards_data($posts); @@ -288,6 +241,6 @@ $context['agenda_toggle_url'] = add_query_arg( $toggle_params, $toggle_base ); $cat_lang = thalim_current_language(); $pres_fr = get_term_meta( $category->term_id, 'presentation', true ) ?: ''; $pres_en = get_term_meta( $category->term_id, 'presentation_en', true ) ?: ''; -$context['term_presentation'] = wpautop( ( $cat_lang === 'en' && $pres_en ) ? $pres_en : $pres_fr ); +$context['term_presentation'] = wpautop( wp_kses_post( ( $cat_lang === 'en' && $pres_en ) ? $pres_en : $pres_fr ) ); Timber::render('category.twig', $context); diff --git a/functions.php b/functions.php index 4b39134..4ab48fe 100755 --- a/functions.php +++ b/functions.php @@ -1,1409 +1,45 @@ user_email ) ) ); - $response = wp_remote_head( - 'https://www.gravatar.com/avatar/' . $hash . '?d=404', - [ 'timeout' => 3 ] - ); - - if ( ! is_wp_error( $response ) && wp_remote_retrieve_response_code( $response ) === 200 ) { - $url = 'https://www.gravatar.com/avatar/' . $hash . '?s=300'; - set_transient( $cache_key, $url, WEEK_IN_SECONDS ); - return $url; - } - - // No Gravatar — cache the negative result too - set_transient( $cache_key, '', WEEK_IN_SECONDS ); - return ''; -} - -function thalim_en_url( string $url ): string { - if ( thalim_current_language() !== 'en' ) return $url; - $home = rtrim( home_url(), '/' ); - $path = substr( $url, strlen( $home ) ); - if ( str_starts_with( $path, '/en/' ) || $path === '/en' ) return $url; - return $home . '/en' . $path; -} - -// Auto-prefix all WP-generated internal URLs in EN mode. -// Safe on admin: THALIM_ORIGINAL_URI starts with /wp-admin/ there, -// so thalim_current_language() returns 'fr' and thalim_en_url() is a no-op. -add_filter( 'term_link', 'thalim_en_url' ); // get_term_link(), get_category_link(), get_tag_link() -add_filter( 'post_link', 'thalim_en_url' ); // get_permalink() on regular posts -add_filter( 'page_link', 'thalim_en_url' ); // get_permalink() on pages -add_filter( 'post_type_link', 'thalim_en_url' ); // get_permalink() on CPTs -add_filter( 'author_link', 'thalim_en_url' ); // get_author_posts_url() - -// Return the translated category name if viewing in EN and titre_anglais is set. -// Accepts a WP_Term, Timber\Term, term_id (int), or a name string + term_id. -function thalim_cat_name( $cat, string $lang = null ): string { - if ( $lang === null ) $lang = thalim_current_language(); - if ( is_object( $cat ) ) { - $term_id = $cat->term_id ?? ( $cat->id ?? 0 ); - $fallback = $cat->name; - } elseif ( is_numeric( $cat ) ) { - $term_id = (int) $cat; - $term = get_term( $term_id, 'category' ); - $fallback = $term && ! is_wp_error( $term ) ? $term->name : (string) $cat; - } else { - return (string) $cat; - } - if ( $lang !== 'en' ) return $fallback; - $en = get_term_meta( $term_id, 'titre_anglais', true ); - return ( $en !== '' && $en !== false ) ? $en : $fallback; -} - -/** - * Clé couleur stable d'une catégorie racine, indexée sur le term_id (immuable) - * plutôt que sur le slug (que l'admin peut régénérer en renommant la catégorie). - * Renvoie la clé canonique attendue par les classes CSS .gradient--{clé} / - * .category--{clé} (_postcard.scss, _single.scss, _category.scss). - * Fallback sur le slug live pour toute racine hors des 5 rubriques connues. - */ -function thalim_category_color_slug( $root_term_id, $fallback_slug = '' ) { - $map = [ - 1 => 'le-laboratoire', - 3 => 'manifestations-scientifiques', - 4 => 'publications-et-productions', - 5 => 'mediation-scientifique', - 6 => 'ressources', - ]; - return $map[ (int) $root_term_id ] ?? $fallback_slug; -} - -// Register bilingual and en_url as Twig filters -add_filter( 'timber/twig', function ( $twig ) { - $twig->addFilter( new \Twig\TwigFilter( 'bilingual', 'thalim_bilingual' ) ); - $twig->addFilter( new \Twig\TwigFilter( 'en_url', 'thalim_en_url' ) ); - $twig->addFilter( new \Twig\TwigFilter( 'cat_name', 'thalim_cat_name' ) ); - return $twig; -} ); - -// Language switcher data (replaces pll_the_languages) -// Output matches the structure header.twig expects: slug, url, current_lang -function thalim_language_switcher(): array { - $uri = THALIM_ORIGINAL_URI; - $path = parse_url( $uri, PHP_URL_PATH ) ?? '/'; - $query = ( $q = parse_url( $uri, PHP_URL_QUERY ) ) ? '?' . $q : ''; - $is_en = thalim_current_language() === 'en'; - - $fr_path = $is_en ? ( substr( $path, 3 ) ?: '/' ) : $path; - $en_path = $is_en ? $path : '/en' . $path; - - return [ - 'fr' => [ 'slug' => 'fr', 'url' => home_url( $fr_path ) . $query, 'current_lang' => ! $is_en ], - 'en' => [ 'slug' => 'en', 'url' => home_url( $en_path ) . $query, 'current_lang' => $is_en ], - ]; -} - -function theme_enqueue_assets() { - wp_enqueue_style( - 'main-styles', - get_template_directory_uri() . '/css/style.css', - [], - filemtime(get_template_directory() . '/css/style.css') - ); - - wp_enqueue_style( - 'iconoir', - 'https://cdn.jsdelivr.net/gh/iconoir-icons/iconoir@main/css/iconoir.css', - [], - null - ); - - wp_enqueue_script( - 'overlay', - get_template_directory_uri() . '/js/overlay.js', - [], - filemtime(get_template_directory() . '/js/overlay.js'), - true - ); - - if (is_front_page() || is_404()) { - wp_enqueue_script( - 'animatedLogo', - get_template_directory_uri() . '/js/animatedLogo.js', - [], - filemtime(get_template_directory() . '/js/animatedLogo.js'), - true - ); - wp_add_inline_script( 'animatedLogo', 'var themeDirURI = ' . wp_json_encode( get_template_directory_uri() ) . ';', 'before' ); - } - - if ( is_category() ) { - wp_enqueue_style( 'swiper', 'https://cdn.jsdelivr.net/npm/swiper@12/swiper-bundle.min.css', [], null ); - wp_enqueue_script( 'swiper', 'https://cdn.jsdelivr.net/npm/swiper@12/swiper-bundle.min.js', [], null, true ); - wp_enqueue_script( 'agendaView', get_template_directory_uri() . '/js/agendaView.js', ['swiper'], filemtime( get_template_directory() . '/js/agendaView.js' ), true ); - wp_localize_script( 'agendaView', 'agendaViewData', [ - 'ajaxUrl' => admin_url( 'admin-ajax.php' ), - 'nonce' => wp_create_nonce( 'load_more_posts' ), - 'lang' => thalim_current_language(), - ]); - } - - if (is_front_page()) { - wp_enqueue_script( - 'coloredWordsHero', - get_template_directory_uri() . '/js/coloredWordsHero.js', - [], - filemtime(get_template_directory() . '/js/coloredWordsHero.js'), - true - ); - - wp_enqueue_style( - 'swiper', - 'https://cdn.jsdelivr.net/npm/swiper@12/swiper-bundle.min.css', - [], - null - ); - - wp_enqueue_script( - 'swiper', - 'https://cdn.jsdelivr.net/npm/swiper@12/swiper-bundle.min.js', - [], - null, - true - ); - - wp_enqueue_script( - 'annoncesSwiper', - get_template_directory_uri() . '/js/annoncesSwiper.js', - ['swiper'], - filemtime(get_template_directory() . '/js/annoncesSwiper.js'), - true - ); - - wp_enqueue_script( - 'messageLabo', - get_template_directory_uri() . '/js/messageLabo.js', - [], - filemtime(get_template_directory() . '/js/messageLabo.js'), - true - ); - - wp_enqueue_script( - 'keywordCloud', - get_template_directory_uri() . '/js/keywordCloud.js', - [], - filemtime(get_template_directory() . '/js/keywordCloud.js'), - true - ); - - wp_enqueue_script( - 'quickLinks', - get_template_directory_uri() . '/js/quickLinks.js', - [], - filemtime(get_template_directory() . '/js/quickLinks.js'), - true - ); - - $kw_tags = get_terms([ - 'taxonomy' => 'post_tag', - 'hide_empty' => true, - 'orderby' => 'name', - 'order' => 'ASC', - 'lang' => '', - ]); - if (!is_wp_error($kw_tags) && !empty($kw_tags)) { - $kw_lang = thalim_current_language(); - $kw_tags = array_filter($kw_tags, function ($tag) { - return !get_term_meta($tag->term_id, 'ne_pas_afficher_dans_le_nuage', true); - }); - wp_localize_script('keywordCloud', 'thalimTags', array_values(array_map(function ($tag) use ($kw_lang) { - return ['name' => html_entity_decode(thalim_bilingual($tag->name, $kw_lang), ENT_QUOTES | ENT_HTML5, 'UTF-8'), 'url' => get_term_link($tag)]; - }, $kw_tags))); - } - } - - - wp_enqueue_script( - 'navAxesToggle', - get_template_directory_uri() . '/js/navAxesToggle.js', - [], - filemtime(get_template_directory() . '/js/navAxesToggle.js'), - true - ); - - wp_enqueue_script( - 'stickyHeader', - get_template_directory_uri() . '/js/stickyHeader.js', - [], - filemtime(get_template_directory() . '/js/stickyHeader.js'), - true - ); - - wp_enqueue_script( - 'frenchTypography', - get_template_directory_uri() . '/js/frenchTypography.js', - [], - filemtime(get_template_directory() . '/js/frenchTypography.js'), - true - ); - - if (is_page('membres')) { - wp_enqueue_script( - 'membresFilters', - get_template_directory_uri() . '/js/membresFilters.js', - [], - filemtime(get_template_directory() . '/js/membresFilters.js'), - true - ); - wp_enqueue_script( - 'membresPopover', - get_template_directory_uri() . '/js/membresPopover.js', - [], - filemtime(get_template_directory() . '/js/membresPopover.js'), - true - ); - } - - if (is_single() || is_author() || is_page('membres') || is_page('le-laboratoire') || is_page('programmes-de-recherche')) { - wp_enqueue_script( - 'seanceToggle', - get_template_directory_uri() . '/js/seanceToggle.js', - [], - filemtime(get_template_directory() . '/js/seanceToggle.js'), - true - ); - } - - if (is_single()) { - wp_enqueue_style( - 'swiper', - 'https://cdn.jsdelivr.net/npm/swiper@12/swiper-bundle.min.css', - [], - null - ); - - wp_enqueue_script( - 'swiper', - 'https://cdn.jsdelivr.net/npm/swiper@12/swiper-bundle.min.js', - [], - null, - true - ); - - wp_enqueue_script( - 'imageSwiper', - get_template_directory_uri() . '/js/imageSwiper.js', - ['swiper'], - filemtime(get_template_directory() . '/js/imageSwiper.js'), - true - ); - } - - wp_enqueue_script( - 'fitPostCardTitle', - get_template_directory_uri() . '/js/fitPostCardTitle.js', - ['frenchTypography'], - filemtime(get_template_directory() . '/js/fitPostCardTitle.js'), - true - ); - - $is_archive_page = is_category() || is_tax() || is_tag() || is_page(['annonces', 'announcements']) || is_search(); - - if ($is_archive_page) { - wp_enqueue_script( - 'infiniteScroll', - get_template_directory_uri() . '/js/infiniteScroll.js', - [], - filemtime(get_template_directory() . '/js/infiniteScroll.js'), - true - ); - wp_localize_script('infiniteScroll', 'infiniteScrollData', [ - 'ajaxUrl' => admin_url('admin-ajax.php'), - 'nonce' => wp_create_nonce('load_more_posts'), - 'lang' => thalim_current_language(), - ]); - } - - if ($is_archive_page) { - wp_enqueue_script( - 'categoryFilters', - get_template_directory_uri() . '/js/categoryFilters.js', - [], - filemtime(get_template_directory() . '/js/categoryFilters.js'), - true - ); - } - - // wp_enqueue_style('wp-block-library'); -} -add_action('wp_enqueue_scripts', 'theme_enqueue_assets'); - -// Auto-sync display_name from first_name + last_name on every profile save -add_action( 'profile_update', 'thalim_sync_display_name' ); -add_action( 'user_register', 'thalim_sync_display_name' ); -add_action( 'pods_api_post_save_pod_item_user', function( $pieces ) { - $user_id = isset( $pieces['id'] ) ? intval( $pieces['id'] ) : 0; - if ( $user_id ) thalim_sync_display_name( $user_id ); -} ); - -function thalim_sync_display_name( int $user_id ): void { - $first = get_user_meta( $user_id, 'first_name', true ); - $last = get_user_meta( $user_id, 'last_name', true ); - $name = trim( "$first $last" ); - if ( ! $name ) return; - // Bypass the filter to avoid infinite loop - remove_action( 'profile_update', 'thalim_sync_display_name' ); - wp_update_user( [ 'ID' => $user_id, 'display_name' => $name ] ); - add_action( 'profile_update', 'thalim_sync_display_name' ); -} - -add_action( 'admin_enqueue_scripts', 'enqueue_admin_js' ); - -function enqueue_admin_js(){ - wp_enqueue_style( - 'adminDashboardStyles', - get_template_directory_uri() . '/css/admin.css', - [], - filemtime(get_template_directory() . '/css/admin.css') - ); - - wp_enqueue_script( - 'adminDashboardMods', - get_template_directory_uri() . '/js/adminDashboardMods.js', - [], - filemtime(get_template_directory() . '/js/adminDashboardMods.js'), - true - ); - $axes_groups = thalim_get_axes_filter_groups(); - if ( current_user_can( 'contributor' ) && ! current_user_can( 'edit_others_posts' ) ) { - $axes_groups = array_slice( $axes_groups, 0, 1 ); - } - wp_localize_script( 'adminDashboardMods', 'thalimAxesGroups', $axes_groups ); - - // [DÉSACTIVÉ] adminFormRestore — décommenter pour réactiver - // $screen = get_current_screen(); - // if ( $screen && 'post' === $screen->base ) { - // wp_enqueue_script( - // 'adminFormRestore', - // get_template_directory_uri() . '/js/adminFormRestore.js', - // [ 'jquery' ], - // filemtime(get_template_directory() . '/js/adminFormRestore.js'), - // true - // ); - // } -} -add_theme_support('title-tag'); - -// Apply bilingual split to the browser tab title + translate category names -add_filter('document_title_parts', function ($title_parts) { - if (!empty($title_parts['title'])) { - $title_parts['title'] = thalim_bilingual($title_parts['title']); - // On category archives, replace the title with the translated category name - if ( is_category() ) { - $cat = get_queried_object(); - if ( $cat ) { - $title_parts['title'] = thalim_cat_name( $cat ); - } - } - } - return $title_parts; -}); - -function add_to_context($context) { - $current_lang = thalim_current_language(); - - // menus - $menu_slug = ($current_lang === 'en') ? 'Navigation-en' : 'Navigation'; - $context['menu'] = Timber::get_menu($menu_slug); - - $footer_menu_slug = ($current_lang === 'en') ? 'Footer-en' : 'Footer'; - $context['footer_menu'] = Timber::get_menu($footer_menu_slug); - - // contenus généraux (single post, bilingual) - $gc_posts = Timber::get_posts([ - 'post_type' => 'contenu_general', - 'posts_per_page' => 1, - 'orderby' => 'ID', - 'order' => 'ASC', - ]); - $gc_post = $gc_posts[0] ?? null; - if ( $gc_post ) { - $context['gc'] = [ - 'umr' => thalim_bilingual( $gc_post->umr ?: '', $current_lang ), - 'thalim' => thalim_bilingual( $gc_post->thalim ?: '', $current_lang ), - 'siecles' => thalim_bilingual( $gc_post->siecles ?: '', $current_lang ), - 'presentation' => ( $current_lang === 'en' && $gc_post->presentation_en ) ? $gc_post->presentation_en : $gc_post->presentation, - 'presentation_detail' => ( $current_lang === 'en' && $gc_post->presentation_detail_en ) ? $gc_post->presentation_detail_en : $gc_post->presentation_detail, - ]; - } else { - $context['gc'] = []; - } - - $context['current_language'] = $current_lang; - - // Axes thématiques courants (annee_fin >= current year) for navigation dropdown - $current_year = (int) date('Y'); - $all_axes = get_terms(['taxonomy' => 'axe_thematique', 'hide_empty' => false, 'orderby' => 'name']); - $axes_courants = []; - if (!is_wp_error($all_axes)) { - foreach ($all_axes as $axe) { - $fin = (int) get_term_meta($axe->term_id, 'annee_fin', true); - if ($fin >= $current_year) { - $link = get_term_link($axe); - if (!is_wp_error($link)) { - $axes_courants[] = [ - 'name' => thalim_bilingual($axe->name, $current_lang), - 'link' => $link, - 'ordre' => (int) get_term_meta($axe->term_id, 'ordre_daffichage', true), - ]; - } - } - } - usort($axes_courants, fn($a, $b) => $a['ordre'] <=> $b['ordre']); - } - $context['axes_courants'] = $axes_courants; - - // Annonces page URL (language-aware) - $annonces_page = get_page_by_path('annonces'); - $annonces_base = $annonces_page ? get_permalink($annonces_page->ID) : home_url('/annonces/'); - $context['annonces_url'] = $annonces_base; - - // Language switcher - $context['languages'] = thalim_language_switcher(); - - return $context; -} - -// Restrict Contributors to see only their own posts in admin, -// but also include posts where they appear in membres/autre_membres. -function restrict_contributor_posts( $query ) { - if ( ! is_admin() || ! $query->is_main_query() || current_user_can( 'edit_others_posts' ) ) { - return; - } - - global $user_ID, $wpdb; - - // Posts where the user is listed as membre or autre_membre. - $membre_ids = array_map( 'intval', (array) $wpdb->get_col( - $wpdb->prepare( - "SELECT DISTINCT post_id FROM {$wpdb->postmeta} - WHERE meta_key IN ('membres', 'autre_membres') AND meta_value = %s", - $user_ID - ) - ) ); - - if ( empty( $membre_ids ) ) { - // Fast path: no membre posts, use simple author filter. - $query->set( 'author', $user_ID ); - return; - } - - // Posts authored by this user. - $authored_ids = array_map( 'intval', (array) $wpdb->get_col( - $wpdb->prepare( - "SELECT ID FROM {$wpdb->posts} WHERE post_author = %d", - $user_ID - ) - ) ); - - $all_ids = array_unique( array_merge( $authored_ids, $membre_ids ) ); - - // post__in with [0] returns nothing when the combined set is empty. - $query->set( 'post__in', empty( $all_ids ) ? [ 0 ] : $all_ids ); -} -add_action( 'pre_get_posts', 'restrict_contributor_posts' ); - -/** - * Let contributors listed as membres/autre_membres on a post edit it. - * - * user_has_cap modifies capabilities only for this single check — - * it does not permanently alter the user's capability set. - */ -function thalim_membres_can_edit_post( $allcaps, $caps, $args, $user ) { - // Editors and above already have edit_others_posts — nothing to do. - if ( ! empty( $allcaps['edit_others_posts'] ) ) { - return $allcaps; - } - - if ( empty( $args[0] ) ) { - return $allcaps; - } - - $cap = $args[0]; - - // Meta caps that carry a post ID in $args[2] (e.g. wp-admin/post.php load). - $meta_caps_with_id = [ 'edit_post', 'edit_page' ]; - - // Primitive caps called during the admin save flow *without* a - // post_id (e.g. wp-admin/includes/post.php:76 checks edit_others_posts - // directly when $post_author !== current user). We infer the post_id from - // the request so we can still authorize membres per-post. - // - // NOTE: publish_posts / publish_pages are intentionally NOT in this list — - // contributors listed in `membres` must be able to edit (incl. published) - // posts of the lab, but only editors/admins should be able to publish. - $primitive_caps_in_save_flow = [ - 'edit_others_posts', - 'edit_others_pages', - 'edit_published_posts', - 'edit_published_pages', - ]; - - $post_id = 0; - if ( in_array( $cap, $meta_caps_with_id, true ) && ! empty( $args[2] ) ) { - $post_id = (int) $args[2]; - } elseif ( in_array( $cap, $primitive_caps_in_save_flow, true ) ) { - $post_id = (int) ( $_POST['post_ID'] ?? $_REQUEST['post'] ?? 0 ); - } - - if ( ! $post_id ) { - return $allcaps; - } - - $user_id = $user->ID; - - $membre_ids = array_map( - 'intval', - array_merge( - (array) get_post_meta( $post_id, 'membres', false ), - (array) get_post_meta( $post_id, 'autre_membres', false ) - ) - ); - - if ( in_array( $user_id, $membre_ids, true ) ) { - // Grant every primitive cap mapped for this check - // (e.g. edit_others_posts, edit_published_posts). - foreach ( $caps as $c ) { - $allcaps[ $c ] = true; - } - } - - return $allcaps; -} -add_filter( 'user_has_cap', 'thalim_membres_can_edit_post', 10, 4 ); - -// Prevent WP_Posts_List_Table from auto-redirecting contributors to the "Mine" -// view. The constructor sets $_GET['author'] = current_user_id() when the user -// lacks edit_others_posts and no other filter is active. Setting all_posts=1 -// before the list table is constructed short-circuits that condition. -add_action( 'load-edit.php', function () { - if ( current_user_can( 'edit_others_posts' ) ) { - return; - } - if ( - empty( $_REQUEST['post_status'] ) - && empty( $_REQUEST['all_posts'] ) - && empty( $_REQUEST['author'] ) - && empty( $_REQUEST['show_sticky'] ) - ) { - $_GET['all_posts'] = 1; - $_REQUEST['all_posts'] = 1; - } -} ); - -// Adjust post-status counts so contributors see only posts they can access -// (posts they authored + posts listed in membres/autre_membres), not all posts. -// The wp_count_posts filter runs even on cached values, so it won't pollute -// the shared cache. -add_filter( 'wp_count_posts', function ( $counts, $type, $perm ) { - if ( ! is_admin() || current_user_can( 'edit_others_posts' ) ) { - return $counts; - } - - global $wpdb; - $user_id = get_current_user_id(); - - $results = $wpdb->get_results( - $wpdb->prepare( - "SELECT post_status, COUNT(*) AS num_posts - FROM {$wpdb->posts} - WHERE post_type = %s - AND ID IN ( - SELECT ID FROM {$wpdb->posts} - WHERE post_author = %d AND post_type = %s - UNION - SELECT post_id FROM {$wpdb->postmeta} - WHERE meta_key IN ('membres', 'autre_membres') AND meta_value = %s - ) - GROUP BY post_status", - $type, - $user_id, - $type, - (string) $user_id - ), - ARRAY_A - ); - - $new_counts = array_fill_keys( get_post_stati(), 0 ); - foreach ( $results as $row ) { - $new_counts[ $row['post_status'] ] = (int) $row['num_posts']; - } - - return (object) $new_counts; -}, 10, 3 ); - -// Show Pods user meta fields on the Add New User page (user-new.php). -// Fires the same hook Pods listens to on profile.php / user-edit.php. -add_action('user_new_form', function($operation) { - if ($operation === 'add-existing-user') return; - $user = new WP_User(0); - do_action('show_user_profile', $user); -}); - -// Save Pods user meta fields when a new user is registered. -// Re-fires Pods' personal_options_update callback with the new user ID -// while $_POST still contains the submitted form data. -add_action('user_register', function($user_id) { - do_action('personal_options_update', $user_id); -}, 20); - -// Remove the Pods autocomplete 30-item cap for the "étiquettes" (post_tag) pick field -// so all tags are available in the dropdown, not just the first 30 alphabetically. -add_filter( 'pods_form_ui_field_pick_autocomplete_limit', function( $limit, $name ) { - if ( 'etiquettes' === $name ) { - return -1; - } - return $limit; -}, 10, 2 ); - -// Admin "Programmes de recherche" taxonomy list: -// - Filter by "Type de programme" (select injected via JS into the search form). -// - Add a "Type de programme" column to the list table. - -// Server-side filtering: read the GET param and add a meta_query on pre_get_terms. -add_action( 'pre_get_terms', function( $query ) { - if ( ! is_admin() ) { - return; - } - if ( ! in_array( 'programme_de_recherche', (array) $query->query_vars['taxonomy'], true ) ) { - return; - } - $type = isset( $_GET['type_de_programme'] ) ? sanitize_text_field( $_GET['type_de_programme'] ) : ''; - if ( '' === $type ) { - return; - } - $query->query_vars['meta_query'] = [ - [ - 'key' => 'type_de_programme', - 'value' => $type, - 'compare' => '=', - ], - ]; -} ); - -// Column: add "Type de programme" to the list table, replacing "Description". -add_filter( 'manage_edit-programme_de_recherche_columns', function( $columns ) { - unset( $columns['description'] ); - $columns['type_de_programme'] = __( 'Type de programme', 'thalim' ); - return $columns; -} ); - -add_filter( 'manage_programme_de_recherche_custom_column', function( $output, $column_name, $term_id ) { - if ( 'type_de_programme' !== $column_name ) { - return $output; - } - return esc_html( get_term_meta( (int) $term_id, 'type_de_programme', true ) ?: '—' ); -}, 10, 3 ); - -// Admin tag list: replace the "Description" column with the custom boolean field -// "ne_pas_afficher_dans_le_nuage" (Ne pas afficher dans le nuage de mots-clé). - -add_filter( 'manage_edit-post_tag_columns', function( $columns ) { - unset( $columns['description'] ); - $columns['nuage_exclus'] = __( 'Exclure du nuage', 'thalim' ); - return $columns; -} ); - -add_filter( 'manage_post_tag_custom_column', function( $output, $column_name, $term_id ) { - if ( 'nuage_exclus' !== $column_name ) { - return $output; - } - $val = get_term_meta( (int) $term_id, 'ne_pas_afficher_dans_le_nuage', true ); - return $val ? '✓' : '—'; -}, 10, 3 ); - +add_theme_support( 'title-tag' ); + +// Identifiants centralisés (catégories par slug, couleurs de rubrique) +require_once __DIR__ . '/inc/config.php'; +// Multilingue maison (langue, |bilingual, |en_url, |cat_name, switcher) +require_once __DIR__ . '/inc/i18n.php'; +// Avatars (Simple Local Avatar → Gravatar → initiales) +require_once __DIR__ . '/inc/avatars.php'; +// Enqueue des assets front et admin +require_once __DIR__ . '/inc/assets.php'; +// Contexte Twig global (menus, gc, axes courants, switcher) +require_once __DIR__ . '/inc/context.php'; +// Tri/filtre par date d'événement + helpers de listes (épinglés, groupes d'axes) +require_once __DIR__ . '/inc/event-dates.php'; +// Séances de séminaire : résolution du parent + redirection #seance-{ID} +require_once __DIR__ . '/inc/seance-helpers.php'; +// Handlers AJAX du scroll infini (grille + agenda) +require_once __DIR__ . '/inc/ajax.php'; +// Restrictions contributeurs, Vie du labo, redirections login/dashboard +require_once __DIR__ . '/inc/access-control.php'; +// Customisations admin (display_name, colonnes, admin bar, /autres…) +require_once __DIR__ . '/inc/admin-tweaks.php'; +// Filtre « Statut » sur la liste des utilisateurs require_once __DIR__ . '/inc/admin-users-filter.php'; +// Patchs Pods : validation conditionnelle requise, erreurs de sauvegarde require_once __DIR__ . '/inc/pods-conditional-required.php'; require_once __DIR__ . '/inc/pods-save-error-handler.php'; require_once __DIR__ . '/inc/post-title-required.php'; +// Helpers partagés des pages d'archives (filtres GET, rubriques, « Autres ») +require_once __DIR__ . '/inc/archive-filters.php'; +// Helpers de données pour les templates require_once __DIR__ . '/inc/post-card-helpers.php'; require_once __DIR__ . '/inc/single-helpers.php'; require_once __DIR__ . '/inc/author-helpers.php'; - -// In admin post list, filter by exact category only (exclude subcategories) -function thalim_exact_category_filter( $query ) { - if ( is_admin() && $query->is_main_query() ) { - $cat = $query->get( 'cat' ); - if ( $cat ) { - $query->set( 'cat', '' ); - $query->set( 'tax_query', [ - [ - 'taxonomy' => 'category', - 'field' => 'term_id', - 'terms' => [ (int) $cat ], - 'include_children' => false, - ], - ] ); - } - } -} -add_action( 'pre_get_posts', 'thalim_exact_category_filter' ); - -// ── "Vie du labo" (cat 9) — restricted to logged-in users ──── -add_action( 'pre_get_posts', function( $query ) { - if ( is_user_logged_in() ) return; - $excluded = $query->get( 'category__not_in' ); - if ( ! is_array( $excluded ) ) $excluded = $excluded ? [ $excluded ] : []; - if ( ! in_array( 9, $excluded ) ) { - $excluded[] = 9; - $query->set( 'category__not_in', $excluded ); - } -} ); - -add_action( 'template_redirect', function() { - if ( ! is_user_logged_in() && is_category( 9 ) ) { - wp_safe_redirect( home_url( '/' ) ); - exit; - } -} ); - -// Séance de séminaire (cat 12): redirect to parent séminaire with #seance-{ID} anchor -add_action( 'template_redirect', function() { - if ( ! is_single() ) return; - if ( ! has_category( 12 ) ) return; - - global $wpdb; - $seance_id = get_the_ID(); - $parent_id = $wpdb->get_var( $wpdb->prepare( - "SELECT pm.post_id FROM {$wpdb->postmeta} pm - JOIN {$wpdb->posts} p ON p.ID = pm.post_id - WHERE pm.meta_key = 'seances' AND pm.meta_value = %s - AND p.post_status = 'publish' - LIMIT 1", - (string) $seance_id - ) ); - - if ( $parent_id ) { - wp_redirect( get_permalink( (int) $parent_id ) . '#seance-' . $seance_id, 301 ); - exit; - } -} ); - -add_filter( 'wp_nav_menu_objects', function( $items, $args ) { - if ( is_user_logged_in() ) return $items; - return array_values( array_filter( $items, function( $item ) { - if ( $item->object === 'category' && (int) $item->object_id === 9 ) return false; - if ( strpos( $item->url, 'vie-du-labo' ) !== false ) return false; - return true; - } ) ); -}, 10, 2 ); - -// Rewrite rule for /category/{slug}/autres → posts directly in parent category -add_action('init', function() { - add_rewrite_rule( - 'category/([^/]+)/autres/?$', - 'index.php?category_name=$matches[1]&thalim_direct_posts=1', - 'top' - ); -}); -add_filter('query_vars', function($vars) { - $vars[] = 'thalim_direct_posts'; - return $vars; -}); - -// Admin bar customizations (front + back) -add_action('admin_bar_menu', function($wp_admin_bar) { - $wp_admin_bar->remove_node('wp-logo'); - $wp_admin_bar->remove_node('customize'); - foreach ($wp_admin_bar->get_nodes() as $node) { - if (empty($node->title) || stripos($node->title, 'article') === false) continue; - $node->title = preg_replace_callback('/article/i', function($m) { - $w = $m[0]; - if ($w === strtoupper($w)) return 'ANNONCE'; - if ($w[0] === strtoupper($w[0])) return 'Annonce'; - return 'annonce'; - }, $node->title); - $wp_admin_bar->add_node((array) $node); - } -}, 999); - -add_action('wp_before_admin_bar_render', function() { - global $wp_admin_bar; - $wp_admin_bar->remove_node('wpforms-menu'); -}); - -// Force visual (TinyMCE) editor for all users — our admin CSS hides the -// Visual/Code tabs, so if a user has "Disable the visual editor" checked -// in their profile they get stuck in code mode with no way to switch back. -add_filter( 'user_can_richedit', '__return_true' ); - -// Non-admins: hide dashboard and tools menu, redirect to posts list -add_action( 'admin_menu', function() { - if ( ! current_user_can( 'manage_options' ) ) { - remove_menu_page( 'tools.php' ); - remove_menu_page( 'index.php' ); - } -} ); - -// Redirect non-admins away from dashboard to their posts list -add_action( 'admin_init', function() { - if ( current_user_can( 'manage_options' ) ) return; - global $pagenow; - if ( $pagenow === 'index.php' ) { - wp_safe_redirect( admin_url( 'edit.php' ) ); - exit; - } -} ); - -// After login, send non-admins to posts list instead of dashboard -add_filter( 'login_redirect', function( $redirect_to, $requested, $user ) { - if ( ! is_wp_error( $user ) && ! $user->has_cap( 'manage_options' ) ) { - return admin_url( 'edit.php' ); - } - return $redirect_to; -}, 10, 3 ); - -// Return the IDs of posts currently pinned ("épinglé dans la catégorie") in a given category. -// A pin is active if epingler_dans_la_categorie == 1 AND date_de_fin_depinglage is empty/0000-00-00/future. -// Shared by category.php (pull them out of the main flow) and the AJAX handler (exclude them from -// pagination) so both sides stay in sync — a mismatch shifts the page boundary and dupes posts. -function thalim_get_active_pinned_ids( $category_id ) { - if ( ! $category_id ) return []; - $today = date( 'Y-m-d' ); - $pinned_query = new WP_Query([ - 'post_type' => 'post', - 'post_status' => 'publish', - 'posts_per_page' => -1, - 'fields' => 'ids', - 'no_found_rows' => true, - 'lang' => '', - 'tax_query' => [[ - 'taxonomy' => 'category', - 'field' => 'term_id', - 'terms' => [ $category_id ], - 'include_children' => false, - ]], - 'meta_query' => [[ - 'key' => 'epingler_dans_la_categorie', - 'value' => '1', - ]], - ]); - $pinned_ids = []; - foreach ( $pinned_query->posts as $pid ) { - $fin = get_post_meta( $pid, 'date_de_fin_depinglage', true ); - if ( empty( $fin ) || $fin === '0000-00-00' || $fin >= $today ) { - $pinned_ids[] = $pid; - } - } - return $pinned_ids; -} - -// AJAX handler for infinite scroll on category pages -function thalim_load_more_posts() { - check_ajax_referer('load_more_posts', 'nonce'); - - $GLOBALS['thalim_lang_override'] = sanitize_key( $_POST['lang'] ?? 'fr' ); - - $page = intval($_POST['page']); - $category = isset($_POST['category']) ? intval($_POST['category']) : 0; - $axe = isset($_POST['axe']) ? intval($_POST['axe']) : 0; - $date_from = isset($_POST['date_from']) ? sanitize_text_field($_POST['date_from']) : ''; - $date_to = isset($_POST['date_to']) ? sanitize_text_field($_POST['date_to']) : ''; - $term_taxonomy = isset($_POST['taxonomy']) ? sanitize_key($_POST['taxonomy']) : ''; - $term_id = isset($_POST['term']) ? intval($_POST['term']) : 0; - $cat_filter = isset($_POST['filter_cat']) ? intval($_POST['filter_cat']) : 0; - $filter_autres = isset($_POST['filter_autres']) ? intval($_POST['filter_autres']) : 0; - $exclude_cats = isset($_POST['exclude_cats']) ? sanitize_text_field($_POST['exclude_cats']) : ''; - $search = isset($_POST['search']) ? sanitize_text_field($_POST['search']) : ''; - - $query_args = [ - 'post_type' => 'post', - 'post_status' => 'publish', // admin-ajax => is_admin() true: sans ça WP ajoute future/draft/pending et décale la pagination vs le front - 'posts_per_page' => 12, - 'paged' => $page, - 'orderby' => 'date', - 'order' => 'DESC', - 'lang' => '', - 'thalim_event_date_order' => true, - ]; - if ($search) { - $query_args['s'] = $search; - $query_args['relevanssi'] = true; - $query_args['orderby'] = 'relevance'; - } - - // Build tax_query — may combine category page filter, taxonomy term, and cat filter - $tax_clauses = []; - if ($category) { - $tax_clauses[] = [ - 'taxonomy' => 'category', - 'field' => 'term_id', - 'terms' => [$category], - 'include_children' => false, - ]; - } - if ($term_taxonomy && $term_id) { - $tax_clauses[] = [ - 'taxonomy' => $term_taxonomy, - 'field' => 'term_id', - 'terms' => [$term_id], - ]; - // Exclure les séances de séminaire sur les pages de taxonomie - $tax_clauses[] = [ - 'taxonomy' => 'category', - 'field' => 'term_id', - 'terms' => [12], - 'operator' => 'NOT IN', - ]; - } - if ($cat_filter) { - $tax_clauses[] = [ - 'taxonomy' => 'category', - 'field' => 'term_id', - 'terms' => [$cat_filter], - 'include_children' => !$filter_autres, - ]; - } - if ($exclude_cats) { - $ids = array_filter(array_map('intval', explode(',', $exclude_cats))); - if (!empty($ids)) { - $tax_clauses[] = [ - 'taxonomy' => 'category', - 'field' => 'term_id', - 'terms' => $ids, - 'operator' => 'NOT IN', - ]; - } - } - - if (!empty($tax_clauses)) { - $query_args['tax_query'] = count($tax_clauses) > 1 - ? array_merge(['relation' => 'AND'], $tax_clauses) - : $tax_clauses; - } - - if ($axe) { - $query_args['meta_query'] = [[ - 'key' => 'axes_thematiques', - 'value' => $axe, - 'type' => 'NUMERIC', - ]]; - } - - if ($date_from || $date_to) { - $query_args['thalim_event_date_filter'] = ['from' => $date_from, 'to' => $date_to]; - } - - // Exclude pinned posts on category pages to avoid duplicates (they already appear at the top, - // pulled out of the main flow by category.php). Must mirror category.php exactly. - if ($category) { - $pinned_ids = thalim_get_active_pinned_ids( $category ); - if ( ! empty( $pinned_ids ) ) { - $query_args['post__not_in'] = $pinned_ids; - } - } - - $posts = Timber::get_posts($query_args); - - if (empty($posts)) { - wp_send_json_success(['html' => '']); - return; - } - - $cards = thalim_get_cards_data($posts); - - $html = ''; - foreach ($posts as $post) { - $html .= Timber::compile('partials/post-card.twig', [ - 'post' => $post, - 'card' => $cards[$post->ID], - 'show_category' => true, - 'type_only' => $category > 0, // category pages: type chip only; everywhere else (taxonomy, search, annonces): type or category name - ]); - } - - wp_send_json_success(['html' => $html]); -} -add_action('wp_ajax_load_more_posts', 'thalim_load_more_posts'); -add_action('wp_ajax_nopriv_load_more_posts', 'thalim_load_more_posts'); - -/** - * Build structured data for one agenda slider card. - */ -function thalim_get_agenda_card_data( $post_id, $lang = 'fr' ) { - $months_fr = ['jan.','fév.','mars','avr.','mai','juin','juil.','août','sept.','oct.','nov.','déc.']; - $months_en = ['Jan.','Feb.','Mar.','Apr.','May','Jun.','Jul.','Aug.','Sep.','Oct.','Nov.','Dec.']; - $months = $lang === 'en' ? $months_en : $months_fr; - - $raw_debut = get_post_meta( $post_id, 'date_de_debut', true ); - $raw_datetime = get_post_meta( $post_id, 'datetime', true ); - if ( $raw_debut && ! str_starts_with( $raw_debut, '0000' ) ) { - $ts = strtotime( $raw_debut ); - } elseif ( $raw_datetime && ! str_starts_with( $raw_datetime, '0000' ) ) { - $ts = strtotime( $raw_datetime ); - } else { - $ts = get_post_timestamp( $post_id ); - } - - $raw_fin = get_post_meta( $post_id, 'date_de_fin', true ); - $ts_debut = ( $raw_debut && ! str_starts_with( $raw_debut, '0000' ) ) ? strtotime( $raw_debut ) : 0; - $ts_fin = ( $raw_fin && ! str_starts_with( $raw_fin, '0000' ) ) ? strtotime( $raw_fin ) : 0; - - // Build date_label — same rules as single.twig sidebar - $fmt_debut = $ts_debut ? thalim_format_date( $raw_debut, $lang ) : ''; - $fmt_fin = $ts_fin ? thalim_format_date( $raw_fin, $lang ) : ''; - $fmt_dt = ( $raw_datetime && ! str_starts_with( $raw_datetime, '0000' ) ) - ? thalim_format_date( $raw_datetime, $lang ) : ''; - $h_debut = substr( get_post_meta( $post_id, 'heure_de_debut', true ) ?: '', 0, 5 ); - $h_fin = substr( get_post_meta( $post_id, 'heure_de_fin', true ) ?: '', 0, 5 ); - - if ( $fmt_debut || $fmt_fin ) { - if ( $ts_debut && $ts_fin && date( 'Y-m-d', $ts_debut ) === date( 'Y-m-d', $ts_fin ) ) { - // Same day - if ( $h_debut && $h_fin ) { - $date_label = ( $lang === 'en' ? 'On ' : 'Le ' ) . $fmt_debut - . ' ' . ( $lang === 'en' ? 'from ' : 'de ' ) . $h_debut - . ' ' . ( $lang === 'en' ? 'to ' : 'à ' ) . $h_fin; - } elseif ( $h_debut ) { - $date_label = $fmt_debut . ( $lang === 'en' ? ' at ' : ' à ' ) . $h_debut; - } else { - $date_label = $fmt_debut; - } - } elseif ( $fmt_debut && $fmt_fin ) { - $date_label = ( $lang === 'en' ? 'From ' : 'Du ' ) . $fmt_debut - . ' ' . ( $lang === 'en' ? 'to ' : 'au ' ) . $fmt_fin; - } elseif ( $fmt_debut ) { - $date_label = $h_debut - ? $fmt_debut . ( $lang === 'en' ? ' at ' : ' à ' ) . $h_debut - : $fmt_debut; - } else { - $date_label = ( $lang === 'en' ? 'Until ' : "Jusqu'au " ) . $fmt_fin; - } - } elseif ( $fmt_dt ) { - $date_label = $h_debut - ? $fmt_dt . ( $lang === 'en' ? ' at ' : ' à ' ) . $h_debut - : $fmt_dt; - } else { - $date_label = ''; - } - - $type_fields = [ - 'type_colloque_journee_d_etude', 'type_soutenance', 'type_evenement_culturel', - 'type_media', 'type_captation', 'type_revue_collection', 'type_autre', - ]; - $type_label = ''; - foreach ( $type_fields as $f ) { - $v = get_post_meta( $post_id, $f, true ); - if ( $v ) { $type_label = thalim_bilingual( $v, $lang ); break; } - } - if ( ! $type_label ) { - foreach ( get_the_category( $post_id ) as $cat ) { - if ( $cat->parent ) { $type_label = thalim_cat_name( $cat, $lang ); break; } - } - } - - $end_day = $end_month = $end_year = null; - if ( $ts_fin && date( 'Ymd', $ts_fin ) !== date( 'Ymd', $ts ) ) { - $end_day = (int) date( 'j', $ts_fin ); - $end_month = $months[ (int) date( 'n', $ts_fin ) - 1 ]; - $end_year = (int) date( 'Y', $ts_fin ); - } - - // Séance de séminaire (cat 12): link to parent séminaire at #seance-{ID} - $link = get_permalink( $post_id ); - if ( in_array( 12, wp_list_pluck( get_the_category( $post_id ), 'term_id' ) ) ) { - global $wpdb; - $parent_id = $wpdb->get_var( $wpdb->prepare( - "SELECT pm.post_id FROM {$wpdb->postmeta} pm - JOIN {$wpdb->posts} p ON p.ID = pm.post_id - WHERE pm.meta_key = 'seances' AND pm.meta_value = %s - AND p.post_status = 'publish' - LIMIT 1", - (string) $post_id - ) ); - if ( $parent_id ) { - $link = get_permalink( (int) $parent_id ) . '#seance-' . $post_id; - } - } - - return [ - 'day' => (int) date( 'j', $ts ), - 'month' => $months[ (int) date( 'n', $ts ) - 1 ], - 'year' => (int) date( 'Y', $ts ), - 'end_day' => $end_day, - 'end_month' => $end_month, - 'end_year' => $end_year, - 'type_label' => $type_label, - 'date_label' => $date_label, - 'lieu' => thalim_bilingual( get_post_meta( $post_id, 'lieu', true ) ?: '', $lang ), - 'link' => $link, - ]; -} - -function thalim_load_more_agenda() { - check_ajax_referer( 'load_more_posts', 'nonce' ); - - $lang = sanitize_key( $_POST['lang'] ?? 'fr' ); - $GLOBALS['thalim_lang_override'] = $lang; - $page = intval( $_POST['page'] ); - $category = isset( $_POST['category'] ) ? intval( $_POST['category'] ) : 0; - $axe = isset( $_POST['axe'] ) ? intval( $_POST['axe'] ) : 0; - $date_from = isset( $_POST['date_from'] ) ? sanitize_text_field( $_POST['date_from'] ) : ''; - $date_to = isset( $_POST['date_to'] ) ? sanitize_text_field( $_POST['date_to'] ) : ''; - $term_taxonomy = isset( $_POST['taxonomy'] ) ? sanitize_key( $_POST['taxonomy'] ) : ''; - $term_id = isset( $_POST['term'] ) ? intval( $_POST['term'] ) : 0; - $cat_filter = isset( $_POST['filter_cat'] ) ? intval( $_POST['filter_cat'] ) : 0; - $filter_autres = isset( $_POST['filter_autres'] ) ? intval( $_POST['filter_autres'] ) : 0; - $exclude_cats = isset( $_POST['exclude_cats'] ) ? sanitize_text_field( $_POST['exclude_cats'] ) : ''; - - $query_args = [ - 'post_type' => 'post', - 'post_status' => 'publish', // admin-ajax => is_admin() true: sans ça WP ajoute future/draft/pending et décale la pagination vs le front - 'posts_per_page' => 12, - 'paged' => $page, - 'orderby' => 'date', - 'order' => 'DESC', - 'lang' => '', - 'thalim_event_date_order' => true, - ]; - - $include_children = ! empty( $_POST['include_children'] ); - - $tax_clauses = []; - if ( $category ) { - $tax_clauses[] = [ 'taxonomy' => 'category', 'field' => 'term_id', 'terms' => [ $category ], 'include_children' => $include_children ]; - } - if ( $term_taxonomy && $term_id ) { - $tax_clauses[] = [ 'taxonomy' => $term_taxonomy, 'field' => 'term_id', 'terms' => [ $term_id ] ]; - $tax_clauses[] = [ 'taxonomy' => 'category', 'field' => 'term_id', 'terms' => [ 12 ], 'operator' => 'NOT IN' ]; - } - if ( $cat_filter ) { - $tax_clauses[] = [ 'taxonomy' => 'category', 'field' => 'term_id', 'terms' => [ $cat_filter ], 'include_children' => ! $filter_autres ]; - } - if ( $exclude_cats ) { - $ids = array_filter( array_map( 'intval', explode( ',', $exclude_cats ) ) ); - if ( ! empty( $ids ) ) { - $tax_clauses[] = [ 'taxonomy' => 'category', 'field' => 'term_id', 'terms' => $ids, 'operator' => 'NOT IN' ]; - } - } - if ( ! empty( $tax_clauses ) ) { - $query_args['tax_query'] = count( $tax_clauses ) > 1 - ? array_merge( [ 'relation' => 'AND' ], $tax_clauses ) - : $tax_clauses; - } - if ( $axe ) { - $query_args['meta_query'] = [[ 'key' => 'axes_thematiques', 'value' => $axe, 'type' => 'NUMERIC' ]]; - } - if ( $date_from || $date_to ) { - $query_args['thalim_event_date_filter'] = [ 'from' => $date_from, 'to' => $date_to ]; - } - - // On first page, count future events to find today's anchor position - $today_offset = 0; - if ( (int) $page === 1 ) { - $offset_args = $query_args; - $offset_args['posts_per_page'] = 1; - $offset_args['no_found_rows'] = false; - $offset_args['paged'] = 1; - $today_str = current_time( 'Y-m-d' ); - $existing_filter = $offset_args['thalim_event_date_filter'] ?? []; - $offset_args['thalim_event_date_filter'] = array_merge( - $existing_filter, - [ 'from' => $today_str ] - ); - $future_query = new \WP_Query( $offset_args ); - $today_offset = (int) $future_query->found_posts; - } - - $posts = Timber::get_posts( $query_args ); - if ( empty( $posts ) ) { - $response = [ 'html' => '' ]; - if ( (int) $page === 1 ) $response['today_offset'] = $today_offset; - wp_send_json_success( $response ); - return; - } - - $html = ''; - foreach ( $posts as $post ) { - $data = thalim_get_agenda_card_data( $post->ID, $lang ); - $html .= Timber::compile( 'partials/agenda-card.twig', array_merge( $data, [ 'post' => $post ] ) ); - } - $response = [ 'html' => $html ]; - if ( (int) $page === 1 ) $response['today_offset'] = $today_offset; - wp_send_json_success( $response ); -} -add_action( 'wp_ajax_load_more_agenda', 'thalim_load_more_agenda' ); -add_action( 'wp_ajax_nopriv_load_more_agenda', 'thalim_load_more_agenda' ); - -// Event date ordering: LEFT JOIN + COALESCE(date_de_debut, post_date) -// Activated by adding 'thalim_event_date_order' => true to WP_Query args. -// Event date ordering: COALESCE(date_de_debut, datetime, post_date) -// Activated by adding 'thalim_event_date_order' => true to WP_Query args. -add_filter('posts_join', function ($join, $query) { - if (!$query->get('thalim_event_date_order') && !$query->get('thalim_event_date_filter')) return $join; - global $wpdb; - $join .= " LEFT JOIN {$wpdb->postmeta} AS thalim_ed" - . " ON (thalim_ed.post_id = {$wpdb->posts}.ID" - . " AND thalim_ed.meta_key = 'date_de_debut') "; - $join .= " LEFT JOIN {$wpdb->postmeta} AS thalim_dt" - . " ON (thalim_dt.post_id = {$wpdb->posts}.ID" - . " AND thalim_dt.meta_key = 'datetime') "; - return $join; -}, 10, 2); - -add_filter('posts_orderby', function ($orderby, $query) { - if (!$query->get('thalim_event_date_order')) return $orderby; - global $wpdb; - $valid = "IS NOT NULL AND %s != '' AND %s NOT LIKE '0000-00-00%%'"; - return "CASE" - . " WHEN thalim_ed.meta_value " . sprintf($valid, 'thalim_ed.meta_value', 'thalim_ed.meta_value') . " THEN thalim_ed.meta_value" - . " WHEN thalim_dt.meta_value " . sprintf($valid, 'thalim_dt.meta_value', 'thalim_dt.meta_value') . " THEN thalim_dt.meta_value" - . " ELSE {$wpdb->posts}.post_date" - . " END DESC, {$wpdb->posts}.ID DESC"; // tiebreaker déterministe: sans lui, les dates ex-æquo paginent de façon instable entre les requêtes séparées (initial vs AJAX) -}, 10, 2); - -// Event date range filter: uses same CASE logic as ordering so date_de_debut/datetime take priority over post_date. -// Activated by adding 'thalim_event_date_filter' => ['from' => $date_from, 'to' => $date_to] to WP_Query args. -add_filter('posts_where', function ($where, $query) { - $filter = $query->get('thalim_event_date_filter'); - if (empty($filter) || (!isset($filter['from']) && !isset($filter['to']))) return $where; - global $wpdb; - - $effective = "CASE" - . " WHEN thalim_ed.meta_value IS NOT NULL AND thalim_ed.meta_value != '' AND thalim_ed.meta_value NOT LIKE '0000-00-00%' THEN thalim_ed.meta_value" - . " WHEN thalim_dt.meta_value IS NOT NULL AND thalim_dt.meta_value != '' AND thalim_dt.meta_value NOT LIKE '0000-00-00%' THEN thalim_dt.meta_value" - . " ELSE {$wpdb->posts}.post_date" - . " END"; - - if (!empty($filter['from'])) { - $from = $wpdb->prepare('%s', $filter['from']); - $where .= " AND ({$effective}) >= {$from}"; - } - if (!empty($filter['to'])) { - $to = $wpdb->prepare('%s', $filter['to'] . ' 23:59:59'); - $where .= " AND ({$effective}) <= {$to}"; - } - - return $where; -}, 10, 2); - -// ── Axes thématiques groupés pour les filtres ────────────────── -// Retourne un tableau de groupes triés par période (plus récent en premier, -// "passés" toujours en dernier). Chaque terme contient id, name, ordre. -function thalim_get_axes_filter_groups() { - $terms = get_terms( [ 'taxonomy' => 'axe_thematique', 'hide_empty' => false ] ); - $axes_map = []; - - foreach ( $terms as $term ) { - $debut = trim( get_term_meta( $term->term_id, 'annee_debut', true ) ); - $fin = trim( get_term_meta( $term->term_id, 'annee_fin', true ) ); - - if ( $debut && $fin ) { - $key = $debut . '-' . $fin; - $label = $debut . ' – ' . $fin; - } else { - $key = 'passes'; - $label = 'Axes antérieurs'; - } - - if ( ! isset( $axes_map[ $key ] ) ) { - $axes_map[ $key ] = [ 'label' => $label, 'debut' => intval( $debut ), 'terms' => [] ]; - } - - $ordre = trim( get_term_meta( $term->term_id, 'ordre_daffichage', true ) ); - $axes_map[ $key ]['terms'][] = [ - 'id' => $term->term_id, - 'name' => $term->name, - 'ordre' => $ordre !== '' ? intval( $ordre ) : null, - 'href' => get_term_link( $term ), - ]; - } - - // Tri des groupes : plus récent en premier, passés toujours en dernier - uasort( $axes_map, function ( $a, $b ) { - if ( $a['label'] === 'Axes antérieurs' ) return 1; - if ( $b['label'] === 'Axes antérieurs' ) return -1; - return $b['debut'] - $a['debut']; - } ); - - // Tri des termes dans chaque groupe : ordre_daffichage d'abord, puis alphabétique - foreach ( $axes_map as &$group ) { - usort( $group['terms'], function ( $a, $b ) { - $a_has = $a['ordre'] !== null; - $b_has = $b['ordre'] !== null; - if ( $a_has && $b_has ) return $a['ordre'] - $b['ordre']; - if ( $a_has ) return -1; - if ( $b_has ) return 1; - return strcmp( $a['name'], $b['name'] ); - } ); - } - unset( $group ); - - return array_values( $axes_map ); -} - diff --git a/inc/access-control.php b/inc/access-control.php new file mode 100644 index 0000000..b934368 --- /dev/null +++ b/inc/access-control.php @@ -0,0 +1,233 @@ +is_main_query() || current_user_can( 'edit_others_posts' ) ) { + return; + } + + global $user_ID, $wpdb; + + // Posts where the user is listed as membre or autre_membre. + $membre_ids = array_map( 'intval', (array) $wpdb->get_col( + $wpdb->prepare( + "SELECT DISTINCT post_id FROM {$wpdb->postmeta} + WHERE meta_key IN ('membres', 'autre_membres') AND meta_value = %s", + $user_ID + ) + ) ); + + if ( empty( $membre_ids ) ) { + // Fast path: no membre posts, use simple author filter. + $query->set( 'author', $user_ID ); + return; + } + + // Posts authored by this user. + $authored_ids = array_map( 'intval', (array) $wpdb->get_col( + $wpdb->prepare( + "SELECT ID FROM {$wpdb->posts} WHERE post_author = %d", + $user_ID + ) + ) ); + + $all_ids = array_unique( array_merge( $authored_ids, $membre_ids ) ); + + // post__in with [0] returns nothing when the combined set is empty. + $query->set( 'post__in', empty( $all_ids ) ? [ 0 ] : $all_ids ); +} +add_action( 'pre_get_posts', 'restrict_contributor_posts' ); + +/** + * Let contributors listed as membres/autre_membres on a post edit it. + * + * user_has_cap modifies capabilities only for this single check — + * it does not permanently alter the user's capability set. + */ +function thalim_membres_can_edit_post( $allcaps, $caps, $args, $user ) { + // Editors and above already have edit_others_posts — nothing to do. + if ( ! empty( $allcaps['edit_others_posts'] ) ) { + return $allcaps; + } + + if ( empty( $args[0] ) ) { + return $allcaps; + } + + $cap = $args[0]; + + // Meta caps that carry a post ID in $args[2] (e.g. wp-admin/post.php load). + $meta_caps_with_id = [ 'edit_post', 'edit_page' ]; + + // Primitive caps called during the admin save flow *without* a + // post_id (e.g. wp-admin/includes/post.php:76 checks edit_others_posts + // directly when $post_author !== current user). We infer the post_id from + // the request so we can still authorize membres per-post. + // + // NOTE: publish_posts / publish_pages are intentionally NOT in this list — + // contributors listed in `membres` must be able to edit (incl. published) + // posts of the lab, but only editors/admins should be able to publish. + $primitive_caps_in_save_flow = [ + 'edit_others_posts', + 'edit_others_pages', + 'edit_published_posts', + 'edit_published_pages', + ]; + + $post_id = 0; + if ( in_array( $cap, $meta_caps_with_id, true ) && ! empty( $args[2] ) ) { + $post_id = (int) $args[2]; + } elseif ( in_array( $cap, $primitive_caps_in_save_flow, true ) ) { + $post_id = (int) ( $_POST['post_ID'] ?? $_REQUEST['post'] ?? 0 ); + } + + if ( ! $post_id ) { + return $allcaps; + } + + $user_id = $user->ID; + + $membre_ids = array_map( + 'intval', + array_merge( + (array) get_post_meta( $post_id, 'membres', false ), + (array) get_post_meta( $post_id, 'autre_membres', false ) + ) + ); + + if ( in_array( $user_id, $membre_ids, true ) ) { + // Grant every primitive cap mapped for this check + // (e.g. edit_others_posts, edit_published_posts). + foreach ( $caps as $c ) { + $allcaps[ $c ] = true; + } + } + + return $allcaps; +} +add_filter( 'user_has_cap', 'thalim_membres_can_edit_post', 10, 4 ); + +// Prevent WP_Posts_List_Table from auto-redirecting contributors to the "Mine" +// view. The constructor sets $_GET['author'] = current_user_id() when the user +// lacks edit_others_posts and no other filter is active. Setting all_posts=1 +// before the list table is constructed short-circuits that condition. +add_action( 'load-edit.php', function () { + if ( current_user_can( 'edit_others_posts' ) ) { + return; + } + if ( + empty( $_REQUEST['post_status'] ) + && empty( $_REQUEST['all_posts'] ) + && empty( $_REQUEST['author'] ) + && empty( $_REQUEST['show_sticky'] ) + ) { + $_GET['all_posts'] = 1; + $_REQUEST['all_posts'] = 1; + } +} ); + +// Adjust post-status counts so contributors see only posts they can access +// (posts they authored + posts listed in membres/autre_membres), not all posts. +// The wp_count_posts filter runs even on cached values, so it won't pollute +// the shared cache. +add_filter( 'wp_count_posts', function ( $counts, $type, $perm ) { + if ( ! is_admin() || current_user_can( 'edit_others_posts' ) ) { + return $counts; + } + + global $wpdb; + $user_id = get_current_user_id(); + + $results = $wpdb->get_results( + $wpdb->prepare( + "SELECT post_status, COUNT(*) AS num_posts + FROM {$wpdb->posts} + WHERE post_type = %s + AND ID IN ( + SELECT ID FROM {$wpdb->posts} + WHERE post_author = %d AND post_type = %s + UNION + SELECT post_id FROM {$wpdb->postmeta} + WHERE meta_key IN ('membres', 'autre_membres') AND meta_value = %s + ) + GROUP BY post_status", + $type, + $user_id, + $type, + (string) $user_id + ), + ARRAY_A + ); + + $new_counts = array_fill_keys( get_post_stati(), 0 ); + foreach ( $results as $row ) { + $new_counts[ $row['post_status'] ] = (int) $row['num_posts']; + } + + return (object) $new_counts; +}, 10, 3 ); + +// ── "Vie du labo" — restricted to logged-in users ──── +add_action( 'pre_get_posts', function( $query ) { + if ( is_user_logged_in() ) return; + $vie_du_labo = thalim_cat_id( 'vie-du-labo' ); + if ( ! $vie_du_labo ) return; + $excluded = $query->get( 'category__not_in' ); + if ( ! is_array( $excluded ) ) $excluded = $excluded ? [ $excluded ] : []; + if ( ! in_array( $vie_du_labo, $excluded ) ) { + $excluded[] = $vie_du_labo; + $query->set( 'category__not_in', $excluded ); + } +} ); + +add_action( 'template_redirect', function() { + if ( ! is_user_logged_in() && is_category( thalim_cat_id( 'vie-du-labo' ) ) ) { + wp_safe_redirect( home_url( '/' ) ); + exit; + } +} ); + +add_filter( 'wp_nav_menu_objects', function( $items, $args ) { + if ( is_user_logged_in() ) return $items; + $vie_du_labo = thalim_cat_id( 'vie-du-labo' ); + return array_values( array_filter( $items, function( $item ) use ( $vie_du_labo ) { + if ( $item->object === 'category' && (int) $item->object_id === $vie_du_labo ) return false; + if ( strpos( $item->url, 'vie-du-labo' ) !== false ) return false; + return true; + } ) ); +}, 10, 2 ); + +// Non-admins: hide dashboard and tools menu, redirect to posts list +add_action( 'admin_menu', function() { + if ( ! current_user_can( 'manage_options' ) ) { + remove_menu_page( 'tools.php' ); + remove_menu_page( 'index.php' ); + } +} ); + +// Redirect non-admins away from dashboard to their posts list +add_action( 'admin_init', function() { + if ( current_user_can( 'manage_options' ) ) return; + global $pagenow; + if ( $pagenow === 'index.php' ) { + wp_safe_redirect( admin_url( 'edit.php' ) ); + exit; + } +} ); + +// After login, send non-admins to posts list instead of dashboard +add_filter( 'login_redirect', function( $redirect_to, $requested, $user ) { + if ( ! is_wp_error( $user ) && ! $user->has_cap( 'manage_options' ) ) { + return admin_url( 'edit.php' ); + } + return $redirect_to; +}, 10, 3 ); diff --git a/inc/admin-tweaks.php b/inc/admin-tweaks.php new file mode 100644 index 0000000..a7c1c01 --- /dev/null +++ b/inc/admin-tweaks.php @@ -0,0 +1,165 @@ + $user_id, 'display_name' => $name ] ); + add_action( 'profile_update', 'thalim_sync_display_name' ); +} + +// Show Pods user meta fields on the Add New User page (user-new.php). +// Fires the same hook Pods listens to on profile.php / user-edit.php. +add_action('user_new_form', function($operation) { + if ($operation === 'add-existing-user') return; + $user = new WP_User(0); + do_action('show_user_profile', $user); +}); + +// Save Pods user meta fields when a new user is registered. +// Re-fires Pods' personal_options_update callback with the new user ID +// while $_POST still contains the submitted form data. +add_action('user_register', function($user_id) { + do_action('personal_options_update', $user_id); +}, 20); + +// Remove the Pods autocomplete 30-item cap for the "étiquettes" (post_tag) pick field +// so all tags are available in the dropdown, not just the first 30 alphabetically. +add_filter( 'pods_form_ui_field_pick_autocomplete_limit', function( $limit, $name ) { + if ( 'etiquettes' === $name ) { + return -1; + } + return $limit; +}, 10, 2 ); + +// Admin "Programmes de recherche" taxonomy list: +// - Filter by "Type de programme" (select injected via JS into the search form). +// - Add a "Type de programme" column to the list table. + +// Server-side filtering: read the GET param and add a meta_query on pre_get_terms. +add_action( 'pre_get_terms', function( $query ) { + if ( ! is_admin() ) { + return; + } + if ( ! in_array( 'programme_de_recherche', (array) $query->query_vars['taxonomy'], true ) ) { + return; + } + $type = isset( $_GET['type_de_programme'] ) ? sanitize_text_field( $_GET['type_de_programme'] ) : ''; + if ( '' === $type ) { + return; + } + $query->query_vars['meta_query'] = [ + [ + 'key' => 'type_de_programme', + 'value' => $type, + 'compare' => '=', + ], + ]; +} ); + +// Column: add "Type de programme" to the list table, replacing "Description". +add_filter( 'manage_edit-programme_de_recherche_columns', function( $columns ) { + unset( $columns['description'] ); + $columns['type_de_programme'] = __( 'Type de programme', 'thalim' ); + return $columns; +} ); + +add_filter( 'manage_programme_de_recherche_custom_column', function( $output, $column_name, $term_id ) { + if ( 'type_de_programme' !== $column_name ) { + return $output; + } + return esc_html( get_term_meta( (int) $term_id, 'type_de_programme', true ) ?: '—' ); +}, 10, 3 ); + +// Admin tag list: replace the "Description" column with the custom boolean field +// "ne_pas_afficher_dans_le_nuage" (Ne pas afficher dans le nuage de mots-clé). + +add_filter( 'manage_edit-post_tag_columns', function( $columns ) { + unset( $columns['description'] ); + $columns['nuage_exclus'] = __( 'Exclure du nuage', 'thalim' ); + return $columns; +} ); + +add_filter( 'manage_post_tag_custom_column', function( $output, $column_name, $term_id ) { + if ( 'nuage_exclus' !== $column_name ) { + return $output; + } + $val = get_term_meta( (int) $term_id, 'ne_pas_afficher_dans_le_nuage', true ); + return $val ? '✓' : '—'; +}, 10, 3 ); + +// In admin post list, filter by exact category only (exclude subcategories) +function thalim_exact_category_filter( $query ) { + if ( is_admin() && $query->is_main_query() ) { + $cat = $query->get( 'cat' ); + if ( $cat ) { + $query->set( 'cat', '' ); + $query->set( 'tax_query', [ + [ + 'taxonomy' => 'category', + 'field' => 'term_id', + 'terms' => [ (int) $cat ], + 'include_children' => false, + ], + ] ); + } + } +} +add_action( 'pre_get_posts', 'thalim_exact_category_filter' ); + +// Rewrite rule for /category/{slug}/autres → posts directly in parent category +add_action('init', function() { + add_rewrite_rule( + 'category/([^/]+)/autres/?$', + 'index.php?category_name=$matches[1]&thalim_direct_posts=1', + 'top' + ); +}); +add_filter('query_vars', function($vars) { + $vars[] = 'thalim_direct_posts'; + return $vars; +}); + +// Admin bar customizations (front + back) +add_action('admin_bar_menu', function($wp_admin_bar) { + $wp_admin_bar->remove_node('wp-logo'); + $wp_admin_bar->remove_node('customize'); + foreach ($wp_admin_bar->get_nodes() as $node) { + if (empty($node->title) || stripos($node->title, 'article') === false) continue; + $node->title = preg_replace_callback('/article/i', function($m) { + $w = $m[0]; + if ($w === strtoupper($w)) return 'ANNONCE'; + if ($w[0] === strtoupper($w[0])) return 'Annonce'; + return 'annonce'; + }, $node->title); + $wp_admin_bar->add_node((array) $node); + } +}, 999); + +add_action('wp_before_admin_bar_render', function() { + global $wp_admin_bar; + $wp_admin_bar->remove_node('wpforms-menu'); +}); + +// Force visual (TinyMCE) editor for all users — our admin CSS hides the +// Visual/Code tabs, so if a user has "Disable the visual editor" checked +// in their profile they get stuck in code mode with no way to switch back. +add_filter( 'user_can_richedit', '__return_true' ); diff --git a/inc/ajax.php b/inc/ajax.php new file mode 100644 index 0000000..7b95fdb --- /dev/null +++ b/inc/ajax.php @@ -0,0 +1,305 @@ + intval( $_POST['page'] ?? 1 ), + 'category' => isset( $_POST['category'] ) ? intval( $_POST['category'] ) : 0, + 'axe' => isset( $_POST['axe'] ) ? intval( $_POST['axe'] ) : 0, + 'date_from' => isset( $_POST['date_from'] ) ? sanitize_text_field( $_POST['date_from'] ) : '', + 'date_to' => isset( $_POST['date_to'] ) ? sanitize_text_field( $_POST['date_to'] ) : '', + 'taxonomy' => isset( $_POST['taxonomy'] ) ? sanitize_key( $_POST['taxonomy'] ) : '', + 'term' => isset( $_POST['term'] ) ? intval( $_POST['term'] ) : 0, + 'filter_cat' => isset( $_POST['filter_cat'] ) ? intval( $_POST['filter_cat'] ) : 0, + 'filter_autres' => isset( $_POST['filter_autres'] ) ? intval( $_POST['filter_autres'] ) : 0, + 'exclude_cats' => isset( $_POST['exclude_cats'] ) ? sanitize_text_field( $_POST['exclude_cats'] ) : '', + 'search' => isset( $_POST['search'] ) ? sanitize_text_field( $_POST['search'] ) : '', + ]; +} + +/** + * Construit les arguments WP_Query communs aux deux handlers. + * + * @param array $f Filtres lus par thalim_ajax_read_filters(). + * @param bool $include_children include_children de la clause catégorie principale. + */ +function thalim_ajax_build_query_args( array $f, bool $include_children ): array { + $query_args = [ + 'post_type' => 'post', + 'post_status' => 'publish', // admin-ajax => is_admin() true: sans ça WP ajoute future/draft/pending et décale la pagination vs le front + 'posts_per_page' => 12, + 'paged' => $f['page'], + 'orderby' => 'date', + 'order' => 'DESC', + 'thalim_event_date_order' => true, + ]; + if ( $f['search'] ) { + $query_args['s'] = $f['search']; + $query_args['relevanssi'] = true; + $query_args['orderby'] = 'relevance'; + } + + // Build tax_query — may combine category page filter, taxonomy term, and cat filter + $tax_clauses = []; + if ( $f['category'] ) { + $tax_clauses[] = [ + 'taxonomy' => 'category', + 'field' => 'term_id', + 'terms' => [ $f['category'] ], + 'include_children' => $include_children, + ]; + } + if ( $f['taxonomy'] && $f['term'] ) { + $tax_clauses[] = [ + 'taxonomy' => $f['taxonomy'], + 'field' => 'term_id', + 'terms' => [ $f['term'] ], + ]; + // Exclure les séances de séminaire sur les pages de taxonomie + $tax_clauses[] = [ + 'taxonomy' => 'category', + 'field' => 'term_id', + 'terms' => [ thalim_cat_id( 'seance' ) ], + 'operator' => 'NOT IN', + ]; + } + if ( $f['filter_cat'] ) { + $tax_clauses[] = [ + 'taxonomy' => 'category', + 'field' => 'term_id', + 'terms' => [ $f['filter_cat'] ], + 'include_children' => ! $f['filter_autres'], + ]; + } + if ( $f['exclude_cats'] ) { + $ids = array_filter( array_map( 'intval', explode( ',', $f['exclude_cats'] ) ) ); + if ( ! empty( $ids ) ) { + $tax_clauses[] = [ + 'taxonomy' => 'category', + 'field' => 'term_id', + 'terms' => $ids, + 'operator' => 'NOT IN', + ]; + } + } + if ( ! empty( $tax_clauses ) ) { + $query_args['tax_query'] = count( $tax_clauses ) > 1 + ? array_merge( [ 'relation' => 'AND' ], $tax_clauses ) + : $tax_clauses; + } + + if ( $f['axe'] ) { + $query_args['meta_query'] = [[ + 'key' => 'axes_thematiques', + 'value' => $f['axe'], + 'type' => 'NUMERIC', + ]]; + } + + if ( $f['date_from'] || $f['date_to'] ) { + $query_args['thalim_event_date_filter'] = [ 'from' => $f['date_from'], 'to' => $f['date_to'] ]; + } + + return $query_args; +} + +// AJAX handler for infinite scroll on category pages +function thalim_load_more_posts() { + check_ajax_referer('load_more_posts', 'nonce'); + + $GLOBALS['thalim_lang_override'] = sanitize_key( $_POST['lang'] ?? 'fr' ); + + $f = thalim_ajax_read_filters(); + $query_args = thalim_ajax_build_query_args( $f, false ); + + // Exclude pinned posts on category pages to avoid duplicates (they already appear at the top, + // pulled out of the main flow by category.php). Must mirror category.php exactly. + if ( $f['category'] ) { + $pinned_ids = thalim_get_active_pinned_ids( $f['category'] ); + if ( ! empty( $pinned_ids ) ) { + $query_args['post__not_in'] = $pinned_ids; + } + } + + $posts = Timber::get_posts($query_args); + + if (empty($posts)) { + wp_send_json_success(['html' => '']); + return; + } + + $cards = thalim_get_cards_data($posts); + + $html = ''; + foreach ($posts as $post) { + $html .= Timber::compile('partials/post-card.twig', [ + 'post' => $post, + 'card' => $cards[$post->ID], + 'show_category' => true, + 'type_only' => $f['category'] > 0, // category pages: type chip only; everywhere else (taxonomy, search, annonces): type or category name + ]); + } + + wp_send_json_success(['html' => $html]); +} +add_action('wp_ajax_load_more_posts', 'thalim_load_more_posts'); +add_action('wp_ajax_nopriv_load_more_posts', 'thalim_load_more_posts'); + +/** + * Build structured data for one agenda slider card. + */ +function thalim_get_agenda_card_data( $post_id, $lang = 'fr' ) { + $months_fr = ['jan.','fév.','mars','avr.','mai','juin','juil.','août','sept.','oct.','nov.','déc.']; + $months_en = ['Jan.','Feb.','Mar.','Apr.','May','Jun.','Jul.','Aug.','Sep.','Oct.','Nov.','Dec.']; + $months = $lang === 'en' ? $months_en : $months_fr; + + $raw_debut = get_post_meta( $post_id, 'date_de_debut', true ); + $raw_datetime = get_post_meta( $post_id, 'datetime', true ); + if ( $raw_debut && ! str_starts_with( $raw_debut, '0000' ) ) { + $ts = strtotime( $raw_debut ); + } elseif ( $raw_datetime && ! str_starts_with( $raw_datetime, '0000' ) ) { + $ts = strtotime( $raw_datetime ); + } else { + $ts = get_post_timestamp( $post_id ); + } + + $raw_fin = get_post_meta( $post_id, 'date_de_fin', true ); + $ts_debut = ( $raw_debut && ! str_starts_with( $raw_debut, '0000' ) ) ? strtotime( $raw_debut ) : 0; + $ts_fin = ( $raw_fin && ! str_starts_with( $raw_fin, '0000' ) ) ? strtotime( $raw_fin ) : 0; + + // Build date_label — same rules as single.twig sidebar + $fmt_debut = $ts_debut ? thalim_format_date( $raw_debut, $lang ) : ''; + $fmt_fin = $ts_fin ? thalim_format_date( $raw_fin, $lang ) : ''; + $fmt_dt = ( $raw_datetime && ! str_starts_with( $raw_datetime, '0000' ) ) + ? thalim_format_date( $raw_datetime, $lang ) : ''; + $h_debut = substr( get_post_meta( $post_id, 'heure_de_debut', true ) ?: '', 0, 5 ); + $h_fin = substr( get_post_meta( $post_id, 'heure_de_fin', true ) ?: '', 0, 5 ); + + if ( $fmt_debut || $fmt_fin ) { + if ( $ts_debut && $ts_fin && date( 'Y-m-d', $ts_debut ) === date( 'Y-m-d', $ts_fin ) ) { + // Same day + if ( $h_debut && $h_fin ) { + $date_label = ( $lang === 'en' ? 'On ' : 'Le ' ) . $fmt_debut + . ' ' . ( $lang === 'en' ? 'from ' : 'de ' ) . $h_debut + . ' ' . ( $lang === 'en' ? 'to ' : 'à ' ) . $h_fin; + } elseif ( $h_debut ) { + $date_label = $fmt_debut . ( $lang === 'en' ? ' at ' : ' à ' ) . $h_debut; + } else { + $date_label = $fmt_debut; + } + } elseif ( $fmt_debut && $fmt_fin ) { + $date_label = ( $lang === 'en' ? 'From ' : 'Du ' ) . $fmt_debut + . ' ' . ( $lang === 'en' ? 'to ' : 'au ' ) . $fmt_fin; + } elseif ( $fmt_debut ) { + $date_label = $h_debut + ? $fmt_debut . ( $lang === 'en' ? ' at ' : ' à ' ) . $h_debut + : $fmt_debut; + } else { + $date_label = ( $lang === 'en' ? 'Until ' : "Jusqu'au " ) . $fmt_fin; + } + } elseif ( $fmt_dt ) { + $date_label = $h_debut + ? $fmt_dt . ( $lang === 'en' ? ' at ' : ' à ' ) . $h_debut + : $fmt_dt; + } else { + $date_label = ''; + } + + $type_fields = [ + 'type_colloque_journee_d_etude', 'type_soutenance', 'type_evenement_culturel', + 'type_media', 'type_captation', 'type_revue_collection', 'type_autre', + ]; + $type_label = ''; + foreach ( $type_fields as $f ) { + $v = get_post_meta( $post_id, $f, true ); + if ( $v ) { $type_label = thalim_bilingual( $v, $lang ); break; } + } + if ( ! $type_label ) { + foreach ( get_the_category( $post_id ) as $cat ) { + if ( $cat->parent ) { $type_label = thalim_cat_name( $cat, $lang ); break; } + } + } + + $end_day = $end_month = $end_year = null; + if ( $ts_fin && date( 'Ymd', $ts_fin ) !== date( 'Ymd', $ts ) ) { + $end_day = (int) date( 'j', $ts_fin ); + $end_month = $months[ (int) date( 'n', $ts_fin ) - 1 ]; + $end_year = (int) date( 'Y', $ts_fin ); + } + + // Séance de séminaire: link to parent séminaire at #seance-{ID} + $link = get_permalink( $post_id ); + if ( in_array( thalim_cat_id( 'seance' ), wp_list_pluck( get_the_category( $post_id ), 'term_id' ) ) ) { + $link = thalim_get_seance_link( $post_id ); + } + + return [ + 'day' => (int) date( 'j', $ts ), + 'month' => $months[ (int) date( 'n', $ts ) - 1 ], + 'year' => (int) date( 'Y', $ts ), + 'end_day' => $end_day, + 'end_month' => $end_month, + 'end_year' => $end_year, + 'type_label' => $type_label, + 'date_label' => $date_label, + 'lieu' => thalim_bilingual( get_post_meta( $post_id, 'lieu', true ) ?: '', $lang ), + 'link' => $link, + ]; +} + +function thalim_load_more_agenda() { + check_ajax_referer( 'load_more_posts', 'nonce' ); + + $lang = sanitize_key( $_POST['lang'] ?? 'fr' ); + $GLOBALS['thalim_lang_override'] = $lang; + + $f = thalim_ajax_read_filters(); + $query_args = thalim_ajax_build_query_args( $f, ! empty( $_POST['include_children'] ) ); + + // On first page, count future events to find today's anchor position + $today_offset = 0; + if ( (int) $f['page'] === 1 ) { + $offset_args = $query_args; + $offset_args['posts_per_page'] = 1; + $offset_args['no_found_rows'] = false; + $offset_args['paged'] = 1; + $today_str = current_time( 'Y-m-d' ); + $existing_filter = $offset_args['thalim_event_date_filter'] ?? []; + $offset_args['thalim_event_date_filter'] = array_merge( + $existing_filter, + [ 'from' => $today_str ] + ); + $future_query = new \WP_Query( $offset_args ); + $today_offset = (int) $future_query->found_posts; + } + + $posts = Timber::get_posts( $query_args ); + if ( empty( $posts ) ) { + $response = [ 'html' => '' ]; + if ( (int) $f['page'] === 1 ) $response['today_offset'] = $today_offset; + wp_send_json_success( $response ); + return; + } + + $html = ''; + foreach ( $posts as $post ) { + $data = thalim_get_agenda_card_data( $post->ID, $lang ); + $html .= Timber::compile( 'partials/agenda-card.twig', array_merge( $data, [ 'post' => $post ] ) ); + } + $response = [ 'html' => $html ]; + if ( (int) $f['page'] === 1 ) $response['today_offset'] = $today_offset; + wp_send_json_success( $response ); +} +add_action( 'wp_ajax_load_more_agenda', 'thalim_load_more_agenda' ); +add_action( 'wp_ajax_nopriv_load_more_agenda', 'thalim_load_more_agenda' ); diff --git a/inc/archive-filters.php b/inc/archive-filters.php new file mode 100644 index 0000000..61e4024 --- /dev/null +++ b/inc/archive-filters.php @@ -0,0 +1,124 @@ + isset( $_GET['axe'] ) ? intval( $_GET['axe'] ) : 0, + 'date_from' => isset( $_GET['date_from'] ) ? sanitize_text_field( $_GET['date_from'] ) : '', + 'date_to' => isset( $_GET['date_to'] ) ? sanitize_text_field( $_GET['date_to'] ) : '', + 'cat_id' => isset( $_GET['filter_cat'] ) ? intval( $_GET['filter_cat'] ) : 0, + 'filter_autres' => isset( $_GET['filter_autres'] ) ? 1 : 0, + ]; +} + +/** + * Rubrique active déduite de la catégorie filtrée (parent si sous-catégorie). + */ +function thalim_archive_active_rubrique( int $active_cat_id ): int { + if ( ! $active_cat_id ) return 0; + $cat = get_category( $active_cat_id ); + return ( $cat && ! is_wp_error( $cat ) && $cat->parent ) ? (int) $cat->parent : $active_cat_id; +} + +/** + * Y a-t-il des posts publiés directement dans cette rubrique (sans + * sous-catégorie) ? $extra_tax_clauses permet d'ajouter la contrainte du + * terme de taxonomie courant (pages taxonomy.php). + */ +function thalim_rubrique_has_direct_posts( int $rubrique_id, array $extra_tax_clauses = [] ): bool { + $clauses = array_merge( [ + [ + 'taxonomy' => 'category', + 'field' => 'term_id', + 'terms' => [ $rubrique_id ], + 'include_children' => false, + ], + ], $extra_tax_clauses ); + $tax_query = count( $clauses ) > 1 + ? array_merge( [ 'relation' => 'AND' ], $clauses ) + : $clauses; + $direct_check = new WP_Query( [ + 'post_type' => 'post', + 'posts_per_page' => 1, + 'fields' => 'ids', + 'no_found_rows' => true, + 'tax_query' => $tax_query, + ] ); + return $direct_check->have_posts(); +} + +/** + * Rubriques (catégories racines) pour la barre de filtres. + * + * @param array $all_cats Résultat de get_categories (hide_empty false, exclusions faites). + * @param callable $make_link fn(WP_Term $cat): string — URL du lien de filtre. + */ +function thalim_archive_filter_parents( array $all_cats, callable $make_link ): array { + $out = []; + foreach ( $all_cats as $cat ) { + if ( $cat->parent == 0 ) { + $out[] = [ + 'id' => $cat->term_id, + 'name' => thalim_cat_name( $cat ), + 'slug' => $cat->slug, + 'link' => $make_link( $cat ), + ]; + } + } + return $out; +} + +/** + * Sous-catégories de la rubrique active pour la barre de filtres. + */ +function thalim_archive_filter_children( array $all_cats, int $rubrique_id, callable $make_link ): array { + $out = []; + if ( ! $rubrique_id ) return $out; + foreach ( $all_cats as $cat ) { + if ( $cat->parent == $rubrique_id ) { + $out[] = [ + 'id' => $cat->term_id, + 'name' => thalim_cat_name( $cat ), + 'slug' => $cat->slug, + 'link' => $make_link( $cat ), + ]; + } + } + return $out; +} + +/** + * Entrée « Autres » de la barre de filtres (posts directement dans la rubrique). + */ +function thalim_archive_autres_entry( string $link ): array { + $lang = thalim_current_language(); + return [ + 'id' => 'autres', + 'name' => $lang === 'en' ? 'Other' : 'Autres', + 'slug' => 'autres', + 'link' => $link, + ]; +} diff --git a/inc/assets.php b/inc/assets.php new file mode 100644 index 0000000..7270407 --- /dev/null +++ b/inc/assets.php @@ -0,0 +1,284 @@ + admin_url( 'admin-ajax.php' ), + 'nonce' => wp_create_nonce( 'load_more_posts' ), + 'lang' => thalim_current_language(), + ]); + } + + if (is_front_page()) { + wp_enqueue_script( + 'coloredWordsHero', + get_template_directory_uri() . '/js/coloredWordsHero.js', + [], + filemtime(get_template_directory() . '/js/coloredWordsHero.js'), + true + ); + + thalim_enqueue_swiper(); + + wp_enqueue_script( + 'annoncesSwiper', + get_template_directory_uri() . '/js/annoncesSwiper.js', + ['swiper'], + filemtime(get_template_directory() . '/js/annoncesSwiper.js'), + true + ); + + wp_enqueue_script( + 'messageLabo', + get_template_directory_uri() . '/js/messageLabo.js', + [], + filemtime(get_template_directory() . '/js/messageLabo.js'), + true + ); + + wp_enqueue_script( + 'keywordCloud', + get_template_directory_uri() . '/js/keywordCloud.js', + [], + filemtime(get_template_directory() . '/js/keywordCloud.js'), + true + ); + + wp_enqueue_script( + 'quickLinks', + get_template_directory_uri() . '/js/quickLinks.js', + [], + filemtime(get_template_directory() . '/js/quickLinks.js'), + true + ); + + $kw_tags = get_terms([ + 'taxonomy' => 'post_tag', + 'hide_empty' => true, + 'orderby' => 'name', + 'order' => 'ASC', + ]); + if (!is_wp_error($kw_tags) && !empty($kw_tags)) { + $kw_lang = thalim_current_language(); + $kw_tags = array_filter($kw_tags, function ($tag) { + return !get_term_meta($tag->term_id, 'ne_pas_afficher_dans_le_nuage', true); + }); + wp_localize_script('keywordCloud', 'thalimTags', array_values(array_map(function ($tag) use ($kw_lang) { + return ['name' => html_entity_decode(thalim_bilingual($tag->name, $kw_lang), ENT_QUOTES | ENT_HTML5, 'UTF-8'), 'url' => get_term_link($tag)]; + }, $kw_tags))); + } + } + + + wp_enqueue_script( + 'navAxesToggle', + get_template_directory_uri() . '/js/navAxesToggle.js', + [], + filemtime(get_template_directory() . '/js/navAxesToggle.js'), + true + ); + + wp_enqueue_script( + 'stickyHeader', + get_template_directory_uri() . '/js/stickyHeader.js', + [], + filemtime(get_template_directory() . '/js/stickyHeader.js'), + true + ); + + wp_enqueue_script( + 'frenchTypography', + get_template_directory_uri() . '/js/frenchTypography.js', + [], + filemtime(get_template_directory() . '/js/frenchTypography.js'), + true + ); + + if (is_page('membres')) { + wp_enqueue_script( + 'membresFilters', + get_template_directory_uri() . '/js/membresFilters.js', + [], + filemtime(get_template_directory() . '/js/membresFilters.js'), + true + ); + wp_enqueue_script( + 'membresPopover', + get_template_directory_uri() . '/js/membresPopover.js', + [], + filemtime(get_template_directory() . '/js/membresPopover.js'), + true + ); + } + + if (is_single() || is_author() || is_page('membres') || is_page('le-laboratoire') || is_page('programmes-de-recherche')) { + wp_enqueue_script( + 'seanceToggle', + get_template_directory_uri() . '/js/seanceToggle.js', + [], + filemtime(get_template_directory() . '/js/seanceToggle.js'), + true + ); + } + + if (is_single()) { + thalim_enqueue_swiper(); + + wp_enqueue_script( + 'imageSwiper', + get_template_directory_uri() . '/js/imageSwiper.js', + ['swiper'], + filemtime(get_template_directory() . '/js/imageSwiper.js'), + true + ); + } + + wp_enqueue_script( + 'fitPostCardTitle', + get_template_directory_uri() . '/js/fitPostCardTitle.js', + ['frenchTypography'], + filemtime(get_template_directory() . '/js/fitPostCardTitle.js'), + true + ); + + $is_archive_page = is_category() || is_tax() || is_tag() || is_page(['annonces', 'announcements']) || is_search(); + + if ($is_archive_page) { + wp_enqueue_script( + 'infiniteScroll', + get_template_directory_uri() . '/js/infiniteScroll.js', + [], + filemtime(get_template_directory() . '/js/infiniteScroll.js'), + true + ); + wp_localize_script('infiniteScroll', 'infiniteScrollData', [ + 'ajaxUrl' => admin_url('admin-ajax.php'), + 'nonce' => wp_create_nonce('load_more_posts'), + 'lang' => thalim_current_language(), + ]); + + wp_enqueue_script( + 'categoryFilters', + get_template_directory_uri() . '/js/categoryFilters.js', + [], + filemtime(get_template_directory() . '/js/categoryFilters.js'), + true + ); + } +} +add_action('wp_enqueue_scripts', 'theme_enqueue_assets'); + +/** + * Scripts admin découpés par contexte de page (js/admin/*), enqueue + * conditionnel par écran. admin-base.js fournit le namespace partagé + * window.ThalimAdmin dont dépendent les autres. + */ +function enqueue_admin_js() { + wp_enqueue_style( + 'adminDashboardStyles', + get_template_directory_uri() . '/css/admin.css', + [], + filemtime(get_template_directory() . '/css/admin.css') + ); + + $base_uri = get_template_directory_uri() . '/js/admin'; + $base_dir = get_template_directory() . '/js/admin'; + $enqueue = function ( $handle, $file, $deps ) use ( $base_uri, $base_dir ) { + wp_enqueue_script( $handle, "$base_uri/$file", $deps, filemtime( "$base_dir/$file" ), true ); + }; + + // Toutes pages admin : socle partagé + rename « Article » → « Annonce » + $enqueue( 'thalim-admin-base', 'admin-base.js', [ 'jquery' ] ); + $enqueue( 'thalim-admin-rename', 'admin-rename.js', [ 'thalim-admin-base' ] ); + + $screen = get_current_screen(); + if ( ! $screen ) { + return; + } + + // post.php / post-new.php (tous post types) + if ( 'post' === $screen->base ) { + $enqueue( 'thalim-admin-post-edit', 'admin-post-edit.js', [ 'jquery', 'thalim-admin-base' ] ); + + $axes_groups = thalim_get_axes_filter_groups(); + if ( current_user_can( 'contributor' ) && ! current_user_can( 'edit_others_posts' ) ) { + $axes_groups = array_slice( $axes_groups, 0, 1 ); + } + wp_localize_script( 'thalim-admin-post-edit', 'thalimAxesGroups', $axes_groups ); + + // Modale Pods de création de séance (iframe avec ?pods_modal) + if ( isset( $_GET['pods_modal'] ) ) { + $enqueue( 'thalim-admin-pods-modal', 'admin-pods-modal.js', [ 'jquery', 'thalim-admin-base' ] ); + } + } + + // profile.php / user-edit.php / user-new.php + if ( in_array( $screen->base, [ 'profile', 'user-edit', 'user' ], true ) ) { + $enqueue( 'thalim-admin-profile', 'admin-profile.js', [ 'jquery', 'thalim-admin-base' ] ); + } + + // edit-tags.php / term.php + if ( in_array( $screen->base, [ 'edit-tags', 'term' ], true ) ) { + $enqueue( 'thalim-admin-taxonomy-list', 'admin-taxonomy-list.js', [ 'jquery', 'thalim-admin-base' ] ); + } +} +add_action( 'admin_enqueue_scripts', 'enqueue_admin_js' ); diff --git a/inc/author-helpers.php b/inc/author-helpers.php index 53ddbbb..4f87eda 100644 --- a/inc/author-helpers.php +++ b/inc/author-helpers.php @@ -116,20 +116,22 @@ function thalim_get_author_data($user_id) { ? thalim_bilingual(get_user_meta($user_id, 'affiliation_autre', true) ?: '', $lang) : $v; })(), - 'bio' => wpautop( make_clickable( get_user_meta($user_id, 'biographie', true) ?: '' ) ), - 'bio_en' => wpautop( make_clickable( get_user_meta($user_id, 'biographie_en', true) ?: '' ) ), + // wp_kses_post: ces champs sont éditables par les contributeurs (profil) + // et rendus en |raw dans author.twig → XSS stocké sans filtrage. + 'bio' => wpautop( make_clickable( wp_kses_post( get_user_meta($user_id, 'biographie', true) ?: '' ) ) ), + 'bio_en' => wpautop( make_clickable( wp_kses_post( get_user_meta($user_id, 'biographie_en', true) ?: '' ) ) ), 'domaines_tags' => $domaines_tags, - 'domaines' => wpautop( make_clickable( get_user_meta($user_id, 'autres_domaines_de_recherches', true) ?: '' ) ), - 'domaines_en' => wpautop( make_clickable( get_user_meta($user_id, 'autres_domaines_de_recherches_en', true) ?: '' ) ), - 'recherches' => wpautop( get_user_meta($user_id, 'recherches_en_cours', true) ?: '' ), - 'recherches_en' => wpautop( get_user_meta($user_id, 'recherches_en_cours_en', true) ?: '' ), + 'domaines' => wpautop( make_clickable( wp_kses_post( get_user_meta($user_id, 'autres_domaines_de_recherches', true) ?: '' ) ) ), + 'domaines_en' => wpautop( make_clickable( wp_kses_post( get_user_meta($user_id, 'autres_domaines_de_recherches_en', true) ?: '' ) ) ), + 'recherches' => wpautop( wp_kses_post( get_user_meta($user_id, 'recherches_en_cours', true) ?: '' ) ), + 'recherches_en' => wpautop( wp_kses_post( get_user_meta($user_id, 'recherches_en_cours_en', true) ?: '' ) ), 'axes' => $axes, 'titre_these' => thalim_bilingual(get_user_meta($user_id, 'titre_de_these', true) ?: '', $lang), 'date_soutenance' => get_user_meta($user_id, 'date_de_soutenance', true) ?: '', 'directeur_thalim'=> $directeur_thalim, 'autre_directeur' => get_user_meta($user_id, 'autre_directeur_de_these', true) ?: '', - 'resume_these' => wpautop( get_user_meta($user_id, 'resume_de_la_these', true) ?: '' ), - 'resume_these_en' => wpautop( get_user_meta($user_id, 'resume_de_la_these_en', true) ?: '' ), + 'resume_these' => wpautop( wp_kses_post( get_user_meta($user_id, 'resume_de_la_these', true) ?: '' ) ), + 'resume_these_en' => wpautop( wp_kses_post( get_user_meta($user_id, 'resume_de_la_these_en', true) ?: '' ) ), 'email' => $show_email ? $user->user_email : '', 'liens_externes' => $liens_externes, 'documents' => $documents, @@ -148,7 +150,8 @@ function thalim_get_author_data($user_id) { * Returns an array sorted by post count (descending). */ function thalim_get_author_posts_by_category($user_id) { - $excluded_cats = [12, 31]; // séances de séminaire, etc. + $seance_cat = thalim_cat_id('seance'); + $excluded_cats = array_filter([ $seance_cat, thalim_cat_id('non-classe') ]); $lang = thalim_current_language(); $posts = Timber::get_posts([ @@ -166,7 +169,6 @@ function thalim_get_author_posts_by_category($user_id) { ], ], 'thalim_event_date_order' => true, - 'lang' => '', ]); $groups = []; @@ -205,29 +207,28 @@ function thalim_get_author_posts_by_category($user_id) { $groups[$cat_id]['posts'][] = $post; } - // Séances de séminaire — dedicated group. Posts in cat 12 where the member - // is listed in `membres`/`autre_membres`. Cards use the parent séminaire - // permalink with a #seance-{ID} hash (see thalim_get_card_data). + // Séances de séminaire — dedicated group. Posts in the séance category + // where the member is listed in `membres`/`autre_membres`. Cards use the + // parent séminaire permalink with a #seance-{ID} hash (see thalim_get_card_data). $seances = Timber::get_posts([ 'post_type' => 'post', 'posts_per_page' => -1, - 'category__in' => [12], + 'category__in' => [ $seance_cat ], 'meta_query' => [ 'relation' => 'OR', [ 'key' => 'membres', 'value' => $user_id ], [ 'key' => 'autre_membres', 'value' => $user_id ], ], 'thalim_event_date_order' => true, - 'lang' => '', ]); if (count($seances) > 0) { - $seance_cat = get_term(12, 'category'); - $groups[12] = [ - 'cat_id' => 12, - 'cat_name' => $seance_cat && !is_wp_error($seance_cat) - ? thalim_cat_name($seance_cat, $lang) + $seance_term = get_term($seance_cat, 'category'); + $groups[$seance_cat] = [ + 'cat_id' => $seance_cat, + 'cat_name' => $seance_term && !is_wp_error($seance_term) + ? thalim_cat_name($seance_term, $lang) : ($lang === 'en' ? 'Seminar sessions' : 'Séances de séminaire'), - 'cat_url' => get_category_link(12), + 'cat_url' => get_category_link($seance_cat), 'posts' => $seances, ]; } diff --git a/inc/avatars.php b/inc/avatars.php new file mode 100644 index 0000000..268efd9 --- /dev/null +++ b/inc/avatars.php @@ -0,0 +1,93 @@ +user_email ) ) ); + $response = wp_remote_head( + 'https://www.gravatar.com/avatar/' . $hash . '?d=404', + [ 'timeout' => 3 ] + ); + + // Erreur réseau : ne pas mettre en cache un faux négatif, retenter plus tard + if ( is_wp_error( $response ) ) return; + + $url = wp_remote_retrieve_response_code( $response ) === 200 + ? 'https://www.gravatar.com/avatar/' . $hash . '?s=300' + : ''; + set_transient( 'thalim_gravatar_' . $user_id, $url, WEEK_IN_SECONDS ); +} +add_action( 'thalim_warm_gravatar_user', 'thalim_refresh_gravatar_cache' ); + +// Cron quotidien : réchauffe le cache Gravatar des utilisateurs sans avatar +// local, avant expiration des transients (1 semaine) — le premier rendu de +// /membres ne paie plus jamais N requêtes HEAD de 3 s. +add_action( 'init', function () { + if ( ! wp_next_scheduled( 'thalim_warm_gravatar_cache' ) ) { + wp_schedule_event( time() + HOUR_IN_SECONDS, 'daily', 'thalim_warm_gravatar_cache' ); + } +} ); + +add_action( 'thalim_warm_gravatar_cache', function () { + $users = get_users( [ 'fields' => 'ID' ] ); + foreach ( $users as $user_id ) { + $user_id = (int) $user_id; + // Avatar local → pas besoin de Gravatar + $meta = get_user_meta( $user_id, 'simple_local_avatar', true ); + if ( is_array( $meta ) && ! empty( $meta['full'] ) ) continue; + // Transient encore frais (posé il y a < 1 semaine) : on le rafraîchit + // quand même s'il expire dans moins de 2 jours, sinon on saute. + $timeout = (int) get_option( '_transient_timeout_thalim_gravatar_' . $user_id ); + if ( $timeout && $timeout - time() > 2 * DAY_IN_SECONDS ) continue; + thalim_refresh_gravatar_cache( $user_id ); + } +} ); diff --git a/inc/config.php b/inc/config.php new file mode 100644 index 0000000..4c88a1c --- /dev/null +++ b/inc/config.php @@ -0,0 +1,90 @@ +term_id : 0; + } + return $cache[ $key ]; +} + +/** + * Catégories « structurelles » du site, résolues par slug. + * Clés logiques → slug en base. Utiliser thalim_cat_id('seance') etc. + */ +function thalim_cat_id( string $key ): int { + static $slugs = [ + // racines / rubriques + 'laboratoire' => 'le-laboratoire', + 'manifestations' => 'manifestations-scientifiques', + 'publications' => 'publications-et-productions', + 'mediation' => 'mediation-scientifique', + 'ressources' => 'ressources', + // catégories techniques + 'seance' => 'seance-de-seminaire', + 'non-classe' => 'non-classe', + 'vie-du-labo' => 'vie-du-labo-intranet', + 'newsletter' => 'newsletter', + 'message-labo' => 'message-du-laboratoire', + // sous-catégories utilisées dans la logique métier + 'seminaires' => 'seminaires', + 'colloques' => 'colloques-et-journees-detudes', + 'communications' => 'communications', + 'soutenances' => 'soutenances', + 'ouvrages' => 'ouvrages', + 'articles' => 'articles', + 'revues' => 'revues-et-collections', + 'multimedia' => 'multimedia', + 'evenements-culturels' => 'evenements-culturels', + 'medias' => 'medias', + 'gazette' => 'gazette', + 'podcast' => 'podcast-de-thalim', + 'captations' => 'captations', + 'appels' => 'appels-a-contribution', + ]; + if ( ! isset( $slugs[ $key ] ) ) return 0; + return thalim_term_id_by_slug( $slugs[ $key ], 'category' ); +} + +/** + * Rôles (taxonomy `role`) techniques, exclus de la recherche de membres. + */ +function thalim_excluded_role_ids(): array { + return array_values( array_filter( [ + thalim_term_id_by_slug( 'a-ranger', 'role' ), + thalim_term_id_by_slug( 'archive', 'role' ), + ] ) ); +} + +/** + * Clé couleur stable d'une catégorie racine, indexée sur le term_id (immuable) + * plutôt que sur le slug (que l'admin peut régénérer en renommant la catégorie). + * Renvoie la clé canonique attendue par les classes CSS .gradient--{clé} / + * .category--{clé} (_postcard.scss, _single.scss, _category.scss). + * Fallback sur le slug live pour toute racine hors des 5 rubriques connues. + */ +function thalim_category_color_slug( $root_term_id, $fallback_slug = '' ) { + $map = [ + 1 => 'le-laboratoire', + 3 => 'manifestations-scientifiques', + 4 => 'publications-et-productions', + 5 => 'mediation-scientifique', + 6 => 'ressources', + ]; + return $map[ (int) $root_term_id ] ?? $fallback_slug; +} diff --git a/inc/context.php b/inc/context.php new file mode 100644 index 0000000..e86863c --- /dev/null +++ b/inc/context.php @@ -0,0 +1,71 @@ + 'contenu_general', + 'posts_per_page' => 1, + 'orderby' => 'ID', + 'order' => 'ASC', + ]); + $gc_post = $gc_posts[0] ?? null; + if ( $gc_post ) { + $context['gc'] = [ + 'umr' => thalim_bilingual( $gc_post->umr ?: '', $current_lang ), + 'thalim' => thalim_bilingual( $gc_post->thalim ?: '', $current_lang ), + 'siecles' => thalim_bilingual( $gc_post->siecles ?: '', $current_lang ), + 'presentation' => ( $current_lang === 'en' && $gc_post->presentation_en ) ? $gc_post->presentation_en : $gc_post->presentation, + 'presentation_detail' => ( $current_lang === 'en' && $gc_post->presentation_detail_en ) ? $gc_post->presentation_detail_en : $gc_post->presentation_detail, + ]; + } else { + $context['gc'] = []; + } + + $context['current_language'] = $current_lang; + + // Axes thématiques courants (annee_fin >= current year) for navigation dropdown + $current_year = (int) date('Y'); + $all_axes = get_terms(['taxonomy' => 'axe_thematique', 'hide_empty' => false, 'orderby' => 'name']); + $axes_courants = []; + if (!is_wp_error($all_axes)) { + foreach ($all_axes as $axe) { + $fin = (int) get_term_meta($axe->term_id, 'annee_fin', true); + if ($fin >= $current_year) { + $link = get_term_link($axe); + if (!is_wp_error($link)) { + $axes_courants[] = [ + 'name' => thalim_bilingual($axe->name, $current_lang), + 'link' => $link, + 'ordre' => (int) get_term_meta($axe->term_id, 'ordre_daffichage', true), + ]; + } + } + } + usort($axes_courants, fn($a, $b) => $a['ordre'] <=> $b['ordre']); + } + $context['axes_courants'] = $axes_courants; + + // Annonces page URL (language-aware) + $annonces_page = get_page_by_path('annonces'); + $annonces_base = $annonces_page ? get_permalink($annonces_page->ID) : home_url('/annonces/'); + $context['annonces_url'] = $annonces_base; + + // Language switcher + $context['languages'] = thalim_language_switcher(); + + return $context; +} +add_filter('timber/context', 'add_to_context'); diff --git a/inc/event-dates.php b/inc/event-dates.php new file mode 100644 index 0000000..2f205ce --- /dev/null +++ b/inc/event-dates.php @@ -0,0 +1,148 @@ + true + * 'thalim_event_date_filter' => ['from' => 'Y-m-d', 'to' => 'Y-m-d'] + */ + +// Event date ordering: COALESCE(date_de_debut, datetime, post_date) +// Activated by adding 'thalim_event_date_order' => true to WP_Query args. +add_filter('posts_join', function ($join, $query) { + if (!$query->get('thalim_event_date_order') && !$query->get('thalim_event_date_filter')) return $join; + global $wpdb; + $join .= " LEFT JOIN {$wpdb->postmeta} AS thalim_ed" + . " ON (thalim_ed.post_id = {$wpdb->posts}.ID" + . " AND thalim_ed.meta_key = 'date_de_debut') "; + $join .= " LEFT JOIN {$wpdb->postmeta} AS thalim_dt" + . " ON (thalim_dt.post_id = {$wpdb->posts}.ID" + . " AND thalim_dt.meta_key = 'datetime') "; + return $join; +}, 10, 2); + +add_filter('posts_orderby', function ($orderby, $query) { + if (!$query->get('thalim_event_date_order')) return $orderby; + global $wpdb; + $valid = "IS NOT NULL AND %s != '' AND %s NOT LIKE '0000-00-00%%'"; + return "CASE" + . " WHEN thalim_ed.meta_value " . sprintf($valid, 'thalim_ed.meta_value', 'thalim_ed.meta_value') . " THEN thalim_ed.meta_value" + . " WHEN thalim_dt.meta_value " . sprintf($valid, 'thalim_dt.meta_value', 'thalim_dt.meta_value') . " THEN thalim_dt.meta_value" + . " ELSE {$wpdb->posts}.post_date" + . " END DESC, {$wpdb->posts}.ID DESC"; // tiebreaker déterministe: sans lui, les dates ex-æquo paginent de façon instable entre les requêtes séparées (initial vs AJAX) +}, 10, 2); + +// Event date range filter: uses same CASE logic as ordering so date_de_debut/datetime take priority over post_date. +// Activated by adding 'thalim_event_date_filter' => ['from' => $date_from, 'to' => $date_to] to WP_Query args. +add_filter('posts_where', function ($where, $query) { + $filter = $query->get('thalim_event_date_filter'); + if (empty($filter) || (!isset($filter['from']) && !isset($filter['to']))) return $where; + global $wpdb; + + $effective = "CASE" + . " WHEN thalim_ed.meta_value IS NOT NULL AND thalim_ed.meta_value != '' AND thalim_ed.meta_value NOT LIKE '0000-00-00%' THEN thalim_ed.meta_value" + . " WHEN thalim_dt.meta_value IS NOT NULL AND thalim_dt.meta_value != '' AND thalim_dt.meta_value NOT LIKE '0000-00-00%' THEN thalim_dt.meta_value" + . " ELSE {$wpdb->posts}.post_date" + . " END"; + + if (!empty($filter['from'])) { + $from = $wpdb->prepare('%s', $filter['from']); + $where .= " AND ({$effective}) >= {$from}"; + } + if (!empty($filter['to'])) { + $to = $wpdb->prepare('%s', $filter['to'] . ' 23:59:59'); + $where .= " AND ({$effective}) <= {$to}"; + } + + return $where; +}, 10, 2); + +// Return the IDs of posts currently pinned ("épinglé dans la catégorie") in a given category. +// A pin is active if epingler_dans_la_categorie == 1 AND date_de_fin_depinglage is empty/0000-00-00/future. +// Shared by category.php (pull them out of the main flow) and the AJAX handler (exclude them from +// pagination) so both sides stay in sync — a mismatch shifts the page boundary and dupes posts. +function thalim_get_active_pinned_ids( $category_id ) { + if ( ! $category_id ) return []; + $today = date( 'Y-m-d' ); + $pinned_query = new WP_Query([ + 'post_type' => 'post', + 'post_status' => 'publish', + 'posts_per_page' => -1, + 'fields' => 'ids', + 'no_found_rows' => true, + 'tax_query' => [[ + 'taxonomy' => 'category', + 'field' => 'term_id', + 'terms' => [ $category_id ], + 'include_children' => false, + ]], + 'meta_query' => [[ + 'key' => 'epingler_dans_la_categorie', + 'value' => '1', + ]], + ]); + $pinned_ids = []; + foreach ( $pinned_query->posts as $pid ) { + $fin = get_post_meta( $pid, 'date_de_fin_depinglage', true ); + if ( empty( $fin ) || $fin === '0000-00-00' || $fin >= $today ) { + $pinned_ids[] = $pid; + } + } + return $pinned_ids; +} + +// ── Axes thématiques groupés pour les filtres ────────────────── +// Retourne un tableau de groupes triés par période (plus récent en premier, +// "passés" toujours en dernier). Chaque terme contient id, name, ordre. +function thalim_get_axes_filter_groups() { + $terms = get_terms( [ 'taxonomy' => 'axe_thematique', 'hide_empty' => false ] ); + $axes_map = []; + + foreach ( $terms as $term ) { + $debut = trim( get_term_meta( $term->term_id, 'annee_debut', true ) ); + $fin = trim( get_term_meta( $term->term_id, 'annee_fin', true ) ); + + if ( $debut && $fin ) { + $key = $debut . '-' . $fin; + $label = $debut . ' – ' . $fin; + } else { + $key = 'passes'; + $label = 'Axes antérieurs'; + } + + if ( ! isset( $axes_map[ $key ] ) ) { + $axes_map[ $key ] = [ 'label' => $label, 'debut' => intval( $debut ), 'terms' => [] ]; + } + + $ordre = trim( get_term_meta( $term->term_id, 'ordre_daffichage', true ) ); + $axes_map[ $key ]['terms'][] = [ + 'id' => $term->term_id, + 'name' => $term->name, + 'ordre' => $ordre !== '' ? intval( $ordre ) : null, + 'href' => get_term_link( $term ), + ]; + } + + // Tri des groupes : plus récent en premier, passés toujours en dernier + uasort( $axes_map, function ( $a, $b ) { + if ( $a['label'] === 'Axes antérieurs' ) return 1; + if ( $b['label'] === 'Axes antérieurs' ) return -1; + return $b['debut'] - $a['debut']; + } ); + + // Tri des termes dans chaque groupe : ordre_daffichage d'abord, puis alphabétique + foreach ( $axes_map as &$group ) { + usort( $group['terms'], function ( $a, $b ) { + $a_has = $a['ordre'] !== null; + $b_has = $b['ordre'] !== null; + if ( $a_has && $b_has ) return $a['ordre'] - $b['ordre']; + if ( $a_has ) return -1; + if ( $b_has ) return 1; + return strcmp( $a['name'], $b['name'] ); + } ); + } + unset( $group ); + + return array_values( $axes_map ); +} diff --git a/inc/i18n.php b/inc/i18n.php new file mode 100644 index 0000000..a48b2c9 --- /dev/null +++ b/inc/i18n.php @@ -0,0 +1,120 @@ +term_id ?? ( $cat->id ?? 0 ); + $fallback = $cat->name; + } elseif ( is_numeric( $cat ) ) { + $term_id = (int) $cat; + $term = get_term( $term_id, 'category' ); + $fallback = $term && ! is_wp_error( $term ) ? $term->name : (string) $cat; + } else { + return (string) $cat; + } + if ( $lang !== 'en' ) return $fallback; + $en = get_term_meta( $term_id, 'titre_anglais', true ); + return ( $en !== '' && $en !== false ) ? $en : $fallback; +} + +// Register bilingual and en_url as Twig filters +add_filter( 'timber/twig', function ( $twig ) { + $twig->addFilter( new \Twig\TwigFilter( 'bilingual', 'thalim_bilingual' ) ); + $twig->addFilter( new \Twig\TwigFilter( 'en_url', 'thalim_en_url' ) ); + $twig->addFilter( new \Twig\TwigFilter( 'cat_name', 'thalim_cat_name' ) ); + return $twig; +} ); + +// Language switcher data (replaces pll_the_languages) +// Output matches the structure header.twig expects: slug, url, current_lang +function thalim_language_switcher(): array { + $uri = THALIM_ORIGINAL_URI; + $path = parse_url( $uri, PHP_URL_PATH ) ?? '/'; + $query = ( $q = parse_url( $uri, PHP_URL_QUERY ) ) ? '?' . $q : ''; + $is_en = thalim_current_language() === 'en'; + + $fr_path = $is_en ? ( substr( $path, 3 ) ?: '/' ) : $path; + $en_path = $is_en ? $path : '/en' . $path; + + return [ + 'fr' => [ 'slug' => 'fr', 'url' => home_url( $fr_path ) . $query, 'current_lang' => ! $is_en ], + 'en' => [ 'slug' => 'en', 'url' => home_url( $en_path ) . $query, 'current_lang' => $is_en ], + ]; +} + +// Apply bilingual split to the browser tab title + translate category names +add_filter('document_title_parts', function ($title_parts) { + if (!empty($title_parts['title'])) { + $title_parts['title'] = thalim_bilingual($title_parts['title']); + // On category archives, replace the title with the translated category name + if ( is_category() ) { + $cat = get_queried_object(); + if ( $cat ) { + $title_parts['title'] = thalim_cat_name( $cat ); + } + } + } + return $title_parts; +}); diff --git a/inc/membres-helpers.php b/inc/membres-helpers.php index f420e90..011e164 100644 --- a/inc/membres-helpers.php +++ b/inc/membres-helpers.php @@ -135,6 +135,12 @@ function thalim_get_membres_groups() { // Pre-build member data for all relevant users (cache by ID) $member_cache = []; $all_users = array_merge( $users, $direction_users ); + + // Précharge les usermeta de tout le monde en une requête : chaque + // thalim_build_membre_data() fait ensuite ses get_user_meta sur le cache + // (rôles, statuts, avatar local, domaines…) au lieu d'une requête par champ. + update_meta_cache( 'user', wp_list_pluck( $all_users, 'ID' ) ); + foreach ( $all_users as $user ) { if ( ! isset( $member_cache[ $user->ID ] ) ) { $member_cache[ $user->ID ] = thalim_build_membre_data( $user ); diff --git a/inc/post-card-helpers.php b/inc/post-card-helpers.php index b858ed7..0c62d46 100644 --- a/inc/post-card-helpers.php +++ b/inc/post-card-helpers.php @@ -11,8 +11,6 @@ function thalim_get_card_data($post_id) { $data = [ 'card_image' => null, 'card_membres' => [], - 'card_axes' => [], - 'card_etiquettes' => [], 'parent_slug' => '', 'card_category_name' => '', 'card_category_url' => '', @@ -23,12 +21,13 @@ function thalim_get_card_data($post_id) { ]; // Category-based date formatting: - // - Séminaire (cat 11, not cat 12): "Du X au Y" from first/last linked séance dates - // - Ouvrage (cat 15): year only — includes the post.date fallback (overrides Twig default d/m/Y) + // - Séminaire (hors séances): "Du X au Y" from first/last linked séance dates + // - Ouvrage: year only — includes the post.date fallback (overrides Twig default d/m/Y) // - Default: date_de_debut > datetime > (empty → Twig falls back to post.date('d/m/Y')) + $seance_cat = thalim_cat_id('seance'); $cat_ids = wp_get_post_categories($post_id); - $is_seminaire = in_array(11, $cat_ids, true) && !in_array(12, $cat_ids, true); - $is_ouvrage = in_array(15, $cat_ids, true); + $is_seminaire = in_array(thalim_cat_id('seminaires'), $cat_ids, true) && !in_array($seance_cat, $cat_ids, true); + $is_ouvrage = in_array(thalim_cat_id('ouvrages'), $cat_ids, true); if ($is_seminaire) { // Aggregate timestamps from linked séances (Pods `seances` meta = array of post IDs) @@ -86,10 +85,10 @@ function thalim_get_card_data($post_id) { // Resolve top-level parent category slug for color theming and direct category name for display $categories = wp_get_post_categories($post_id, ['fields' => 'all']); - $excluded_ids = [12, 31]; + $excluded_ids = array_filter([ $seance_cat, thalim_cat_id('non-classe') ]); $is_seance = false; foreach ($categories as $cat) { - if ($cat->term_id === 12) { $is_seance = true; } + if ($cat->term_id === $seance_cat) { $is_seance = true; } } foreach ($categories as $cat) { if (in_array($cat->term_id, $excluded_ids)) continue; @@ -107,28 +106,21 @@ function thalim_get_card_data($post_id) { // Séances de séminaire: link to parent séminaire with hash, derive color from parent's categories if ($is_seance) { - // Always show the category label for séances even though cat 12 is excluded from color resolution + // Always show the category label for séances even though the séance + // category is excluded from color resolution if (!$data['card_category_name']) { - $seance_cat = get_category(12); - if ($seance_cat) { - $data['card_category_name'] = thalim_cat_name($seance_cat); - $data['card_category_url'] = get_category_link(12); + $seance_term = get_category($seance_cat); + if ($seance_term) { + $data['card_category_name'] = thalim_cat_name($seance_term); + $data['card_category_url'] = get_category_link($seance_cat); } } - global $wpdb; - $parent_id = $wpdb->get_var($wpdb->prepare( - "SELECT pm.post_id FROM {$wpdb->postmeta} pm - JOIN {$wpdb->posts} p ON p.ID = pm.post_id - WHERE pm.meta_key = 'seances' AND pm.meta_value = %s - AND p.post_status = 'publish' - LIMIT 1", - (string) $post_id - )); + $parent_id = thalim_get_seance_parent_id($post_id); if ($parent_id) { - $data['card_link'] = get_permalink((int) $parent_id) . '#seance-' . $post_id; + $data['card_link'] = get_permalink($parent_id) . '#seance-' . $post_id; // Derive color from parent séminaire's categories if not already set if (!$data['parent_slug']) { - foreach (wp_get_post_categories((int) $parent_id, ['fields' => 'all']) as $cat) { + foreach (wp_get_post_categories($parent_id, ['fields' => 'all']) as $cat) { if (in_array($cat->term_id, $excluded_ids)) continue; $ancestor_ids = get_ancestors($cat->term_id, 'category'); $root = !empty($ancestor_ids) ? get_category(end($ancestor_ids)) : $cat; @@ -186,32 +178,44 @@ function thalim_get_card_data($post_id) { } } - // Axes thématiques (post IDs → titles) - $axe_ids = get_post_meta($post_id, 'axes_thematiques', false); - foreach ($axe_ids as $axe_id) { - $axe = get_post($axe_id); - if ($axe) { - $data['card_axes'][] = $axe->post_title; - } - } - - // Etiquettes (post IDs → titles) - $tag_ids = get_post_meta($post_id, 'etiquettes', false); - foreach ($tag_ids as $tag_id) { - $tag_post = get_post($tag_id); - if ($tag_post) { - $data['card_etiquettes'][] = $tag_post->post_title; - } - } - return $data; } /** * Build card data map for a collection of posts. * Returns an array keyed by post ID. + * + * Précharge en lot les caches meta/termes des posts et les utilisateurs + * référencés (membres/autre_membres) pour éviter les requêtes N+1 de + * thalim_get_card_data() (une grille de 12 cartes passait par des dizaines + * de get_post_meta/get_userdata individuels). */ function thalim_get_cards_data($posts) { + $ids = []; + foreach ($posts as $post) { + $ids[] = $post->ID; + } + + if ($ids) { + // Meta + termes en 2 requêtes pour tout le lot + update_meta_cache('post', $ids); + update_object_term_cache($ids, 'post'); + + // Utilisateurs référencés par les cartes (lecture servie par le cache meta) + $user_ids = []; + foreach ($ids as $pid) { + foreach (['membres', 'autre_membres'] as $key) { + foreach (get_post_meta($pid, $key, false) as $uid) { + $user_ids[] = (int) $uid; + } + } + } + $user_ids = array_values(array_unique(array_filter($user_ids))); + if ($user_ids) { + cache_users($user_ids); + } + } + $cards = []; foreach ($posts as $post) { $cards[$post->ID] = thalim_get_card_data($post->ID); diff --git a/inc/seance-helpers.php b/inc/seance-helpers.php new file mode 100644 index 0000000..551fdc2 --- /dev/null +++ b/inc/seance-helpers.php @@ -0,0 +1,52 @@ +get_var( $wpdb->prepare( + "SELECT pm.post_id FROM {$wpdb->postmeta} pm + JOIN {$wpdb->posts} p ON p.ID = pm.post_id + WHERE pm.meta_key = 'seances' AND pm.meta_value = %s + AND p.post_status = 'publish' + LIMIT 1", + (string) $seance_id + ) ); + } + return $cache[ $seance_id ]; +} + +/** + * Lien public d'une séance : permalien du séminaire parent + #seance-{ID}, + * ou permalien de la séance elle-même si aucun parent n'est trouvé. + */ +function thalim_get_seance_link( int $seance_id ): string { + $parent_id = thalim_get_seance_parent_id( $seance_id ); + return $parent_id + ? get_permalink( $parent_id ) . '#seance-' . $seance_id + : (string) get_permalink( $seance_id ); +} + +// Séance de séminaire: redirect to parent séminaire with #seance-{ID} anchor +add_action( 'template_redirect', function() { + if ( ! is_single() ) return; + if ( ! has_category( thalim_cat_id( 'seance' ) ) ) return; + + $seance_id = get_the_ID(); + $parent_id = thalim_get_seance_parent_id( $seance_id ); + + if ( $parent_id ) { + wp_redirect( get_permalink( $parent_id ) . '#seance-' . $seance_id, 301 ); + exit; + } +} ); diff --git a/inc/single-helpers.php b/inc/single-helpers.php index d7ff126..7a5260b 100644 --- a/inc/single-helpers.php +++ b/inc/single-helpers.php @@ -40,14 +40,16 @@ function thalim_get_single_data($post_id) { $data = [ // Text fields 'sous_titre' => thalim_bilingual( get_post_meta($post_id, 'sous-titre', true) ?: '', $lang ), - 'reference_bibliographique' => get_post_meta($post_id, 'reference_bibliographique', true) ?: '', + // wp_kses_post: rendus en |raw dans single.twig (autoescape off) et + // éditables par les contributeurs listés en membres → filtrer le HTML. + 'reference_bibliographique' => wp_kses_post( get_post_meta($post_id, 'reference_bibliographique', true) ?: '' ), 'editeur' => get_post_meta($post_id, 'editeur', true) ?: '', 'journal' => get_post_meta($post_id, 'journal', true) ?: '', 'lieu' => thalim_bilingual( get_post_meta($post_id, 'lieu', true) ?: '', $lang ), 'adresse' => nl2br( esc_html( get_post_meta($post_id, 'adresse', true) ?: '' ) ), 'autrepersonnes' => get_post_meta($post_id, 'autrepersonnes', true) ?: '', 'autre_autrepersonnes' => get_post_meta($post_id, 'autre_autrepersonnes', true) ?: '', - 'body_en' => apply_filters( 'the_content', get_post_meta($post_id, 'body_en', true) ?: '' ), + 'body_en' => apply_filters( 'the_content', wp_kses_post( get_post_meta($post_id, 'body_en', true) ?: '' ) ), // Dates (formatted for display) 'datetime' => thalim_format_date(get_post_meta($post_id, 'datetime', true), $lang), @@ -110,10 +112,10 @@ function thalim_get_single_data($post_id) { if ($ts_debut) $data['date_debut_ymd'] = date('Y-m-d', $ts_debut); if ($ts_fin) $data['date_fin_ymd'] = date('Y-m-d', $ts_fin); - // Ouvrages (cat 15): override display to year only — raw timestamps and + // Ouvrages: override display to year only — raw timestamps and // *_ymd fields stay full-precision so sorting/filtering on index pages // (`thalim_event_date_order`) keeps working. - if (in_array(15, wp_get_post_categories($post_id), true)) { + if (in_array(thalim_cat_id('ouvrages'), wp_get_post_categories($post_id), true)) { $data['date_de_debut'] = thalim_format_date($raw_debut, $lang, 'Y'); $data['date_de_fin'] = thalim_format_date($raw_fin, $lang, 'Y'); $data['datetime'] = thalim_format_date(get_post_meta($post_id, 'datetime', true), $lang, 'Y'); @@ -138,7 +140,7 @@ function thalim_get_single_data($post_id) { // --- Category hierarchy for breadcrumb and color --- $categories = wp_get_post_categories($post_id, ['fields' => 'all']); - $excluded_ids = [12, 31]; + $excluded_ids = array_filter([ thalim_cat_id('seance'), thalim_cat_id('non-classe') ]); foreach ($categories as $cat) { if (in_array($cat->term_id, $excluded_ids)) continue; $ancestor_ids = get_ancestors($cat->term_id, 'category'); @@ -256,7 +258,6 @@ function thalim_get_single_data($post_id) { 'post_type' => 'post', 'post__in' => array_map('intval', $related_ids), 'posts_per_page' => -1, - 'lang' => '', ]); } @@ -272,7 +273,6 @@ function thalim_get_single_data($post_id) { 'orderby' => 'meta_value', 'meta_key' => 'date_de_debut', 'order' => 'ASC', - 'lang' => '', 'post_status' => ['publish', 'future'], ]); $now = time(); @@ -303,7 +303,7 @@ function thalim_get_single_data($post_id) { 'heure_de_fin' => substr( get_post_meta($seance->ID, 'heure_de_fin', true) ?: '', 0, 5 ), 'lieu' => thalim_bilingual( get_post_meta($seance->ID, 'lieu', true) ?: '', $lang ), 'adresse' => nl2br( esc_html( get_post_meta($seance->ID, 'adresse', true) ?: '' ) ), - 'body_en' => apply_filters( 'the_content', get_post_meta($seance->ID, 'body_en', true) ?: '' ), + 'body_en' => apply_filters( 'the_content', wp_kses_post( get_post_meta($seance->ID, 'body_en', true) ?: '' ) ), 'intervenants' => [], 'images' => [], 'documents' => [], @@ -372,7 +372,6 @@ function thalim_get_single_data($post_id) { 'post_type' => 'post', 'post__in' => array_map('intval', $s_related_ids), 'posts_per_page' => -1, - 'lang' => '', ]); } diff --git a/index.php b/index.php index 6c2c204..26ae91f 100755 --- a/index.php +++ b/index.php @@ -30,7 +30,6 @@ $annonces_raw = Timber::get_posts([ ]], 'orderby' => 'date', 'order' => 'DESC', - 'lang' => '', 'thalim_event_date_order' => true, ]); $context['annonces'] = $sort_with_pinned($annonces_raw, 'epingler_dans_le_diaporama_dannonces', $max_swiper); @@ -42,20 +41,19 @@ $publications_raw = Timber::get_posts([ 'posts_per_page' => 30, 'orderby' => 'date', 'order' => 'DESC', - 'lang' => '', 'tax_query' => [ 'relation' => 'AND', [ 'taxonomy' => 'category', 'field' => 'term_id', - 'terms' => [4], + 'terms' => [ thalim_cat_id('publications') ], 'operator' => 'IN', 'include_children' => true, ], [ 'taxonomy' => 'category', 'field' => 'term_id', - 'terms' => [16], + 'terms' => [ thalim_cat_id('articles') ], 'operator' => 'NOT IN', ], ], @@ -74,24 +72,34 @@ $publications_raw = Timber::get_posts([ ]); $context['publications'] = $sort_with_pinned($publications_raw, 'epingler_dans_le_diaporama_des_publications_et_productions', $max_swiper); $context['publications_cards'] = thalim_get_cards_data($publications_raw); -$context['publications_link'] = thalim_en_url( get_category_link(4) ); -$context['annonces_link'] = thalim_en_url( get_permalink(29100) ); +$context['publications_link'] = thalim_en_url( get_category_link( thalim_cat_id('publications') ) ); +// Page « annonces » résolue par slug dans add_to_context() (annonces_url), +// au lieu d'un get_permalink(29100) codé en dur (post potentiellement absent). +$context['annonces_link'] = $context['annonces_url']; // --- Message du laboratoire --- $messages_labo = Timber::get_posts([ 'post_type' => 'post', 'posts_per_page' => 5, - 'cat' => 268, + 'cat' => thalim_cat_id('message-labo'), 'orderby' => 'date', 'order' => 'DESC', - 'lang' => '', ]); $context['messages_labo'] = $messages_labo ?: []; -$context['message_labo_link'] = thalim_en_url( get_category_link(268) ); +$context['message_labo_link'] = thalim_en_url( get_category_link( thalim_cat_id('message-labo') ) ); // --- Agenda (médiation scientifique + séances de séminaire à venir) --- $agenda_lang = thalim_current_language(); -$mediation_cat_ids = [5, 18, 19, 20, 21, 22, 23]; +// Catégories « agenda » résolues par slug (médiation + newsletter/gazette historiques) +$mediation_cat_ids = array_values( array_filter( [ + thalim_cat_id('mediation'), + thalim_cat_id('evenements-culturels'), + thalim_cat_id('medias'), + thalim_cat_id('newsletter'), + thalim_cat_id('gazette'), + thalim_cat_id('podcast'), + thalim_cat_id('captations'), +] ) ); $months_fr = ['jan.', 'fév.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.']; $months_en = ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Oct.', 'Nov.', 'Dec.']; $agenda_type_fields = [ @@ -123,7 +131,6 @@ $mediation_upcoming = Timber::get_posts([ 'posts_per_page' => 8, 'category__in' => $mediation_cat_ids, 'orderby' => ['date_clause' => 'ASC'], - 'lang' => '', 'meta_query' => [ 'date_clause' => [ 'key' => 'date_de_debut', @@ -150,13 +157,12 @@ foreach ($mediation_upcoming as $mpost) { if ($item) $agenda_items[] = $item; } -// 2. Upcoming séances de séminaire (cat 12) +// 2. Upcoming séances de séminaire $seances_upcoming = Timber::get_posts([ 'post_type' => 'post', 'posts_per_page' => 8, - 'category__in' => [12], + 'category__in' => [ thalim_cat_id('seance') ], 'orderby' => ['date_clause' => 'ASC'], - 'lang' => '', 'meta_query' => [ 'date_clause' => [ 'key' => 'date_de_debut', @@ -169,19 +175,7 @@ $seances_upcoming = Timber::get_posts([ foreach ($seances_upcoming as $seance) { $raw_date = get_post_meta($seance->ID, 'date_de_debut', true); if (!$raw_date) continue; - // Direct DB lookup — bypasses Polylang and other hook filters - global $wpdb; - $parent_id = $wpdb->get_var($wpdb->prepare( - "SELECT pm.post_id FROM {$wpdb->postmeta} pm - JOIN {$wpdb->posts} p ON p.ID = pm.post_id - WHERE pm.meta_key = 'seances' AND pm.meta_value = %s - AND p.post_status = 'publish' - LIMIT 1", - (string) $seance->ID - )); - $link = $parent_id - ? get_permalink((int) $parent_id) . '#seance-' . $seance->ID - : get_permalink($seance->ID); + $link = thalim_get_seance_link($seance->ID); $label = $agenda_lang === 'en' ? 'Seminar session' : 'Séance de séminaire'; $item = $make_agenda_item($seance, $raw_date, $label, get_post_meta($seance->ID, 'lieu', true) ?: '', $link); if ($item) $agenda_items[] = $item; @@ -198,7 +192,6 @@ if (empty($agenda_items)) { 'posts_per_page' => 5, 'category__in' => $mediation_cat_ids, 'orderby' => ['date_clause' => 'DESC'], - 'lang' => '', 'meta_query' => [ 'date_clause' => ['key' => 'date_de_debut', 'type' => 'DATETIME'], ], @@ -222,7 +215,7 @@ if (empty($agenda_items)) { } $context['agenda_items'] = $agenda_items; -$context['manifestations_link'] = thalim_en_url( add_query_arg( 'view', 'agenda', get_category_link(3) ) ); +$context['manifestations_link'] = thalim_en_url( add_query_arg( 'view', 'agenda', get_category_link( thalim_cat_id('manifestations') ) ) ); // --- Quick links --- $newsletter_cat = get_category_by_slug('newsletter'); @@ -247,7 +240,7 @@ if ( ! $newsletter_url ) { ); } $context['quick_links'] = [ - 'agenda' => thalim_en_url(add_query_arg('view', 'agenda', get_category_link(3))), + 'agenda' => thalim_en_url(add_query_arg('view', 'agenda', get_category_link( thalim_cat_id('manifestations') ))), 'contacts' => thalim_en_url(home_url('/contacts/')), 'newsletter' => $newsletter_url, ]; @@ -257,7 +250,6 @@ $context['has_tags'] = !empty(get_terms([ 'taxonomy' => 'post_tag', 'hide_empty' => true, 'number' => 1, - 'lang' => '', ])); Timber::render('index.twig', $context); \ No newline at end of file diff --git a/js/admin/admin-base.js b/js/admin/admin-base.js new file mode 100644 index 0000000..ae29fc5 --- /dev/null +++ b/js/admin/admin-base.js @@ -0,0 +1,405 @@ +/** + * Socle partagé des customisations admin (namespace window.ThalimAdmin). + * Chargé sur toutes les pages admin, avant les scripts de contexte + * (admin-rename, admin-post-edit, admin-profile, admin-taxonomy-list, + * admin-pods-modal) qui en dépendent. + */ +(function($) { + 'use strict'; + + // ── Configuration ────────────────────────────────────────── + // Sélecteurs et identifiants Pods utilisés par les modules admin, + // centralisés pour qu'un renommage côté Pods ne demande qu'une édition ici. + var CONFIG = { + // Options désactivées dans le select Pods « Type d'annonce » (term IDs) + disabledCategoryIds: ['1', '12', '5', '20'], + // Catégorie « Séance de séminaire » (verrouillée dans la modale Pods) + seanceCategoryId: '12', + // Select Pods de la catégorie + categorySelect: '#pods-form-ui-pods-meta-categorie', + // IDs des éditeurs TinyMCE Pods à réparer (reinitEditor) + editors: { + bodyEn: 'pods-form-ui-pods-meta-body-en', + refBib: 'pods-form-ui-pods-meta-reference-bibliographique' + }, + // Metaboxes Pods déplacées / observées + boxes: { + bodyEn: '#pods-meta-body-en', + typeDannonce: '#pods-meta-type-dannonce', + affichageAccueil: '#pods-meta-affichage-sur-laccueil', + thematique: '#pods-meta-thematique', + champsContextuels: '#pods-meta-champs-contextuels', + documentsJoints: '#pods-meta-documents-joints', + membres: '#pods-meta-membres' + }, + // Classes des lignes Pods conditionnelles observées (MutationObserver) + rows: { + axes: 'pods-form-ui-row-name-axes-thematiques', + refBib: 'pods-form-ui-row-name-reference-bibliographique' + }, + // Taxonomies dont la page liste reçoit l'info-bulle « FR // EN » + translateTaxonomies: ['axe_thematique', 'programme_de_recherche', 'post_tag'] + }; + + // Exécute un bloc d'init de façon isolée : une exception dans un module + // n'empêche pas les modules suivants de s'initialiser. + function safeRun(name, fn) { + try { + fn(); + } catch (err) { + if (window.console && console.error) { + console.error('[thalim-admin] ' + name + ' failed:', err); + } + } + } + + function isPostEditPage() { + return window.pagenow === 'post' + || window.pagenow === 'post-new' + // On CPTs, pagenow is the post_type slug — also catch them via the + // body classes WP sets for any post.php / post-new.php screen. + || document.body.classList.contains('post-php') + || document.body.classList.contains('post-new-php'); + } + + function isProfileEditPage() { + return window.pagenow === 'profile' || window.pagenow === 'user-edit' || window.pagenow === 'user-new'; + } + + function getProfileForm() { + return document.querySelector('#your-profile, #createuser'); + } + + function isPodsModal() { + return new URLSearchParams(window.location.search).has('pods_modal'); + } + + function updatePostboxVisibility() { + document.querySelectorAll('.postbox').forEach(function(postBox) { + if (postBox.id.startsWith('pods')) { + // body-en is controlled by language tabs — never auto-hide it + if ('#' + postBox.id === CONFIG.boxes.bodyEn) return; + var fields = postBox.querySelectorAll('tr'); + var hasVisibleFields = Array.from(fields).some(function(field) { + return field.style.display !== 'none'; + }); + postBox.style.display = hasVisibleFields ? 'block' : 'none'; + } + }); + } + + // Force Visual (TinyMCE) mode on page load. + // WP stores the last-used editor mode in localStorage and restores it at document.ready. + // When Code mode is restored, TinyMCE is never initialised — tinymce.get() returns null. + // Instead, check the wrapper's CSS class: + // tmce-active = Visual mode (fine) + // html-active = Code mode (switch to Visual) + function ensureVisualMode(editorId, attempt) { + attempt = attempt || 0; + if (attempt > 15) return; + var wrap = document.getElementById('wp-' + editorId + '-wrap'); + if (!wrap) { + setTimeout(function() { ensureVisualMode(editorId, attempt + 1); }, 200); + return; + } + if (wrap.classList.contains('html-active')) { + var ed = window.tinymce && tinymce.get(editorId); + if (!ed || !ed.initialized) { + // TinyMCE not ready yet — retry rather than calling switchEditors.go() prematurely + setTimeout(function() { ensureVisualMode(editorId, attempt + 1); }, 200); + return; + } + if (typeof switchEditors !== 'undefined') { + switchEditors.go(editorId, 'tmce'); + } + return; + } + if (!wrap.classList.contains('tmce-active')) { + // Mode not yet determined — retry + setTimeout(function() { ensureVisualMode(editorId, attempt + 1); }, 200); + } + } + + // Rebuild a TinyMCE editor whose iframe is broken (empty/non-interactive). + // This happens when TinyMCE is initialised on a hidden (display:none) element: + // the iframe can't measure dimensions and its document body stays empty. + // + // We reinit from tinyMCEPreInit.mceInit — first trying the editor's own config + // (registered by Pods server-side), falling back to 'content' (the native WP editor). + // + // Inline toolbar positioning fix: + // TinyMCE's 'wordpress' plugin captures document.getElementById(id+'_ifr') during + // 'preinit' — before the iframe is created — so mceIframe is always null. + // Fix: intercept getElementById during preinit so the 'wordpress' plugin captures + // a proxyIframe instead of null. After init, proxy delegates to the real iframe. + function reinitEditor(editorId) { + var ed = window.tinymce && tinymce.get(editorId); + // Preserve existing content before destroying the instance + var savedContent = ''; + if (ed) { + try { savedContent = ed.getContent(); } catch (e) {} + ed.remove(); + } + if (!savedContent) { + var ta = document.getElementById(editorId); + if (ta) savedContent = ta.value || ''; + } + + if (!window.tinyMCEPreInit || !window.tinymce) return; + + // Use the editor's own server-side config if available, else clone from 'content' + var baseInit = (tinyMCEPreInit.mceInit && tinyMCEPreInit.mceInit[editorId]) + || (tinyMCEPreInit.mceInit && tinyMCEPreInit.mceInit['content']); + if (!baseInit) return; + + // Proxy iframe: getBoundingClientRect() falls back to the editor wrap + var wrapId = 'wp-' + editorId + '-wrap'; + var proxyIframe = { + getBoundingClientRect: function() { + var el = document.getElementById(wrapId); + return el ? el.getBoundingClientRect() + : { top: 0, left: 0, right: window.innerWidth, + bottom: window.innerHeight, width: window.innerWidth, + height: window.innerHeight }; + } + }; + + var savedGetById = document.getElementById; + var origSetup = baseInit.setup; + var content = savedContent; + + tinymce.init($.extend({}, baseInit, { + selector: '#' + editorId, + setup: function(editor) { + if (typeof origSetup === 'function') origSetup(editor); + + editor.on('focus', function() { + window.wpActiveEditor = editorId; + }); + + editor.on('preinit', function() { + document.getElementById = function(id) { + if (id === editorId + '_ifr') return proxyIframe; + return savedGetById.call(document, id); + }; + setTimeout(function() { + document.getElementById = savedGetById; + }, 0); + }); + + editor.on('init', function() { + // Point proxy to real iframe + var realIframe = savedGetById.call(document, editorId + '_ifr'); + if (realIframe) { + proxyIframe.getBoundingClientRect = function() { + return realIframe.getBoundingClientRect(); + }; + } + // Restore content that was in the textarea + if (content) { + editor.setContent(content); + } + }); + } + })); + } + + // ── Info-popovers (post / user / taxonomy) ───────────────── + var INFO_ICON = ''; + var TRANSLATE_ICON = ''; + + var TRANSLATE_LINES = [ + 'Traduction en anglais après //', + 'ex : Texte en français // English text' + ]; + + // Tips without a `page` key default to 'post'. + // type: 'translate' uses the globe icon + green button style. + var INFO_TIPS = [ + // --- post edit page: info --- + { + selector: '.wp-heading-inline', + lines: [ + 'Saisir le titre anglais après //', + 'ex : Titre de l’annonce // Title of the announcement' + ] + }, + { + selector: '#pods-meta-documents-joints .postbox-header h2', + lines: [ + 'Ajouter les images dans les documents.', + 'Ajouter les légendes comme titre du document.' + ] + }, + { + selector: '#pods-meta-membres .postbox-header h2', + lines: [ + 'Le champ fonction change le libellé de la liste de personnes citées.', + 'Le champ membre permet de lister les membres de Thalim liés à l’annonce.', + 'Le champ autre personnes permet de lister des personnes extérieures à Thalim.' + ] + }, + { + selector: '#pods-meta-dates .postbox-header h2', + lines: [ + 'Pour entrer une date sans l’heure, régler l’heure sur 00 :00.' + ] + }, + { + selector: '#pods-meta-affichage-sur-laccueil .postbox-header h2', + lines: [ + 'Épingler l’annonce dans le diaporama la fait s’afficher avant les autres.' + ] + }, + { + selector: '#pods-meta-medias .postbox-header h2', + lines: [ + 'Pour ajouter un média Canal U, copier le lien depuis « Citer cette ressource ».', + 'ex : https://www.canal-u.tv/166564' + ] + }, + // --- post edit page: translate --- + { type: 'translate', selector: '#pods-meta-documents-joints .postbox-header h2', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-sous-titre th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-lieu th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-titre-du-lien-externe-1 th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-titre-du-lien-externe-2 th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-titre-du-lien-externe-3 th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-fonction-organisation th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-fonction-intervention th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-fonction-candidat th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-fonction-realisation th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-fonction-dirige th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-fonction-redaction th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-fonction-auteur th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-fonction-responsable th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-autre-fonction-autre th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-autre-fonction-concerne th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-autre-fonction-directeur th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-autre-fonction-direction-d-ouvrage th',lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-autre-fonction-intervenant th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-autre-fonction-participants th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-type-autre th', lines: TRANSLATE_LINES }, + // --- contenu_general edit page: translate --- + { type: 'translate', selector: '.pods-form-ui-row-name-umr th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-thalim th', lines: TRANSLATE_LINES }, + { type: 'translate', selector: '.pods-form-ui-row-name-siecles th', lines: TRANSLATE_LINES }, + // --- user/profile edit page: translate --- + { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-titre-du-lien-1 th', lines: TRANSLATE_LINES }, + { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-titre-du-lien-2 th', lines: TRANSLATE_LINES }, + { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-titre-du-lien-3 th', lines: TRANSLATE_LINES }, + { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-titre-du-lien-4 th', lines: TRANSLATE_LINES }, + { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-complement-de-role-1 th', lines: TRANSLATE_LINES }, + { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-complement-de-role-2 th', lines: TRANSLATE_LINES }, + { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-complement-de-role-3 th', lines: TRANSLATE_LINES }, + { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-affichage-du-statut-1 th', lines: TRANSLATE_LINES }, + { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-affichage-du-statut-2 th', lines: TRANSLATE_LINES }, + { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-affichage-du-statut-3 th', lines: TRANSLATE_LINES }, + { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-affiliation-autre th', lines: TRANSLATE_LINES }, + { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-titre-de-these th', lines: TRANSLATE_LINES }, + // --- taxonomy edit pages: translate --- + { type: 'translate', page: 'taxonomy', selector: 'label[for="name"]', lines: TRANSLATE_LINES }, + // --- user/profile edit page: info --- + { + page: 'user', + selector: '.pods-form-ui-label-pods-meta-identifiant-hal', + lines: [ + 'Renseigner votre idHAL (en lettres), pas votre PersonId (en chiffres).' + ] + }, + { + page: 'user', + selector: '.pods-form-ui-label-pods-meta-affichage-du-statut-1', + lines: [ + 'Texte de statut affiché sur le profil publique.' + ] + } + ]; + + var _popoverCloseHandlerRegistered = false; + + function initInfoPopovers(currentPage) { + currentPage = currentPage || 'post'; + + INFO_TIPS.forEach(function(tip) { + if ((tip.page || 'post') !== currentPage) return; + + var el = document.querySelector(tip.selector); + if (!el) return; + + var isTranslate = tip.type === 'translate'; + + var btn = document.createElement('button'); + btn.type = 'button'; + btn.className = isTranslate ? 'thalim-translate-btn' : 'thalim-info-btn'; + btn.setAttribute('aria-label', isTranslate ? 'Traduction bilingue' : 'Informations'); + btn.innerHTML = isTranslate ? TRANSLATE_ICON : INFO_ICON; + + var popover = document.createElement('div'); + popover.className = 'thalim-info-popover' + (isTranslate ? ' thalim-translate-popover' : ''); + popover.innerHTML = tip.lines.map(function(line) { + return '

' + line + '

'; + }).join(''); + + var wrapper = document.createElement('span'); + wrapper.className = 'thalim-info-wrapper'; + wrapper.appendChild(btn); + wrapper.appendChild(popover); + + el.appendChild(wrapper); + + btn.addEventListener('click', function(e) { + e.stopPropagation(); + var isOpen = popover.classList.contains('is-open'); + document.querySelectorAll('.thalim-info-popover.is-open').forEach(function(p) { + p.classList.remove('is-open'); + }); + if (!isOpen) { + var rect = btn.getBoundingClientRect(); + popover.style.top = (rect.bottom + 6) + 'px'; + popover.style.left = (rect.left + rect.width / 2) + 'px'; + popover.classList.add('is-open'); + } + }); + + popover.addEventListener('click', function(e) { + e.stopPropagation(); + }); + }); + + if (!_popoverCloseHandlerRegistered) { + _popoverCloseHandlerRegistered = true; + document.addEventListener('click', function() { + document.querySelectorAll('.thalim-info-popover.is-open').forEach(function(p) { + p.classList.remove('is-open'); + }); + }); + } + } + + // ── Reveal (#wpbody est masqué en CSS sur post/profil jusqu'à l'init) ── + function markReady() { + document.body.classList.add('admin-mods-ready'); + } + + // Fallback global : force le reveal après 2 s même si le script de + // contexte a planté ou n'a pas été chargé. + $(document).ready(function() { + setTimeout(markReady, 2000); + }); + + window.ThalimAdmin = { + CONFIG: CONFIG, + safeRun: safeRun, + isPostEditPage: isPostEditPage, + isProfileEditPage: isProfileEditPage, + getProfileForm: getProfileForm, + isPodsModal: isPodsModal, + ensureVisualMode: ensureVisualMode, + reinitEditor: reinitEditor, + updatePostboxVisibility: updatePostboxVisibility, + initInfoPopovers: initInfoPopovers, + markReady: markReady + }; + +})(jQuery); diff --git a/js/admin/admin-pods-modal.js b/js/admin/admin-pods-modal.js new file mode 100644 index 0000000..c477b0b --- /dev/null +++ b/js/admin/admin-pods-modal.js @@ -0,0 +1,49 @@ +/** + * Modale Pods de création de séance (URL contenant pods_modal) : + * verrouille la catégorie sur « Séance de séminaire ». + * Dépend de admin-base.js (window.ThalimAdmin) — enqueue conditionnel. + */ +(function($) { + 'use strict'; + + var TA = window.ThalimAdmin; + var CONFIG = TA.CONFIG; + var safeRun = TA.safeRun; + + $(document).ready(function() { + if (!TA.isPodsModal()) return; + + var lockSeanceCategory = function() { + var seanceCat = CONFIG.seanceCategoryId; + var itemId = $('#post_ID').val(); + if (window.PodsDFV && itemId) { + window.PodsDFV.setFieldValue('post', itemId, 'categorie', seanceCat, 0); + } + + // Lock category select to the séance category in iframe — + // delay to run after Pods React re-render + setTimeout(function() { + var $select = $(CONFIG.categorySelect); + if ($select.length) { + $select.find('option').each(function() { + this.disabled = this.value !== seanceCat; + }); + $select.val(seanceCat); + } + safeRun('updatePostboxVisibility', TA.updatePostboxVisibility); + }, 200); + }; + + // Dans l'iframe de la modale, window.load peut déjà être passé au moment + // où ce code s'exécute : s'abonner à un load déjà émis ne rejoue rien. + // On exécute donc tout de suite si la page est déjà chargée. + if (document.readyState === 'complete') { + safeRun('lockSeanceCategory', lockSeanceCategory); + } else { + $(window).on('load', function() { + safeRun('lockSeanceCategory', lockSeanceCategory); + }); + } + }); + +})(jQuery); diff --git a/js/admin/admin-post-edit.js b/js/admin/admin-post-edit.js new file mode 100644 index 0000000..1135506 --- /dev/null +++ b/js/admin/admin-post-edit.js @@ -0,0 +1,299 @@ +/** + * Page d'édition de post (post.php / post-new.php) : onglets FR/EN du corps, + * réordonnancement des metaboxes, groupement des axes, visibilité + * conditionnelle des boxes Pods, popovers d'aide, fixes TinyMCE/Gutenberg. + * Dépend de admin-base.js (window.ThalimAdmin) — enqueue conditionnel. + */ +(function($) { + 'use strict'; + + var TA = window.ThalimAdmin; + var CONFIG = TA.CONFIG; + var safeRun = TA.safeRun; + + // Phase 1: insert the tab bar and relocate #pods-meta-body-en. + // The DOM move breaks TinyMCE's iframe (browsers reset iframe content on detach), + // so we leave the container visible here and let Pods/TinyMCE initialise normally. + // The broken iframe is repaired by reinitEditor() on first EN tab open. + function setupBodyTabsDom() { + var nativeEditor = document.getElementById('postdivrich') || document.getElementById('postdiv'); + var bodyEnBox = document.querySelector(CONFIG.boxes.bodyEn); + if (!nativeEditor || !bodyEnBox) return; + + var tabBar = document.createElement('div'); + tabBar.className = 'body-lang-tabs'; + tabBar.innerHTML = + '' + + ''; + nativeEditor.parentNode.insertBefore(tabBar, nativeEditor); + + // Move EN metabox to sit right after the native editor for correct visual layout. + // Do NOT hide it yet — Pods must init TinyMCE with the container visible so the + // iframe can measure its dimensions. Page is still opacity:0 so no flash. + nativeEditor.parentNode.insertBefore(bodyEnBox, nativeEditor.nextSibling); + } + + // Phase 2: wire tab click handlers — runs at t=100ms after metabox reordering. + function initBodyLanguageTabs() { + var nativeEditor = document.getElementById('postdivrich') || document.getElementById('postdiv'); + var bodyEnBox = document.querySelector(CONFIG.boxes.bodyEn); + var tabBar = document.querySelector('.body-lang-tabs'); + if (!nativeEditor || !bodyEnBox || !tabBar) { + // body_en not available (e.g. contributor role) — still force visual mode on main editor + if (nativeEditor) TA.ensureVisualMode('content'); + return; + } + + var enEditorId = CONFIG.editors.bodyEn; + var enTmceReady = false; + + // Hide EN panel — page is still opacity:0, user won't see the switch + bodyEnBox.style.display = 'none'; + + tabBar.querySelectorAll('.body-lang-tab').forEach(function(btn) { + btn.addEventListener('click', function() { + tabBar.querySelectorAll('.body-lang-tab').forEach(function(b) { + b.classList.remove('is-active'); + }); + btn.classList.add('is-active'); + + var revealedPanel; + + if (btn.dataset.panel === 'fr') { + bodyEnBox.style.display = 'none'; + nativeEditor.style.opacity = '0'; + nativeEditor.style.display = ''; + revealedPanel = nativeEditor; + } else { + nativeEditor.style.display = 'none'; + bodyEnBox.style.opacity = '0'; + bodyEnBox.style.display = 'block'; + revealedPanel = bodyEnBox; + + if (!enTmceReady) { + enTmceReady = true; + // Reinit while container is visible so TinyMCE can measure dimensions + TA.reinitEditor(enEditorId); + } + } + + // Notify TinyMCE to reflow, then fade in once layout is correct + setTimeout(function() { + window.dispatchEvent(new Event('resize')); + requestAnimationFrame(function() { + requestAnimationFrame(function() { + revealedPanel.style.opacity = ''; + }); + }); + }, 50); + }); + }); + + // Ensure both editors start in Visual (not Code) mode + TA.ensureVisualMode('content'); + TA.ensureVisualMode(enEditorId); + } + + function groupAxesCheckboxes() { + if (!window.thalimAxesGroups || !thalimAxesGroups.length) return; + + var row = document.querySelector('.' + CONFIG.rows.axes); + if (!row) return; + + var list = row.querySelector('ul'); + if (!list) return; + + // Already grouped — nothing to do + if (list.querySelector('.axes-group-label')) return; + + // Map existing
  • by checkbox value; preserve "add new" button + var liMap = {}; + var addNewItem = null; + list.querySelectorAll('li').forEach(function(li) { + if (li.classList.contains('pods-pick-add-new')) { addNewItem = li; return; } + var cb = li.querySelector('input[type="checkbox"]'); + if (cb) liMap[cb.value] = li; + }); + + // Rebuild list in group order + list.innerHTML = ''; + thalimAxesGroups.forEach(function(group) { + var labelLi = document.createElement('li'); + labelLi.className = 'axes-group-label'; + labelLi.textContent = group.label; + list.appendChild(labelLi); + group.terms.forEach(function(term) { + var li = liMap[String(term.id)]; + if (li) list.appendChild(li); + }); + }); + + if (addNewItem) list.appendChild(addNewItem); + } + + var REF_BIB_EDITOR_ID = CONFIG.editors.refBib; + var refBibReinited = false; + + // Reinit the référence bibliographique TinyMCE editor. + // Called at page load (if the field is already visible) and by the + // MutationObserver (when the field becomes visible after a category change). + function initRefBibEditor() { + if (refBibReinited) return; + var row = document.querySelector('.' + CONFIG.rows.refBib); + if (!row || row.style.display === 'none') return; + refBibReinited = true; + TA.reinitEditor(REF_BIB_EDITOR_ID); + TA.ensureVisualMode(REF_BIB_EDITOR_ID); + } + + function initAxesGroupObserver() { + // Pods shows/hides conditional rows by removing inline style="display:none" + // Watch the entire Pods meta form for style changes on the axes row + var podsForm = document.querySelector('.pods-pick-values, ' + CONFIG.boxes.champsContextuels + ', form#post'); + if (!podsForm) podsForm = document.body; + + var observer = new MutationObserver(function(mutations) { + for (var i = 0; i < mutations.length; i++) { + var target = mutations[i].target; + if (target.classList && target.classList.contains(CONFIG.rows.axes)) { + if (target.style.display !== 'none') { + setTimeout(groupAxesCheckboxes, 50); + } + } + // Reinit TinyMCE on the référence bibliographique field when its + // row becomes visible — Pods hides it with display:none which breaks + // the TinyMCE iframe. Only reinit once per page load. + if (!refBibReinited && target.classList && + target.classList.contains(CONFIG.rows.refBib)) { + if (target.style.display !== 'none') { + setTimeout(initRefBibEditor, 100); + } + } + } + }); + + observer.observe(podsForm, { attributes: true, attributeFilter: ['style'], subtree: true }); + } + + // Gutenberg's Popover component closes on outside click via focusout detection. + // But if focus never enters the popover, focusout never fires and clicking outside + // does nothing. Fix: focus the popover container as soon as it appears in the DOM. + function initDatePickerPopoverFix() { + var observer = new MutationObserver(function(mutations) { + for (var i = 0; i < mutations.length; i++) { + var added = mutations[i].addedNodes; + for (var j = 0; j < added.length; j++) { + var node = added[j]; + if (node.nodeType !== 1) continue; + var content = node.classList.contains('components-popover__content') + ? node + : node.querySelector && node.querySelector('.components-popover__content'); + if (content) { + var c = content; + requestAnimationFrame(function() { + if (!c.hasAttribute('tabindex')) c.setAttribute('tabindex', '-1'); + c.focus(); + }); + } + } + } + }); + observer.observe(document.body, { childList: true, subtree: true }); + } + + function updateMembresGridSeparator() { + var sep = document.querySelector(CONFIG.boxes.membres + ' .membres-grid-separator'); + if (!sep) return; + var autreRows = document.querySelectorAll(CONFIG.boxes.membres + ' [class*="pods-form-ui-row-name-autre-"]'); + var anyVisible = Array.from(autreRows).some(function(row) { + return row.style.display !== 'none'; + }); + sep.style.display = anyVisible ? '' : 'none'; + } + + function initPostEditPage() { + // Disable category options (CSS handles the color) + const categorieSelect = document.querySelector(CONFIG.categorySelect); + if (categorieSelect) { + categorieSelect.querySelectorAll('option').forEach(option => { + if (CONFIG.disabledCategoryIds.includes(option.value)) { + option.disabled = true; + } + }); + } + + // Reorder meta boxes + const sideSortables = document.querySelector('#side-sortables'); + if (sideSortables) { + const typeDannonce = document.querySelector(CONFIG.boxes.typeDannonce); + const affichageAccueil = document.querySelector(CONFIG.boxes.affichageAccueil); + const thematique = document.querySelector(CONFIG.boxes.thematique); + if (typeDannonce) sideSortables.prepend(typeDannonce); + if (affichageAccueil) sideSortables.appendChild(affichageAccueil); + if (thematique) sideSortables.appendChild(thematique); + } + + const submitDiv = document.querySelector('#submitdiv'); + if (submitDiv && submitDiv.parentNode) { + submitDiv.parentNode.appendChild(submitDiv); + } + + const champsContextuels = document.querySelector(CONFIG.boxes.champsContextuels); + if (champsContextuels && champsContextuels.parentNode) { + champsContextuels.parentNode.prepend(champsContextuels); + } + + // Chaque sous-module est isolé : une exception dans l'un + // n'empêche pas les suivants de s'initialiser. + safeRun('initBodyLanguageTabs', initBodyLanguageTabs); + safeRun('initRefBibEditor', initRefBibEditor); + safeRun('groupAxesCheckboxes', groupAxesCheckboxes); + safeRun('initAxesGroupObserver', initAxesGroupObserver); + safeRun('updatePostboxVisibility', TA.updatePostboxVisibility); + safeRun('initDatePickerPopoverFix', initDatePickerPopoverFix); + safeRun('initInfoPopovers', TA.initInfoPopovers); + + // Place #pods-meta-documents-joints in #normal-sortables, right after + // #pods-meta-champs-contextuels. This keeps it out of #post-body-content + // (the body editor section) regardless of whether champsContextuels is + // currently visible. When champsContextuels is hidden it takes no space, + // so documentsJoints simply appears first in #normal-sortables. + const documentsJoints = document.querySelector(CONFIG.boxes.documentsJoints); + if (documentsJoints) { + if (champsContextuels && champsContextuels.parentNode) { + champsContextuels.parentNode.insertBefore(documentsJoints, champsContextuels.nextSibling); + } else { + const normalSortables = document.querySelector('#normal-sortables'); + if (normalSortables) normalSortables.prepend(documentsJoints); + } + } + + // Inject separator row for the Membres grid layout + var membresTbody = document.querySelector(CONFIG.boxes.membres + ' .form-table tbody'); + if (membresTbody && !membresTbody.querySelector('.membres-grid-separator')) { + var sep = document.createElement('tr'); + sep.className = 'membres-grid-separator'; + membresTbody.appendChild(sep); + } + updateMembresGridSeparator(); + } + + $(document).ready(function() { + if (!TA.isPostEditPage()) return; + + safeRun('setupBodyTabsDom', setupBodyTabsDom); + + setTimeout(function() { + safeRun('initPostEditPage', initPostEditPage); + TA.markReady(); + }, 100); + + $(CONFIG.categorySelect).change(function() { + setTimeout(function() { + safeRun('updatePostboxVisibility', TA.updatePostboxVisibility); + safeRun('updateMembresGridSeparator', updateMembresGridSeparator); + }, 10); + }); + }); + +})(jQuery); diff --git a/js/admin/admin-profile.js b/js/admin/admin-profile.js new file mode 100644 index 0000000..f20e40b --- /dev/null +++ b/js/admin/admin-profile.js @@ -0,0 +1,149 @@ +/** + * Pages profil / utilisateur (profile.php, user-edit.php, user-new.php) : + * réordonnancement des sections natives, popovers d'aide, mode visuel forcé + * sur les WYSIWYG Pods. + * Dépend de admin-base.js (window.ThalimAdmin) — enqueue conditionnel. + */ +(function($) { + 'use strict'; + + var TA = window.ThalimAdmin; + var safeRun = TA.safeRun; + + // Only native WP field sections — never touch Pods tables (they may contain TinyMCE editors) + var PROFILE_SECTION_KEYS = [ + 'user-language-wrap', + 'user-first-name-wrap', + 'user-email-wrap', + 'user-pass1-wrap', + 'upload-avatar-row', + ]; + + // Desired order. Groups of 2 are wrapped in a flex row and displayed side by side. + var PROFILE_ORDER = [ + ['user-first-name-wrap', 'upload-avatar-row'], + ['user-email-wrap'], + ['user-language-wrap', 'user-pass1-wrap'], + ]; + + function reorderProfileSections() { + var form = TA.getProfileForm(); + if (!form) return; + + var pairMap = {}; + + form.querySelectorAll('table.form-table').forEach(function(table) { + PROFILE_SECTION_KEYS.forEach(function(key) { + if (pairMap[key] || !table.querySelector('.' + key)) return; + + // Find the associated heading: first try preceding sibling in same parent, + // then look for an h2/h3 inside the same wrapper element. + var h2 = null; + var el = table.previousElementSibling; + while (el) { + if (el.tagName === 'H2' || el.tagName === 'H3') { h2 = el; break; } + if (el.tagName === 'TABLE') break; + el = el.previousElementSibling; + } + if (!h2 && table.parentElement !== form) { + h2 = table.parentElement.querySelector('h2, h3'); + } + + // The unit to move: if h2 and table share a non-form wrapper, move the wrapper. + var wrapper = null; + if (h2 && h2.parentElement !== form && h2.parentElement === table.parentElement) { + wrapper = h2.parentElement; + } + + pairMap[key] = { h2: h2, table: table, wrapper: wrapper }; + }); + }); + + // Remove all matched units from DOM (dedup by actual element) + var removed = new Set(); + function removeEl(el) { + if (el && !removed.has(el)) { removed.add(el); el.remove(); } + } + Object.values(pairMap).forEach(function(unit) { + if (unit.wrapper) { removeEl(unit.wrapper); } + else { removeEl(unit.h2); removeEl(unit.table); } + }); + + // Re-insert in declared order before the submit button + var submitAnchor = form.querySelector('p.submit'); + function append(el) { + if (submitAnchor && submitAnchor.parentNode) form.insertBefore(el, submitAnchor); + else form.appendChild(el); + } + function appendUnit(unit) { + if (unit.wrapper) { append(unit.wrapper); } + else { if (unit.h2) append(unit.h2); append(unit.table); } + } + + PROFILE_ORDER.forEach(function(group) { + var available = group.filter(function(key) { return !!pairMap[key]; }); + if (!available.length) return; + + // Dedup: two keys may resolve to the same table/wrapper + var seen = new Set(); + var units = []; + available.forEach(function(key) { + var unit = pairMap[key]; + var id = unit.wrapper || unit.table; + if (!seen.has(id)) { seen.add(id); units.push(unit); } + }); + + if (units.length === 1) { + appendUnit(units[0]); + } else { + var row = document.createElement('div'); + row.className = 'profile-section-row'; + units.forEach(function(unit) { + var col = document.createElement('div'); + col.className = 'profile-section-col'; + if (unit.wrapper) { col.appendChild(unit.wrapper); } + else { if (unit.h2) col.appendChild(unit.h2); col.appendChild(unit.table); } + row.appendChild(col); + }); + append(row); + } + }); + } + + function initProfileEditors() { + reorderProfileSections(); + TA.initInfoPopovers('user'); + + // Hide the "À propos du compte" section heading + document.querySelectorAll('#your-profile h2, #adduser h2, #createuser h2').forEach(function(h2) { + if (h2.textContent.trim() === 'À propos du compte') { + h2.style.display = 'none'; + } + }); + + // Rename "Rôle" label to "Rôle sur le site" + var roleLabel = document.querySelector('label[for="role"]'); + if (roleLabel && roleLabel.textContent.trim() === 'Rôle') { + roleLabel.textContent = 'Rôle sur le site'; + } + } + + $(document).ready(function() { + if (!TA.isProfileEditPage()) return; + + setTimeout(function() { + safeRun('initProfileEditors', initProfileEditors); + TA.markReady(); + }, 100); + + // Force visual mode on all Pods WYSIWYG fields once everything is loaded + $(window).on('load', function() { + var scope = TA.getProfileForm() || document; + scope.querySelectorAll('.pods-dfv-container-wysiwyg textarea').forEach(function(ta) { + if (!ta.id) return; + TA.ensureVisualMode(ta.id); + }); + }); + }); + +})(jQuery); diff --git a/js/admin/admin-rename.js b/js/admin/admin-rename.js new file mode 100644 index 0000000..144f3c4 --- /dev/null +++ b/js/admin/admin-rename.js @@ -0,0 +1,77 @@ +/** + * Renomme « Article » en « Annonce » dans l'interface admin (toutes pages). + * Dépend de admin-base.js (window.ThalimAdmin). + */ +(function() { + 'use strict'; + + var TA = window.ThalimAdmin; + + function renameArticlesToAnnonces() { + const replacements = [ + [/Tous les articles/g, 'Toutes les annonces'], + [/Ajouter un article/g, 'Ajouter une annonce'], + [/Modifier l.article/g, "Modifier l'annonce"], + [/Prévisualiser l.article/g, "Prévisualiser l'annonce"], + [/Afficher l.article/g, "Afficher l'annonce"], + [/Voir l.article/g, "Voir l'annonce"], + [/Article publié/g, 'Annonce publiée'], + [/Article mis à jour/g, 'Annonce mise à jour'], + [/Article planifié/g, 'Annonce planifiée'], + [/Articles par page/g, 'Annonces par page'], + [/Articles/g, 'Annonces'], + [/Article/g, 'Annonce'], + [/Rechercher des articles/g, 'Rechercher des annonces'], + ]; + + function applyReplacements(text) { + return replacements.reduce((t, [s, r]) => t.replace(s, r), text); + } + + function replaceInTextNodes(el) { + if (!el) return; + const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT); + const nodes = []; + while (walker.nextNode()) nodes.push(walker.currentNode); + nodes.forEach(function(node) { + const replaced = applyReplacements(node.textContent); + if (replaced !== node.textContent) node.textContent = replaced; + }); + } + + // Menu latéral + replaceInTextNodes(document.querySelector('#menu-posts')); + + // Titre de page (h1) et bouton d'ajout + document.querySelectorAll('.wp-heading-inline, .page-title-action').forEach(replaceInTextNodes); + + // Notifications après sauvegarde (Article publié, mis à jour…) + document.querySelectorAll('#message, .notice').forEach(replaceInTextNodes); + + // Boîte de publication — lien "Voir l'article" + replaceInTextNodes(document.querySelector('.submitbox')); + + // Options d'écran — "Articles par page" + replaceInTextNodes(document.querySelector('#screen-options-wrap')); + + // Bouton de recherche (attribut value + aria-label) + var searchSubmit = document.querySelector('#search-submit'); + if (searchSubmit) { + if (searchSubmit.value) { + searchSubmit.value = applyReplacements(searchSubmit.value); + } + var ariaLabel = searchSubmit.getAttribute('aria-label'); + if (ariaLabel) { + searchSubmit.setAttribute('aria-label', applyReplacements(ariaLabel)); + } + } + + // Titre de l'onglet du navigateur + document.title = applyReplacements(document.title); + } + + document.addEventListener('DOMContentLoaded', function() { + TA.safeRun('renameArticlesToAnnonces', renameArticlesToAnnonces); + }); + +})(); diff --git a/js/admin/admin-taxonomy-list.js b/js/admin/admin-taxonomy-list.js new file mode 100644 index 0000000..3c0efc9 --- /dev/null +++ b/js/admin/admin-taxonomy-list.js @@ -0,0 +1,80 @@ +/** + * Pages listes/édition de taxonomies (edit-tags.php, term.php) : + * info-bulles « FR // EN », filtre « Type de programme », mode visuel forcé + * sur les WYSIWYG Pods des pages term. + * Dépend de admin-base.js (window.ThalimAdmin) — enqueue conditionnel. + */ +(function($) { + 'use strict'; + + var TA = window.ThalimAdmin; + var CONFIG = TA.CONFIG; + var safeRun = TA.safeRun; + + // Inject a "Type de programme" filter select into the taxonomy search form. + // The form already has hidden taxonomy/post_type fields so the select value + // is submitted with them and picked up by pre_get_terms server-side. + function initProgrammeFilter() { + var form = document.querySelector('form.search-form'); + if (!form) return; + + var types = [ + 'Programme subventionné', + 'Autre programme', + 'Ancien programme' + ]; + + // Read current filter value from the URL. + var params = new URLSearchParams(window.location.search); + var current = params.get('type_de_programme') || ''; + + var select = document.createElement('select'); + select.name = 'type_de_programme'; + select.id = 'filter-type-de-programme'; + select.style.cssText = 'margin-right:6px;'; + + var blank = document.createElement('option'); + blank.value = ''; + blank.textContent = 'Tous les types'; + select.appendChild(blank); + + types.forEach(function(type) { + var opt = document.createElement('option'); + opt.value = type; + opt.textContent = type; + if (type === current) opt.selected = true; + select.appendChild(opt); + }); + + // Insert before the first

    (search-box) inside the form. + var searchBox = form.querySelector('p.search-box'); + form.insertBefore(select, searchBox || null); + } + + $(document).ready(function() { + setTimeout(function() { + safeRun('taxonomyPopovers', function() { + var isTranslateTaxonomy = CONFIG.translateTaxonomies.some(function(tax) { + return window.location.search.indexOf('taxonomy=' + tax) !== -1; + }); + if (isTranslateTaxonomy) { + TA.initInfoPopovers('taxonomy'); + } + }); + safeRun('programmeFilter', function() { + if (window.location.search.indexOf('taxonomy=programme_de_recherche') !== -1) { + initProgrammeFilter(); + } + }); + }, 100); + + // term.php / edit-tags.php : force visual mode on Pods WYSIWYG fields + $(window).on('load', function() { + document.querySelectorAll('.pods-dfv-container-wysiwyg textarea').forEach(function(ta) { + if (!ta.id) return; + TA.ensureVisualMode(ta.id); + }); + }); + }); + +})(jQuery); diff --git a/js/adminDashboardMods.js b/js/adminDashboardMods.js deleted file mode 100644 index 1cdc44f..0000000 --- a/js/adminDashboardMods.js +++ /dev/null @@ -1,892 +0,0 @@ -(function($) { - 'use strict'; - - function isPostEditPage() { - return window.pagenow === 'post' - || window.pagenow === 'post-new' - // On CPTs, pagenow is the post_type slug — also catch them via the - // body classes WP sets for any post.php / post-new.php screen. - || document.body.classList.contains('post-php') - || document.body.classList.contains('post-new-php'); - } - - function isProfileEditPage() { - return window.pagenow === 'profile' || window.pagenow === 'user-edit' || window.pagenow === 'user-new'; - } - - function getProfileForm() { - return document.querySelector('#your-profile, #createuser'); - } - - function isPodsModal() { - return new URLSearchParams(window.location.search).has('pods_modal'); - } - - function renameArticlesToAnnonces() { - const replacements = [ - [/Tous les articles/g, 'Toutes les annonces'], - [/Ajouter un article/g, 'Ajouter une annonce'], - [/Modifier l.article/g, "Modifier l'annonce"], - [/Pr\u00e9visualiser l.article/g, "Pr\u00e9visualiser l'annonce"], - [/Afficher l.article/g, "Afficher l'annonce"], - [/Voir l.article/g, "Voir l'annonce"], - [/Article publi\u00e9/g, 'Annonce publi\u00e9e'], - [/Article mis \u00e0 jour/g, 'Annonce mise \u00e0 jour'], - [/Article planifi\u00e9/g, 'Annonce planifi\u00e9e'], - [/Articles par page/g, 'Annonces par page'], - [/Articles/g, 'Annonces'], - [/Article/g, 'Annonce'], - [/Rechercher des articles/g, 'Rechercher des annonces'], - ]; - - function applyReplacements(text) { - return replacements.reduce((t, [s, r]) => t.replace(s, r), text); - } - - function replaceInTextNodes(el) { - if (!el) return; - const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT); - const nodes = []; - while (walker.nextNode()) nodes.push(walker.currentNode); - nodes.forEach(function(node) { - const replaced = applyReplacements(node.textContent); - if (replaced !== node.textContent) node.textContent = replaced; - }); - } - - // Menu latéral - replaceInTextNodes(document.querySelector('#menu-posts')); - - // Titre de page (h1) et bouton d'ajout - document.querySelectorAll('.wp-heading-inline, .page-title-action').forEach(replaceInTextNodes); - - // Notifications après sauvegarde (Article publié, mis à jour…) - document.querySelectorAll('#message, .notice').forEach(replaceInTextNodes); - - // Boîte de publication — lien "Voir l'article" - replaceInTextNodes(document.querySelector('.submitbox')); - - // Options d'écran — "Articles par page" - replaceInTextNodes(document.querySelector('#screen-options-wrap')); - - // Bouton de recherche (attribut value + aria-label) - var searchSubmit = document.querySelector('#search-submit'); - if (searchSubmit) { - if (searchSubmit.value) { - searchSubmit.value = applyReplacements(searchSubmit.value); - } - var ariaLabel = searchSubmit.getAttribute('aria-label'); - if (ariaLabel) { - searchSubmit.setAttribute('aria-label', applyReplacements(ariaLabel)); - } - } - - // Titre de l'onglet du navigateur - document.title = applyReplacements(document.title); - } - - function updatePostboxVisibility() { - document.querySelectorAll('.postbox').forEach((postBox) => { - if (postBox.id.startsWith('pods')) { - // body-en is controlled by language tabs — never auto-hide it - if (postBox.id === 'pods-meta-body-en') return; - const fields = postBox.querySelectorAll('tr'); - const hasVisibleFields = Array.from(fields).some(field => field.style.display !== 'none'); - postBox.style.display = hasVisibleFields ? 'block' : 'none'; - } - }); - } - - // Force Visual (TinyMCE) mode on page load. - // WP stores the last-used editor mode in localStorage and restores it at document.ready. - // When Code mode is restored, TinyMCE is never initialised — tinymce.get() returns null. - // Instead, check the wrapper's CSS class: - // tmce-active = Visual mode (fine) - // html-active = Code mode (switch to Visual) - function ensureVisualMode(editorId, attempt) { - attempt = attempt || 0; - if (attempt > 15) return; - var wrap = document.getElementById('wp-' + editorId + '-wrap'); - if (!wrap) { - setTimeout(function() { ensureVisualMode(editorId, attempt + 1); }, 200); - return; - } - if (wrap.classList.contains('html-active')) { - var ed = window.tinymce && tinymce.get(editorId); - if (!ed || !ed.initialized) { - // TinyMCE not ready yet — retry rather than calling switchEditors.go() prematurely - setTimeout(function() { ensureVisualMode(editorId, attempt + 1); }, 200); - return; - } - if (typeof switchEditors !== 'undefined') { - switchEditors.go(editorId, 'tmce'); - } - return; - } - if (!wrap.classList.contains('tmce-active')) { - // Mode not yet determined — retry - setTimeout(function() { ensureVisualMode(editorId, attempt + 1); }, 200); - } - } - - // Phase 1: insert the tab bar and relocate #pods-meta-body-en. - // The DOM move breaks TinyMCE's iframe (browsers reset iframe content on detach), - // so we leave the container visible here and let Pods/TinyMCE initialise normally. - // The broken iframe is repaired by reinitEditor() on first EN tab open. - function setupBodyTabsDom() { - var nativeEditor = document.getElementById('postdivrich') || document.getElementById('postdiv'); - var bodyEnBox = document.getElementById('pods-meta-body-en'); - if (!nativeEditor || !bodyEnBox) return; - - var tabBar = document.createElement('div'); - tabBar.className = 'body-lang-tabs'; - tabBar.innerHTML = - '' + - ''; - nativeEditor.parentNode.insertBefore(tabBar, nativeEditor); - - // Move EN metabox to sit right after the native editor for correct visual layout. - // Do NOT hide it yet — Pods must init TinyMCE with the container visible so the - // iframe can measure its dimensions. Page is still opacity:0 so no flash. - nativeEditor.parentNode.insertBefore(bodyEnBox, nativeEditor.nextSibling); - } - - // Rebuild a TinyMCE editor whose iframe is broken (empty/non-interactive). - // This happens when TinyMCE is initialised on a hidden (display:none) element: - // the iframe can't measure dimensions and its document body stays empty. - // - // We reinit from tinyMCEPreInit.mceInit — first trying the editor's own config - // (registered by Pods server-side), falling back to 'content' (the native WP editor). - // - // Inline toolbar positioning fix: - // TinyMCE's 'wordpress' plugin captures document.getElementById(id+'_ifr') during - // 'preinit' — before the iframe is created — so mceIframe is always null. - // Fix: intercept getElementById during preinit so the 'wordpress' plugin captures - // a proxyIframe instead of null. After init, proxy delegates to the real iframe. - function reinitEditor(editorId) { - var ed = window.tinymce && tinymce.get(editorId); - // Preserve existing content before destroying the instance - var savedContent = ''; - if (ed) { - try { savedContent = ed.getContent(); } catch (e) {} - ed.remove(); - } - if (!savedContent) { - var ta = document.getElementById(editorId); - if (ta) savedContent = ta.value || ''; - } - - if (!window.tinyMCEPreInit || !window.tinymce) return; - - // Use the editor's own server-side config if available, else clone from 'content' - var baseInit = (tinyMCEPreInit.mceInit && tinyMCEPreInit.mceInit[editorId]) - || (tinyMCEPreInit.mceInit && tinyMCEPreInit.mceInit['content']); - if (!baseInit) return; - - // Proxy iframe: getBoundingClientRect() falls back to the editor wrap - var wrapId = 'wp-' + editorId + '-wrap'; - var proxyIframe = { - getBoundingClientRect: function() { - var el = document.getElementById(wrapId); - return el ? el.getBoundingClientRect() - : { top: 0, left: 0, right: window.innerWidth, - bottom: window.innerHeight, width: window.innerWidth, - height: window.innerHeight }; - } - }; - - var savedGetById = document.getElementById; - var origSetup = baseInit.setup; - var content = savedContent; - - tinymce.init($.extend({}, baseInit, { - selector: '#' + editorId, - setup: function(editor) { - if (typeof origSetup === 'function') origSetup(editor); - - editor.on('focus', function() { - window.wpActiveEditor = editorId; - }); - - editor.on('preinit', function() { - document.getElementById = function(id) { - if (id === editorId + '_ifr') return proxyIframe; - return savedGetById.call(document, id); - }; - setTimeout(function() { - document.getElementById = savedGetById; - }, 0); - }); - - editor.on('init', function() { - // Point proxy to real iframe - var realIframe = savedGetById.call(document, editorId + '_ifr'); - if (realIframe) { - proxyIframe.getBoundingClientRect = function() { - return realIframe.getBoundingClientRect(); - }; - } - // Restore content that was in the textarea - if (content) { - editor.setContent(content); - } - }); - } - })); - } - - // Phase 2: wire tab click handlers — runs at t=100ms after metabox reordering. - function initBodyLanguageTabs() { - var nativeEditor = document.getElementById('postdivrich') || document.getElementById('postdiv'); - var bodyEnBox = document.getElementById('pods-meta-body-en'); - var tabBar = document.querySelector('.body-lang-tabs'); - if (!nativeEditor || !bodyEnBox || !tabBar) { - // body_en not available (e.g. contributor role) — still force visual mode on main editor - if (nativeEditor) ensureVisualMode('content'); - return; - } - - var enEditorId = 'pods-form-ui-pods-meta-body-en'; - var enTmceReady = false; - - // Hide EN panel — page is still opacity:0, user won't see the switch - bodyEnBox.style.display = 'none'; - - tabBar.querySelectorAll('.body-lang-tab').forEach(function(btn) { - btn.addEventListener('click', function() { - tabBar.querySelectorAll('.body-lang-tab').forEach(function(b) { - b.classList.remove('is-active'); - }); - btn.classList.add('is-active'); - - var revealedPanel; - - if (btn.dataset.panel === 'fr') { - bodyEnBox.style.display = 'none'; - nativeEditor.style.opacity = '0'; - nativeEditor.style.display = ''; - revealedPanel = nativeEditor; - } else { - nativeEditor.style.display = 'none'; - bodyEnBox.style.opacity = '0'; - bodyEnBox.style.display = 'block'; - revealedPanel = bodyEnBox; - - if (!enTmceReady) { - enTmceReady = true; - // Reinit while container is visible so TinyMCE can measure dimensions - reinitEditor(enEditorId); - } - } - - // Notify TinyMCE to reflow, then fade in once layout is correct - setTimeout(function() { - window.dispatchEvent(new Event('resize')); - requestAnimationFrame(function() { - requestAnimationFrame(function() { - revealedPanel.style.opacity = ''; - }); - }); - }, 50); - }); - }); - - // Ensure both editors start in Visual (not Code) mode - ensureVisualMode('content'); - ensureVisualMode(enEditorId); - } - - function groupAxesCheckboxes() { - if (!window.thalimAxesGroups || !thalimAxesGroups.length) return; - - var row = document.querySelector('.pods-form-ui-row-name-axes-thematiques'); - if (!row) return; - - var list = row.querySelector('ul'); - if (!list) return; - - // Already grouped — nothing to do - if (list.querySelector('.axes-group-label')) return; - - // Map existing

  • by checkbox value; preserve "add new" button - var liMap = {}; - var addNewItem = null; - list.querySelectorAll('li').forEach(function(li) { - if (li.classList.contains('pods-pick-add-new')) { addNewItem = li; return; } - var cb = li.querySelector('input[type="checkbox"]'); - if (cb) liMap[cb.value] = li; - }); - - // Rebuild list in group order - list.innerHTML = ''; - thalimAxesGroups.forEach(function(group) { - var labelLi = document.createElement('li'); - labelLi.className = 'axes-group-label'; - labelLi.textContent = group.label; - list.appendChild(labelLi); - group.terms.forEach(function(term) { - var li = liMap[String(term.id)]; - if (li) list.appendChild(li); - }); - }); - - if (addNewItem) list.appendChild(addNewItem); - } - - var REF_BIB_EDITOR_ID = 'pods-form-ui-pods-meta-reference-bibliographique'; - var refBibReinited = false; - - // Reinit the référence bibliographique TinyMCE editor. - // Called at page load (if the field is already visible) and by the - // MutationObserver (when the field becomes visible after a category change). - function initRefBibEditor() { - if (refBibReinited) return; - var row = document.querySelector('.pods-form-ui-row-name-reference-bibliographique'); - if (!row || row.style.display === 'none') return; - refBibReinited = true; - reinitEditor(REF_BIB_EDITOR_ID); - ensureVisualMode(REF_BIB_EDITOR_ID); - } - - function initAxesGroupObserver() { - // Pods shows/hides conditional rows by removing inline style="display:none" - // Watch the entire Pods meta form for style changes on the axes row - var podsForm = document.querySelector('.pods-pick-values, #pods-meta-champs-contextuels, form#post'); - if (!podsForm) podsForm = document.body; - - var observer = new MutationObserver(function(mutations) { - for (var i = 0; i < mutations.length; i++) { - var target = mutations[i].target; - if (target.classList && target.classList.contains('pods-form-ui-row-name-axes-thematiques')) { - if (target.style.display !== 'none') { - setTimeout(groupAxesCheckboxes, 50); - } - } - // Reinit TinyMCE on the référence bibliographique field when its - // row becomes visible — Pods hides it with display:none which breaks - // the TinyMCE iframe. Only reinit once per page load. - if (!refBibReinited && target.classList && - target.classList.contains('pods-form-ui-row-name-reference-bibliographique')) { - if (target.style.display !== 'none') { - setTimeout(initRefBibEditor, 100); - } - } - } - }); - - observer.observe(podsForm, { attributes: true, attributeFilter: ['style'], subtree: true }); - } - - function initPostEditPage() { - // Disable category options (CSS handles the color) - const categorieSelect = document.querySelector('#pods-form-ui-pods-meta-categorie'); - if (categorieSelect) { - const categoriesToDisable = ['1', '12', '5', '20']; - categorieSelect.querySelectorAll('option').forEach(option => { - if (categoriesToDisable.includes(option.value)) { - option.disabled = true; - } - }); - } - - // Reorder meta boxes - const sideSortables = document.querySelector('#side-sortables'); - if (sideSortables) { - const typeDannonce = document.querySelector('#pods-meta-type-dannonce'); - const affichageAccueil = document.querySelector('#pods-meta-affichage-sur-laccueil'); - const thematique = document.querySelector('#pods-meta-thematique'); - if (typeDannonce) sideSortables.prepend(typeDannonce); - if (affichageAccueil) sideSortables.appendChild(affichageAccueil); - if (thematique) sideSortables.appendChild(thematique); - } - - const submitDiv = document.querySelector('#submitdiv'); - if (submitDiv && submitDiv.parentNode) { - submitDiv.parentNode.appendChild(submitDiv); - } - - const champsContextuels = document.querySelector('#pods-meta-champs-contextuels'); - if (champsContextuels && champsContextuels.parentNode) { - champsContextuels.parentNode.prepend(champsContextuels); - } - - initBodyLanguageTabs(); - initRefBibEditor(); - groupAxesCheckboxes(); - initAxesGroupObserver(); - updatePostboxVisibility(); - initDatePickerPopoverFix(); - initInfoPopovers(); - - // Place #pods-meta-documents-joints in #normal-sortables, right after - // #pods-meta-champs-contextuels. This keeps it out of #post-body-content - // (the body editor section) regardless of whether champsContextuels is - // currently visible. When champsContextuels is hidden it takes no space, - // so documentsJoints simply appears first in #normal-sortables. - const documentsJoints = document.querySelector('#pods-meta-documents-joints'); - if (documentsJoints) { - if (champsContextuels && champsContextuels.parentNode) { - champsContextuels.parentNode.insertBefore(documentsJoints, champsContextuels.nextSibling); - } else { - const normalSortables = document.querySelector('#normal-sortables'); - if (normalSortables) normalSortables.prepend(documentsJoints); - } - } - - // Inject separator row for the Membres grid layout - var membresTbody = document.querySelector('#pods-meta-membres .form-table tbody'); - if (membresTbody && !membresTbody.querySelector('.membres-grid-separator')) { - var sep = document.createElement('tr'); - sep.className = 'membres-grid-separator'; - membresTbody.appendChild(sep); - } - updateMembresGridSeparator(); - } - - var INFO_ICON = ''; - var TRANSLATE_ICON = ''; - - var TRANSLATE_LINES = [ - 'Traduction en anglais apr\u00e8s //', - 'ex\u00a0: Texte en fran\u00e7ais // English text' - ]; - - // Tips without a `page` key default to 'post'. - // type: 'translate' uses the globe icon + green button style. - var INFO_TIPS = [ - // --- post edit page: info --- - { - selector: '.wp-heading-inline', - lines: [ - 'Saisir le titre anglais apr\u00e8s //', - 'ex\u00a0: Titre de l\u2019annonce // Title of the announcement' - ] - }, - { - selector: '#pods-meta-documents-joints .postbox-header h2', - lines: [ - 'Ajouter les images dans les documents.', - 'Ajouter les l\u00e9gendes comme titre du document.' - ] - }, - { - selector: '#pods-meta-membres .postbox-header h2', - lines: [ - 'Le champ fonction change le libell\u00e9 de la liste de personnes cit\u00e9es.', - 'Le champ membre permet de lister les membres de Thalim li\u00e9s \u00e0 l\u2019annonce.', - 'Le champ autre personnes permet de lister des personnes ext\u00e9rieures \u00e0 Thalim.' - ] - }, - { - selector: '#pods-meta-dates .postbox-header h2', - lines: [ - 'Pour entrer une date sans l\u2019heure, r\u00e9gler l\u2019heure sur 00\u202f:00.' - ] - }, - { - selector: '#pods-meta-affichage-sur-laccueil .postbox-header h2', - lines: [ - '\u00c9pingler l\u2019annonce dans le diaporama la fait s\u2019afficher avant les autres.' - ] - }, - { - selector: '#pods-meta-medias .postbox-header h2', - lines: [ - 'Pour ajouter un m\u00e9dia Canal\u00a0U, copier le lien depuis \u00ab\u00a0Citer cette ressource\u00a0\u00bb.', - 'ex\u00a0: https://www.canal-u.tv/166564' - ] - }, - // --- post edit page: translate --- - { type: 'translate', selector: '#pods-meta-documents-joints .postbox-header h2', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-sous-titre th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-lieu th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-titre-du-lien-externe-1 th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-titre-du-lien-externe-2 th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-titre-du-lien-externe-3 th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-fonction-organisation th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-fonction-intervention th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-fonction-candidat th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-fonction-realisation th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-fonction-dirige th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-fonction-redaction th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-fonction-auteur th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-fonction-responsable th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-autre-fonction-autre th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-autre-fonction-concerne th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-autre-fonction-directeur th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-autre-fonction-direction-d-ouvrage th',lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-autre-fonction-intervenant th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-autre-fonction-participants th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-type-autre th', lines: TRANSLATE_LINES }, - // --- contenu_general edit page: translate --- - { type: 'translate', selector: '.pods-form-ui-row-name-umr th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-thalim th', lines: TRANSLATE_LINES }, - { type: 'translate', selector: '.pods-form-ui-row-name-siecles th', lines: TRANSLATE_LINES }, - // --- user/profile edit page: translate --- - { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-titre-du-lien-1 th', lines: TRANSLATE_LINES }, - { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-titre-du-lien-2 th', lines: TRANSLATE_LINES }, - { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-titre-du-lien-3 th', lines: TRANSLATE_LINES }, - { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-titre-du-lien-4 th', lines: TRANSLATE_LINES }, - { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-complement-de-role-1 th', lines: TRANSLATE_LINES }, - { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-complement-de-role-2 th', lines: TRANSLATE_LINES }, - { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-complement-de-role-3 th', lines: TRANSLATE_LINES }, - { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-affichage-du-statut-1 th', lines: TRANSLATE_LINES }, - { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-affichage-du-statut-2 th', lines: TRANSLATE_LINES }, - { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-affichage-du-statut-3 th', lines: TRANSLATE_LINES }, - { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-affiliation-autre th', lines: TRANSLATE_LINES }, - { type: 'translate', page: 'user', selector: '.pods-form-ui-row-name-titre-de-these th', lines: TRANSLATE_LINES }, - // --- taxonomy edit pages: translate --- - { type: 'translate', page: 'taxonomy', selector: 'label[for="name"]', lines: TRANSLATE_LINES }, - // --- user/profile edit page: info --- - { - page: 'user', - selector: '.pods-form-ui-label-pods-meta-identifiant-hal', - lines: [ - 'Renseigner votre idHAL (en lettres), pas votre PersonId (en chiffres).' - ] - }, - { - page: 'user', - selector: '.pods-form-ui-label-pods-meta-affichage-du-statut-1', - lines: [ - 'Texte de statut affiché sur le profil publique.' - ] - } - ]; - - var _popoverCloseHandlerRegistered = false; - - function initInfoPopovers(currentPage) { - currentPage = currentPage || 'post'; - - INFO_TIPS.forEach(function(tip) { - if ((tip.page || 'post') !== currentPage) return; - - var el = document.querySelector(tip.selector); - if (!el) return; - - var isTranslate = tip.type === 'translate'; - - var btn = document.createElement('button'); - btn.type = 'button'; - btn.className = isTranslate ? 'thalim-translate-btn' : 'thalim-info-btn'; - btn.setAttribute('aria-label', isTranslate ? 'Traduction bilingue' : 'Informations'); - btn.innerHTML = isTranslate ? TRANSLATE_ICON : INFO_ICON; - - var popover = document.createElement('div'); - popover.className = 'thalim-info-popover' + (isTranslate ? ' thalim-translate-popover' : ''); - popover.innerHTML = tip.lines.map(function(line) { - return '

    ' + line + '

    '; - }).join(''); - - var wrapper = document.createElement('span'); - wrapper.className = 'thalim-info-wrapper'; - wrapper.appendChild(btn); - wrapper.appendChild(popover); - - el.appendChild(wrapper); - - btn.addEventListener('click', function(e) { - e.stopPropagation(); - var isOpen = popover.classList.contains('is-open'); - document.querySelectorAll('.thalim-info-popover.is-open').forEach(function(p) { - p.classList.remove('is-open'); - }); - if (!isOpen) { - var rect = btn.getBoundingClientRect(); - popover.style.top = (rect.bottom + 6) + 'px'; - popover.style.left = (rect.left + rect.width / 2) + 'px'; - popover.classList.add('is-open'); - } - }); - - popover.addEventListener('click', function(e) { - e.stopPropagation(); - }); - }); - - if (!_popoverCloseHandlerRegistered) { - _popoverCloseHandlerRegistered = true; - document.addEventListener('click', function() { - document.querySelectorAll('.thalim-info-popover.is-open').forEach(function(p) { - p.classList.remove('is-open'); - }); - }); - } - } - - // Only native WP field sections — never touch Pods tables (they may contain TinyMCE editors) - var PROFILE_SECTION_KEYS = [ - 'user-language-wrap', - 'user-first-name-wrap', - 'user-email-wrap', - 'user-pass1-wrap', - 'upload-avatar-row', - ]; - - // Desired order. Groups of 2 are wrapped in a flex row and displayed side by side. - var PROFILE_ORDER = [ - ['user-first-name-wrap', 'upload-avatar-row'], - ['user-email-wrap'], - ['user-language-wrap', 'user-pass1-wrap'], - ]; - - function reorderProfileSections() { - var form = getProfileForm(); - if (!form) return; - - var pairMap = {}; - - form.querySelectorAll('table.form-table').forEach(function(table) { - PROFILE_SECTION_KEYS.forEach(function(key) { - if (pairMap[key] || !table.querySelector('.' + key)) return; - - // Find the associated heading: first try preceding sibling in same parent, - // then look for an h2/h3 inside the same wrapper element. - var h2 = null; - var el = table.previousElementSibling; - while (el) { - if (el.tagName === 'H2' || el.tagName === 'H3') { h2 = el; break; } - if (el.tagName === 'TABLE') break; - el = el.previousElementSibling; - } - if (!h2 && table.parentElement !== form) { - h2 = table.parentElement.querySelector('h2, h3'); - } - - // The unit to move: if h2 and table share a non-form wrapper, move the wrapper. - var wrapper = null; - if (h2 && h2.parentElement !== form && h2.parentElement === table.parentElement) { - wrapper = h2.parentElement; - } - - pairMap[key] = { h2: h2, table: table, wrapper: wrapper }; - }); - }); - - // Remove all matched units from DOM (dedup by actual element) - var removed = new Set(); - function removeEl(el) { - if (el && !removed.has(el)) { removed.add(el); el.remove(); } - } - Object.values(pairMap).forEach(function(unit) { - if (unit.wrapper) { removeEl(unit.wrapper); } - else { removeEl(unit.h2); removeEl(unit.table); } - }); - - // Re-insert in declared order before the submit button - var submitAnchor = form.querySelector('p.submit'); - function append(el) { - if (submitAnchor && submitAnchor.parentNode) form.insertBefore(el, submitAnchor); - else form.appendChild(el); - } - function appendUnit(unit) { - if (unit.wrapper) { append(unit.wrapper); } - else { if (unit.h2) append(unit.h2); append(unit.table); } - } - - PROFILE_ORDER.forEach(function(group) { - var available = group.filter(function(key) { return !!pairMap[key]; }); - if (!available.length) return; - - // Dedup: two keys may resolve to the same table/wrapper - var seen = new Set(); - var units = []; - available.forEach(function(key) { - var unit = pairMap[key]; - var id = unit.wrapper || unit.table; - if (!seen.has(id)) { seen.add(id); units.push(unit); } - }); - - if (units.length === 1) { - appendUnit(units[0]); - } else { - var row = document.createElement('div'); - row.className = 'profile-section-row'; - units.forEach(function(unit) { - var col = document.createElement('div'); - col.className = 'profile-section-col'; - if (unit.wrapper) { col.appendChild(unit.wrapper); } - else { if (unit.h2) col.appendChild(unit.h2); col.appendChild(unit.table); } - row.appendChild(col); - }); - append(row); - } - }); - } - - function initProfileEditors() { - reorderProfileSections(); - initInfoPopovers('user'); - - // Hide the "À propos du compte" section heading - document.querySelectorAll('#your-profile h2, #adduser h2, #createuser h2').forEach(function(h2) { - if (h2.textContent.trim() === '\u00c0 propos du compte') { - h2.style.display = 'none'; - } - }); - - // Rename "Rôle" label to "Rôle sur le site" - var roleLabel = document.querySelector('label[for="role"]'); - if (roleLabel && roleLabel.textContent.trim() === 'R\u00f4le') { - roleLabel.textContent = 'R\u00f4le sur le site'; - } - } - - // Gutenberg's Popover component closes on outside click via focusout detection. - // But if focus never enters the popover, focusout never fires and clicking outside - // does nothing. Fix: focus the popover container as soon as it appears in the DOM. - function initDatePickerPopoverFix() { - var observer = new MutationObserver(function(mutations) { - for (var i = 0; i < mutations.length; i++) { - var added = mutations[i].addedNodes; - for (var j = 0; j < added.length; j++) { - var node = added[j]; - if (node.nodeType !== 1) continue; - var content = node.classList.contains('components-popover__content') - ? node - : node.querySelector && node.querySelector('.components-popover__content'); - if (content) { - var c = content; - requestAnimationFrame(function() { - if (!c.hasAttribute('tabindex')) c.setAttribute('tabindex', '-1'); - c.focus(); - }); - } - } - } - }); - observer.observe(document.body, { childList: true, subtree: true }); - } - - function updateMembresGridSeparator() { - var sep = document.querySelector('#pods-meta-membres .membres-grid-separator'); - if (!sep) return; - var autreRows = document.querySelectorAll('#pods-meta-membres [class*="pods-form-ui-row-name-autre-"]'); - var anyVisible = Array.from(autreRows).some(function(row) { - return row.style.display !== 'none'; - }); - sep.style.display = anyVisible ? '' : 'none'; - } - - // Inject a "Type de programme" filter select into the taxonomy search form. - // The form already has hidden taxonomy/post_type fields so the select value - // is submitted with them and picked up by pre_get_terms server-side. - function initProgrammeFilter() { - var form = document.querySelector('form.search-form'); - if (!form) return; - - var types = [ - 'Programme subventionné', - 'Autre programme', - 'Ancien programme' - ]; - - // Read current filter value from the URL. - var params = new URLSearchParams(window.location.search); - var current = params.get('type_de_programme') || ''; - - var select = document.createElement('select'); - select.name = 'type_de_programme'; - select.id = 'filter-type-de-programme'; - select.style.cssText = 'margin-right:6px;'; - - var blank = document.createElement('option'); - blank.value = ''; - blank.textContent = 'Tous les types'; - select.appendChild(blank); - - types.forEach(function(type) { - var opt = document.createElement('option'); - opt.value = type; - opt.textContent = type; - if (type === current) opt.selected = true; - select.appendChild(opt); - }); - - // Insert before the first

    (search-box) inside the form. - var searchBox = form.querySelector('p.search-box'); - form.insertBefore(select, searchBox || null); - } - - $(document).ready(function() { - renameArticlesToAnnonces(); - - if (isPostEditPage()) { - setupBodyTabsDom(); - } - - setTimeout(() => { - if (isPostEditPage()) { - initPostEditPage(); - } - if (isProfileEditPage()) { - initProfileEditors(); - } - var TRANSLATE_TAXONOMIES = ['axe_thematique', 'programme_de_recherche', 'post_tag']; - var isTaxonomyListPage = TRANSLATE_TAXONOMIES.some(function(tax) { - return window.location.search.indexOf('taxonomy=' + tax) !== -1; - }); - if (isTaxonomyListPage) { - initInfoPopovers('taxonomy'); - } - if (window.location.search.indexOf('taxonomy=programme_de_recherche') !== -1) { - initProgrammeFilter(); - } - document.body.classList.add('admin-mods-ready'); - }, 100); - - // Fallback: force reveal after 2s in case the 100ms path failed (e.g. JS error mid-init) - setTimeout(() => { - document.body.classList.add('admin-mods-ready'); - }, 2000); - - $('#pods-form-ui-pods-meta-categorie').change(function() { - setTimeout(function() { - updatePostboxVisibility(); - updateMembresGridSeparator(); - }, 10); - }); - - if (isProfileEditPage() || window.pagenow === 'edit-tags' || window.pagenow === 'term') { - $(window).on('load', function() { - var scope = getProfileForm() || document; - scope.querySelectorAll('.pods-dfv-container-wysiwyg textarea').forEach(function(ta) { - if (!ta.id) return; - ensureVisualMode(ta.id); - }); - }); - } - - if (isPodsModal()) { - var lockSeanceCategory = function() { - var itemId = $('#post_ID').val(); - if (window.PodsDFV && itemId) { - window.PodsDFV.setFieldValue('post', itemId, 'categorie', '12', 0); - } - - // Lock category select to 12 in iframe — delay to run after Pods React re-render - setTimeout(function() { - var $select = $('#pods-form-ui-pods-meta-categorie'); - if ($select.length) { - $select.find('option').each(function() { - this.disabled = this.value !== '12'; - }); - $select.val('12'); - } - updatePostboxVisibility(); - }, 200); - }; - - // Dans l'iframe de la modale, window.load peut déjà être passé au moment - // où ce code s'exécute : s'abonner à un load déjà émis ne rejoue rien. - // On exécute donc tout de suite si la page est déjà chargée. - if (document.readyState === 'complete') { - lockSeanceCategory(); - } else { - $(window).on('load', lockSeanceCategory); - } - } - }); - -})(jQuery); diff --git a/js/adminFormRestore.js b/js/adminFormRestore.js deleted file mode 100644 index ece0ae9..0000000 --- a/js/adminFormRestore.js +++ /dev/null @@ -1,119 +0,0 @@ -(function($) { - 'use strict'; - - var STORAGE_PREFIX = 'thalim_form_restore_'; - var MAX_AGE_MS = 10 * 60 * 1000; // 10 min - - function getPostId() { - return $('#post_ID').val() || 'new'; - } - - function getStorageKey() { - return STORAGE_PREFIX + getPostId(); - } - - function saveFormData() { - var data = { timestamp: Date.now() }; - - var $title = $('#title'); - if ($title.length) data.title = $title.val(); - - var $content = $('#content'); - if ($content.length) { - if (typeof tinyMCE !== 'undefined' && tinyMCE.get('content')) { - data.content = tinyMCE.get('content').getContent(); - } else { - data.content = $content.val(); - } - } - - $('[name^="pods_meta_"]').each(function() { - data[this.name] = $(this).val(); - }); - - try { - sessionStorage.setItem(getStorageKey(), JSON.stringify(data)); - } catch (e) {} - } - - function restoreFormData() { - var navEntries = performance.getEntriesByType('navigation'); - if (!navEntries.length || navEntries[0].type !== 'back_forward') return; - - var key = getStorageKey(); - var stored, data; - try { - stored = sessionStorage.getItem(key); - if (!stored) return; - data = JSON.parse(stored); - } catch (e) { return; } - - if (!data.timestamp || Date.now() - data.timestamp > MAX_AGE_MS) { - try { sessionStorage.removeItem(key); } catch (e) {} - return; - } - - // Restaurer titre - if (data.title !== undefined) $('#title').val(data.title); - - // Restaurer contenu (TinyMCE ou textarea brut) - if (data.content !== undefined) { - $('#content').val(data.content); - if (typeof tinyMCE !== 'undefined') { - var ed = tinyMCE.get('content'); - if (ed) { - ed.setContent(data.content); - } else { - tinyMCE.on('AddEditor', function(e) { - if (e.editor.id === 'content') { - e.editor.on('init', function() { - e.editor.setContent(data.content); - }); - } - }); - } - } - } - - // Restaurer champs Pods après rendu React - var restorePods = function() { - setTimeout(function() { - var postId = getPostId(); - Object.keys(data).forEach(function(name) { - if (!name.startsWith('pods_meta_')) return; - var fieldName = name.replace(/^pods_meta_/, ''); - var value = data[name]; - var $el = $('[name="' + name + '"]'); - if ($el.length) $el.val(value).trigger('change'); - if (window.PodsDFV && postId) { - try { window.PodsDFV.setFieldValue('post', postId, fieldName, value, 0); } catch (e) {} - } - }); - }, 300); - }; - - if (document.readyState === 'complete') { - restorePods(); - } else { - $(window).on('load', restorePods); - } - - // Notice informative - var $notice = $('

    Votre contenu a \u00e9t\u00e9 restaur\u00e9 suite \u00e0 une erreur de validation. V\u00e9rifiez les champs obligatoires avant de publier.

    '); - $('#wpbody-content').find('.wrap').first().find('h1').after($notice); - } - - $(document).ready(function() { - if (window.pagenow !== 'post' && window.pagenow !== 'post-new') return; - - // Nettoyage si sauvegarde réussie - if ($('.notice-success, #message.updated').length) { - try { sessionStorage.removeItem(getStorageKey()); } catch (e) {} - return; - } - - $('#post').on('submit', saveFormData); - restoreFormData(); - }); - -})(jQuery); diff --git a/js/membresFilters.js b/js/membresFilters.js index 93b0d3c..ed49358 100644 --- a/js/membresFilters.js +++ b/js/membresFilters.js @@ -1,4 +1,15 @@ document.addEventListener('DOMContentLoaded', function () { + // ── Row navigation (replaces inline onclick) ────────────── + // Delegated listener: rows carry their target in data-url. + document.querySelectorAll('.membres-table tbody').forEach(function (tbody) { + tbody.addEventListener('click', function (e) { + var row = e.target.closest('tr[data-url]'); + if (row && row.dataset.url) { + window.location.href = row.dataset.url; + } + }); + }); + // ── Filters toggle ──────────────────────────────────────── var membresToggleBtn = document.getElementById('membres-filters-toggle'); var membresFiltersEl = document.getElementById('membres-filters'); diff --git a/page-annonces.php b/page-annonces.php index 419af66..bcd5093 100644 --- a/page-annonces.php +++ b/page-annonces.php @@ -1,15 +1,16 @@ parent) - ? $active_cat_obj->parent - : $active_cat_id; -} +$active_rubrique_id = thalim_archive_active_rubrique($active_cat_id); $context['active_rubrique'] = $active_rubrique_id; // Base filter params preserved across all filter links @@ -76,7 +71,6 @@ $query_args = [ 'posts_per_page' => 12, 'orderby' => 'date', 'order' => 'DESC', - 'lang' => '', 'tax_query' => $tax_query, 'thalim_event_date_order' => true, ]; @@ -100,61 +94,20 @@ $context['filter_axes'] = $current_axes; $page_url = get_permalink(); $all_cats = get_categories(['taxonomy' => 'category', 'hide_empty' => false, 'exclude' => $excluded_cat_ids]); -$filter_parents = []; -foreach ($all_cats as $cat) { - if ($cat->parent == 0) { - $filter_parents[] = [ - 'id' => $cat->term_id, - 'name' => thalim_cat_name($cat), - 'slug' => $cat->slug, - 'link' => $base_filter_params - ? add_query_arg($base_filter_params, get_category_link($cat->term_id)) - : get_category_link($cat->term_id), - ]; - } -} -$context['filter_parents'] = $filter_parents; +// Liens de filtre : navigation vers la page de catégorie, en conservant axe/dates +$make_cat_link = function ($cat) use ($base_filter_params) { + return $base_filter_params + ? add_query_arg($base_filter_params, get_category_link($cat->term_id)) + : get_category_link($cat->term_id); +}; +$context['filter_parents'] = thalim_archive_filter_parents($all_cats, $make_cat_link); + +$filter_categories = thalim_archive_filter_children($all_cats, $active_rubrique_id, $make_cat_link); -$filter_categories = []; -if ($active_rubrique_id) { - foreach ($all_cats as $cat) { - if ($cat->parent == $active_rubrique_id) { - $filter_categories[] = [ - 'id' => $cat->term_id, - 'name' => thalim_cat_name($cat), - 'slug' => $cat->slug, - 'link' => $base_filter_params - ? add_query_arg($base_filter_params, get_category_link($cat->term_id)) - : get_category_link($cat->term_id), - ]; - } - } -} // Add "Autres" entry if active rubrique has posts directly assigned to it -if ($active_rubrique_id && !empty($filter_categories)) { - $lang = thalim_current_language(); - $direct_check = new WP_Query([ - 'post_type' => 'post', - 'posts_per_page' => 1, - 'fields' => 'ids', - 'no_found_rows' => true, - 'lang' => '', - 'tax_query' => [[ - 'taxonomy' => 'category', - 'field' => 'term_id', - 'terms' => [$active_rubrique_id], - 'include_children' => false, - ]], - ]); - if ($direct_check->have_posts()) { - $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $active_rubrique_id, 'filter_autres' => 1])); - $filter_categories[] = [ - 'id' => 'autres', - 'name' => $lang === 'en' ? 'Other' : 'Autres', - 'slug' => 'autres', - 'link' => add_query_arg($params, $page_url), - ]; - } +if ($active_rubrique_id && !empty($filter_categories) && thalim_rubrique_has_direct_posts($active_rubrique_id)) { + $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $active_rubrique_id, 'filter_autres' => 1])); + $filter_categories[] = thalim_archive_autres_entry(add_query_arg($params, $page_url)); } $context['filter_categories'] = $filter_categories; diff --git a/page-le-laboratoire.php b/page-le-laboratoire.php index f04723e..22105e2 100644 --- a/page-le-laboratoire.php +++ b/page-le-laboratoire.php @@ -91,18 +91,19 @@ unset( $group ); $context['axes_groups'] = array_values( $axes_map ); // ── Body (English override) ────────────────────────────────── -$context['body_en'] = apply_filters( 'the_content', get_post_meta( $page_id, 'body_en', true ) ?: '' ); +$context['body_en'] = apply_filters( 'the_content', wp_kses_post( get_post_meta( $page_id, 'body_en', true ) ?: '' ) ); // ── WYSIWYG fields ──────────────────────────────────────────── -$context['partenaires_internationaux'] = wpautop( ( $labo_lang === 'en' && get_post_meta( $page_id, 'partenaires_internationaux_en', true ) ) +// wp_kses_post: rendus en |raw dans le template (autoescape off) +$context['partenaires_internationaux'] = wpautop( wp_kses_post( ( $labo_lang === 'en' && get_post_meta( $page_id, 'partenaires_internationaux_en', true ) ) ? get_post_meta( $page_id, 'partenaires_internationaux_en', true ) - : ( get_post_meta( $page_id, 'partenaires_internationaux', true ) ?: '' ) ); -$context['partenaires_nationaux'] = wpautop( ( $labo_lang === 'en' && get_post_meta( $page_id, 'partenaires_nationaux_en', true ) ) + : ( get_post_meta( $page_id, 'partenaires_internationaux', true ) ?: '' ) ) ); +$context['partenaires_nationaux'] = wpautop( wp_kses_post( ( $labo_lang === 'en' && get_post_meta( $page_id, 'partenaires_nationaux_en', true ) ) ? get_post_meta( $page_id, 'partenaires_nationaux_en', true ) - : ( get_post_meta( $page_id, 'partenaires_nationaux', true ) ?: '' ) ); -$context['bibliotheques'] = wpautop( ( $labo_lang === 'en' && get_post_meta( $page_id, 'bibliotheques_en', true ) ) + : ( get_post_meta( $page_id, 'partenaires_nationaux', true ) ?: '' ) ) ); +$context['bibliotheques'] = wpautop( wp_kses_post( ( $labo_lang === 'en' && get_post_meta( $page_id, 'bibliotheques_en', true ) ) ? get_post_meta( $page_id, 'bibliotheques_en', true ) - : ( get_post_meta( $page_id, 'bibliotheques', true ) ?: '' ) ); + : ( get_post_meta( $page_id, 'bibliotheques', true ) ?: '' ) ) ); // ── Edit link ───────────────────────────────────────────────── $context['page_edit_link'] = current_user_can( 'edit_page', $page_id ) ? get_edit_post_link( $page_id ) : ''; diff --git a/page-programmes-de-recherche.php b/page-programmes-de-recherche.php index b581081..a950af5 100644 --- a/page-programmes-de-recherche.php +++ b/page-programmes-de-recherche.php @@ -16,7 +16,7 @@ foreach ( $terms as $term ) { $item = [ 'name' => $term->name, - 'description' => wpautop( $term->description ), + 'description' => wpautop( wp_kses_post( $term->description ) ), 'url' => get_term_link( $term ), 'annee_fin' => (int) get_term_meta( $term->term_id, 'annee_fin', true ), ]; diff --git a/phpcs.xml.dist b/phpcs.xml.dist new file mode 100644 index 0000000..fe37bc6 --- /dev/null +++ b/phpcs.xml.dist @@ -0,0 +1,26 @@ + + + WordPress Coding Standards pour le thème THALIM. + + + + . + vendor/* + node_modules/* + assets/vendor/* + + + + + + + + + + + + + diff --git a/search.php b/search.php index a772475..2fb5b6c 100644 --- a/search.php +++ b/search.php @@ -1,18 +1,18 @@ parent) - ? $active_cat_obj->parent - : $active_cat_id; -} +$active_rubrique_id = thalim_archive_active_rubrique($active_cat_id); $context['active_rubrique'] = $active_rubrique_id; // Base URL for search filter links (language-aware) @@ -72,7 +66,6 @@ $query_args = [ 'posts_per_page' => 12, 'orderby' => 'relevance', 'order' => 'DESC', - 'lang' => '', 'tax_query' => $tax_query, ]; if ($active_axe) { @@ -98,59 +91,19 @@ $context['axe_stay_on_page'] = true; // Rubrique/catégorie filter links (all preserve search term) $all_cats = get_categories(['taxonomy' => 'category', 'hide_empty' => false, 'exclude' => $excluded_cat_ids]); -$filter_parents = []; -foreach ($all_cats as $cat) { - if ($cat->parent == 0) { - $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $cat->term_id])); - $filter_parents[] = [ - 'id' => $cat->term_id, - 'name' => thalim_cat_name($cat), - 'slug' => $cat->slug, - 'link' => add_query_arg($params, $search_base), - ]; - } -} -$context['filter_parents'] = $filter_parents; +// Liens de filtre : on reste sur la recherche avec un paramètre filter_cat +$make_filter_link = function ($cat) use ($base_filter_params, $search_base) { + $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $cat->term_id])); + return add_query_arg($params, $search_base); +}; +$context['filter_parents'] = thalim_archive_filter_parents($all_cats, $make_filter_link); + +$filter_categories = thalim_archive_filter_children($all_cats, $active_rubrique_id, $make_filter_link); -$filter_categories = []; -if ($active_rubrique_id) { - foreach ($all_cats as $cat) { - if ($cat->parent == $active_rubrique_id) { - $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $cat->term_id])); - $filter_categories[] = [ - 'id' => $cat->term_id, - 'name' => thalim_cat_name($cat), - 'slug' => $cat->slug, - 'link' => add_query_arg($params, $search_base), - ]; - } - } -} // Add "Autres" entry if active rubrique has posts directly assigned to it -if ($active_rubrique_id && !empty($filter_categories)) { - $lang = thalim_current_language(); - $direct_check = new WP_Query([ - 'post_type' => 'post', - 'posts_per_page' => 1, - 'fields' => 'ids', - 'no_found_rows' => true, - 'lang' => '', - 'tax_query' => [[ - 'taxonomy' => 'category', - 'field' => 'term_id', - 'terms' => [$active_rubrique_id], - 'include_children' => false, - ]], - ]); - if ($direct_check->have_posts()) { - $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $active_rubrique_id, 'filter_autres' => 1])); - $filter_categories[] = [ - 'id' => 'autres', - 'name' => $lang === 'en' ? 'Other' : 'Autres', - 'slug' => 'autres', - 'link' => add_query_arg($params, $search_base), - ]; - } +if ($active_rubrique_id && !empty($filter_categories) && thalim_rubrique_has_direct_posts($active_rubrique_id)) { + $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $active_rubrique_id, 'filter_autres' => 1])); + $filter_categories[] = thalim_archive_autres_entry(add_query_arg($params, $search_base)); } $context['filter_categories'] = $filter_categories; @@ -161,21 +114,24 @@ $context['posts'] = $posts; // Search users (members) by display_name $author_cards = []; if ( $search_query ) { - $excluded_role_ids = [ 600, 598 ]; // "À ranger", "Archive" - $user_query = new WP_User_Query([ + $excluded_role_ids = thalim_excluded_role_ids(); // « À ranger », « Archive » (résolus par slug) + $user_query_args = [ 'search' => '*' . $search_query . '*', 'search_columns' => ['display_name'], 'number' => 6, 'orderby' => 'display_name', 'order' => 'ASC', - 'meta_query' => [ + ]; + if ( $excluded_role_ids ) { + $user_query_args['meta_query'] = [ [ 'key' => 'role_1', 'value' => $excluded_role_ids, 'compare' => 'NOT IN', ], - ], - ]); + ]; + } + $user_query = new WP_User_Query( $user_query_args ); $lang = thalim_current_language(); // Direction IDs (same source as membres page and author page) diff --git a/taxonomy.php b/taxonomy.php index e6892e6..129ad42 100644 --- a/taxonomy.php +++ b/taxonomy.php @@ -10,15 +10,16 @@ $context['parent_slug'] = ''; $tax_object = get_taxonomy($taxonomy); $context['taxonomy_label'] = $tax_object ? $tax_object->labels->singular_name : $taxonomy; -$excluded_ids = [12, 31]; // Séance de séminaire, Non classé -if ( ! is_user_logged_in() ) $excluded_ids[] = 9; // Vie du labo +// Séance de séminaire, Non classé (+ Vie du labo pour les non-connectés) +$excluded_ids = thalim_archive_excluded_cat_ids(); // Read filter query params -$active_axe = isset($_GET['axe']) ? intval($_GET['axe']) : 0; -$active_date_from = isset($_GET['date_from']) ? sanitize_text_field($_GET['date_from']) : ''; -$active_date_to = isset($_GET['date_to']) ? sanitize_text_field($_GET['date_to']) : ''; -$active_cat_id = isset($_GET['filter_cat']) ? intval($_GET['filter_cat']) : 0; -$filter_autres = isset($_GET['filter_autres']) ? 1 : 0; +$f = thalim_archive_read_filters(); +$active_axe = $f['axe']; +$active_date_from = $f['date_from']; +$active_date_to = $f['date_to']; +$active_cat_id = $f['cat_id']; +$filter_autres = $f['filter_autres']; $context['active_axe'] = $active_axe; $context['active_date_from'] = $active_date_from; @@ -28,13 +29,7 @@ $context['active_cat_id'] = $active_cat_id; $context['filter_autres'] = $filter_autres; // Determine active rubrique from active category (parent if subcategory, itself if top-level) -$active_rubrique_id = 0; -if ($active_cat_id) { - $active_cat_obj = get_category($active_cat_id); - $active_rubrique_id = ($active_cat_obj && $active_cat_obj->parent) - ? $active_cat_obj->parent - : $active_cat_id; -} +$active_rubrique_id = thalim_archive_active_rubrique($active_cat_id); $context['active_rubrique'] = $active_rubrique_id; // Base params shared across all filter links (preserves active filters when navigating) @@ -53,11 +48,11 @@ $tax_query = [ 'field' => 'term_id', 'terms' => [$term->term_id], ], - // Exclure les séances de séminaire (catégorie 12) + // Exclure les séances de séminaire [ 'taxonomy' => 'category', 'field' => 'term_id', - 'terms' => [12], + 'terms' => [ thalim_cat_id('seance') ], 'operator' => 'NOT IN', ], ]; @@ -101,66 +96,28 @@ $context['axe_stay_on_page'] = !$axe_taxonomy_mode; $current_term_url = get_term_link($term); $all_cats = get_categories(['taxonomy' => 'category', 'hide_empty' => false, 'exclude' => $excluded_ids]); -$filter_parents = []; -foreach ($all_cats as $cat) { - if ($cat->parent == 0) { - $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $cat->term_id])); - $filter_parents[] = [ - 'id' => $cat->term_id, - 'name' => thalim_cat_name($cat), - 'slug' => $cat->slug, - 'link' => add_query_arg($params, $current_term_url), - ]; - } -} -$context['filter_parents'] = $filter_parents; +// Liens de filtre : on reste sur l'URL du terme courant avec un paramètre filter_cat +$make_filter_link = function ($cat) use ($base_filter_params, $current_term_url) { + $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $cat->term_id])); + return add_query_arg($params, $current_term_url); +}; +$context['filter_parents'] = thalim_archive_filter_parents($all_cats, $make_filter_link); + +$filter_categories = thalim_archive_filter_children($all_cats, $active_rubrique_id, $make_filter_link); -$filter_categories = []; -if ($active_rubrique_id) { - foreach ($all_cats as $cat) { - if ($cat->parent == $active_rubrique_id) { - $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $cat->term_id])); - $filter_categories[] = [ - 'id' => $cat->term_id, - 'name' => thalim_cat_name($cat), - 'slug' => $cat->slug, - 'link' => add_query_arg($params, $current_term_url), - ]; - } - } -} // Add "Autres" entry if active rubrique has posts directly assigned to it +// (contraints au terme de taxonomie courant) if ($active_rubrique_id && !empty($filter_categories)) { - $lang = thalim_current_language(); - $direct_check = new WP_Query([ - 'post_type' => 'post', - 'posts_per_page' => 1, - 'fields' => 'ids', - 'no_found_rows' => true, - 'lang' => '', - 'tax_query' => [ - 'relation' => 'AND', - [ - 'taxonomy' => $taxonomy, - 'field' => 'term_id', - 'terms' => [$term->term_id], - ], - [ - 'taxonomy' => 'category', - 'field' => 'term_id', - 'terms' => [$active_rubrique_id], - 'include_children' => false, - ], + $has_direct = thalim_rubrique_has_direct_posts($active_rubrique_id, [ + [ + 'taxonomy' => $taxonomy, + 'field' => 'term_id', + 'terms' => [$term->term_id], ], ]); - if ($direct_check->have_posts()) { + if ($has_direct) { $params = array_filter(array_merge($base_filter_params, ['filter_cat' => $active_rubrique_id, 'filter_autres' => 1])); - $filter_categories[] = [ - 'id' => 'autres', - 'name' => $lang === 'en' ? 'Other' : 'Autres', - 'slug' => 'autres', - 'link' => add_query_arg($params, $current_term_url), - ]; + $filter_categories[] = thalim_archive_autres_entry(add_query_arg($params, $current_term_url)); } } $context['filter_categories'] = $filter_categories; @@ -171,7 +128,6 @@ $posts = Timber::get_posts(array_merge([ 'posts_per_page' => 12, 'orderby' => 'date', 'order' => 'DESC', - 'lang' => '', 'thalim_event_date_order' => true, ], $extra_query_args)); $context['cards'] = thalim_get_cards_data($posts); @@ -181,6 +137,6 @@ $context['posts'] = $posts; $tax_lang = thalim_current_language(); $pres_fr = get_term_meta($term->term_id, 'presentation', true) ?: ''; $pres_en = get_term_meta($term->term_id, 'presentation_en', true) ?: ''; -$context['term_presentation'] = wpautop( ( $tax_lang === 'en' && $pres_en ) ? $pres_en : $pres_fr ); +$context['term_presentation'] = wpautop( wp_kses_post( ( $tax_lang === 'en' && $pres_en ) ? $pres_en : $pres_fr ) ); Timber::render('taxonomy.twig', $context); diff --git a/templates/author.twig b/templates/author.twig index a5ab085..7a450ad 100644 --- a/templates/author.twig +++ b/templates/author.twig @@ -22,13 +22,13 @@ {% if author.avatar_url %}
    - {{ author.display_name }} + {{ author.display_name|esc_attr }}
    -

    {{ author.display_name }}

    +

    {{ author.display_name|esc_html }}

    {% if author.role_label or author.role_complement or author.affiliation %}

    - {{ author.role_label }}{% if author.role_complement %} {{ author.role_complement }}{% if author.affiliation %},{% endif %}{% endif %}{% if author.affiliation %} {{ author.affiliation }}{% endif %} + {{ author.role_label|esc_html }}{% if author.role_complement %} {{ author.role_complement|esc_html }}{% if author.affiliation %},{% endif %}{% endif %}{% if author.affiliation %} {{ author.affiliation|esc_html }}{% endif %}

    {% endif %}

    {{ current_language == 'en' ? 'Updated on' : 'Mis à jour le' }} {{ author.user_since }}

    @@ -63,10 +63,10 @@ {% if not author.avatar_url %}
    -

    {{ author.display_name }}

    +

    {{ author.display_name|esc_html }}

    {% if author.role_label or author.role_complement or author.affiliation %}

    - {{ author.role_label }}{% if author.role_complement %} {{ author.role_complement }}{% if author.affiliation %},{% endif %}{% endif %}{% if author.affiliation %} {{ author.affiliation }}{% endif %} + {{ author.role_label|esc_html }}{% if author.role_complement %} {{ author.role_complement|esc_html }}{% if author.affiliation %},{% endif %}{% endif %}{% if author.affiliation %} {{ author.affiliation|esc_html }}{% endif %}

    {% endif %}

    {{ current_language == 'en' ? 'Updated on' : 'Mis à jour le' }} {{ author.user_since }}

    diff --git a/templates/page-membres.twig b/templates/page-membres.twig index 1a95561..ab05e56 100644 --- a/templates/page-membres.twig +++ b/templates/page-membres.twig @@ -42,7 +42,7 @@
    • {{ current_language == 'en' ? 'All statuses' : 'Tous les statuts' }}
    • {% for role in filter_roles %} -
    • {{ role.name }}
    • +
    • {{ role.name|esc_html }}
    • {% endfor %}
    @@ -81,18 +81,20 @@ {% for member in group.members %} - - {{ member.display_name }} - {{ member.status }} - {{ member.affiliation }} + {# data-url + listener délégué (membresFilters.js) au lieu d'un onclick inline ; + tout passe par esc_attr/esc_html : ces valeurs viennent des profils utilisateurs #} + + {{ member.display_name|esc_html }} + {{ member.status|esc_html }} + {{ member.affiliation|esc_html }} {% endfor %} diff --git a/templates/partials/agenda-card.twig b/templates/partials/agenda-card.twig index 9bd8bb3..5576f39 100644 --- a/templates/partials/agenda-card.twig +++ b/templates/partials/agenda-card.twig @@ -20,6 +20,6 @@ {% if type_label %}{{ type_label }}{% endif %} {% if lieu %}{{ lieu }}{% endif %}
    -

    {{ post.title }}

    +

    {{ post.title|bilingual }}

    diff --git a/templates/partials/author-card.twig b/templates/partials/author-card.twig index 072c6ce..d3060f5 100644 --- a/templates/partials/author-card.twig +++ b/templates/partials/author-card.twig @@ -1,18 +1,18 @@ diff --git a/templates/partials/post-card.twig b/templates/partials/post-card.twig index f163a83..fb2f492 100644 --- a/templates/partials/post-card.twig +++ b/templates/partials/post-card.twig @@ -40,77 +40,3 @@ {% endif %} -{# -
    - {% if card.card_image %} -
    - {{ post.title }} -
    - {% endif %} - -
    -

    - {{ post.title }} -

    - - {% if post.meta('sous-titre') %} -

    {{ post.meta('sous-titre') }}

    - {% endif %} - - - - {% if card.card_membres is not empty or post.meta('autrepersonnes') %} -
    - {% for name in card.card_membres %} - {{ name }} - {% endfor %} - {% if post.meta('autrepersonnes') %} - {{ post.meta('autrepersonnes') }} - {% endif %} -
    - {% endif %} - - {% if post.meta('fonction_auteur') %} - {{ post.meta('fonction_auteur') }} - {% endif %} - - {% if post.meta('editeur') %} - {{ post.meta('editeur') }} - {% endif %} - - {% if post.meta('journal') %} - {{ post.meta('journal') }} - {% endif %} - - {% if card.card_axes is not empty %} -
    - {% for axe in card.card_axes %} - {{ axe }} - {% endfor %} -
    - {% endif %} - - {% if card.card_etiquettes is not empty %} -
    - {% for tag in card.card_etiquettes %} - {{ tag }} - {% endfor %} -
    - {% endif %} - -
    - {% if post.meta('lien_externe_1') %} - - {{ post.meta('titre_du_lien_externe_1') ?: post.meta('lien_externe_1') }} - - {% endif %} - - {% if post.meta('hal_url') %} - - HAL - - {% endif %} -
    -
    -
    - #} \ No newline at end of file diff --git a/templates/single.twig b/templates/single.twig index c37fb8c..118f1da 100644 --- a/templates/single.twig +++ b/templates/single.twig @@ -13,9 +13,7 @@ {% if article.category_name and article.category_name != article.parent_name %} {{ article.category_name }} - {% endif %}{# - - {{ post.title }} #} + {% endif %} {% if post.edit_link %} diff --git a/tests/run-tests.php b/tests/run-tests.php new file mode 100644 index 0000000..6aadf86 --- /dev/null +++ b/tests/run-tests.php @@ -0,0 +1,100 @@ +name); +$en_meta = get_term_meta($articles->term_id, 'titre_anglais', true); +check('EN = titre_anglais ou fallback', thalim_cat_name($articles, 'en'), $en_meta ?: $articles->name); +check('valeur non-term', thalim_cat_name('Texte brut'), 'Texte brut'); + +echo "== thalim_format_date ==\n"; +check('date vide', thalim_format_date(''), ''); +check('0000-00-00', thalim_format_date('0000-00-00 00:00:00'), ''); +check('format Y', thalim_format_date('2026-03-15 00:00:00', 'fr', 'Y'), '2026'); +check('format Y-m-d', thalim_format_date('2026-03-15 10:30:00', 'fr', 'Y-m-d'), '2026-03-15'); + +echo "== config (résolution par slug) ==\n"; +check('cat seance', thalim_cat_id('seance'), 12); +check('cat non-classe', thalim_cat_id('non-classe'), 31); +check('cat vie-du-labo', thalim_cat_id('vie-du-labo'), 9); +check('cat publications', thalim_cat_id('publications'), 4); +check('cat message-labo', thalim_cat_id('message-labo'), 268); +check('clé inconnue', thalim_cat_id('nexiste-pas'), 0); +check('slug inexistant', thalim_term_id_by_slug('slug-bidon-xyz'), 0); +check('rôles exclus', thalim_excluded_role_ids(), [600, 598]); + +echo "== thalim_get_active_pinned_ids ==\n"; +check('catégorie 0 → []', thalim_get_active_pinned_ids(0), []); + +echo "== thalim_get_seance_parent_id ==\n"; +global $wpdb; +$seance_id = (int) $wpdb->get_var( + "SELECT tr.object_id FROM {$wpdb->term_relationships} tr + JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id = tr.term_taxonomy_id + JOIN {$wpdb->posts} p ON p.ID = tr.object_id + WHERE tt.term_id = 12 AND p.post_status = 'publish' LIMIT 1" +); +if ($seance_id) { + $parent = thalim_get_seance_parent_id($seance_id); + check('séance a un parent publié', $parent > 0, true); + check('lien = parent + ancre', thalim_get_seance_link($seance_id), get_permalink($parent) . '#seance-' . $seance_id); +} else { + echo " skip aucune séance publiée en base\n"; +} +check('séance inexistante → 0', thalim_get_seance_parent_id(999999999), 0); + +echo "\n$count tests, $failures échec(s)\n"; +exit($failures ? 1 : 0);