From 34e098c5512d993872c4e8888e520c23a64e15d1 Mon Sep 17 00:00:00 2001 From: Konstantin Date: Sun, 12 Apr 2026 18:35:16 +0700 Subject: [PATCH] first commit --- .env.example | 13 + .gitignore | 6 + .woodpecker.yaml | 50 + README.md | 52 + docker-compose.yml | 40 + docker/php/uploads.ini | 4 + package-lock.json | 1459 +++++++ package.json | 23 + postcss.config.cjs | 5 + sync.sh | 447 ++ wp-content/index.php | 2 + wp-content/mu-plugins/acf-options-pages.php | 22 + .../mu-plugins/local-dev-performance.php | 52 + wp-content/mu-plugins/remove-action.php | 129 + wp-content/plugins/README.md | 1 + wp-content/plugins/akismet/.htaccess | 34 + wp-content/plugins/akismet/LICENSE.txt | 339 ++ .../plugins/akismet/_inc/akismet-admin.css | 716 ++++ .../plugins/akismet/_inc/akismet-admin.js | 37 + .../plugins/akismet/_inc/akismet-frontend.js | 376 ++ wp-content/plugins/akismet/_inc/akismet.css | 462 ++ wp-content/plugins/akismet/_inc/akismet.js | 397 ++ .../plugins/akismet/_inc/fonts/inter.css | 67 + .../akismet-activation-banner-elements.png | Bin 0 -> 5767 bytes .../akismet/_inc/img/akismet-refresh-logo.svg | 1 + .../_inc/img/akismet-refresh-logo@2x.png | Bin 0 -> 2783 bytes .../plugins/akismet/_inc/img/arrow-left.svg | 1 + .../plugins/akismet/_inc/img/logo-a-2x.png | Bin 0 -> 904 bytes .../akismet/_inc/rtl/akismet-admin-rtl.css | 718 ++++ .../plugins/akismet/_inc/rtl/akismet-rtl.css | 464 ++ wp-content/plugins/akismet/akismet.php | 71 + wp-content/plugins/akismet/changelog.txt | 550 +++ .../class-akismet-compatible-plugins.php | 309 ++ .../plugins/akismet/class.akismet-admin.php | 1637 ++++++++ .../plugins/akismet/class.akismet-cli.php | 186 + .../akismet/class.akismet-rest-api.php | 616 +++ .../plugins/akismet/class.akismet-widget.php | 177 + wp-content/plugins/akismet/class.akismet.php | 2242 ++++++++++ wp-content/plugins/akismet/index.php | 4 + wp-content/plugins/akismet/readme.txt | 149 + wp-content/plugins/akismet/views/activate.php | 7 + .../akismet/views/compatible-plugins.php | 126 + wp-content/plugins/akismet/views/config.php | 325 ++ .../plugins/akismet/views/connect-jp.php | 14 + wp-content/plugins/akismet/views/enter.php | 14 + wp-content/plugins/akismet/views/get.php | 32 + wp-content/plugins/akismet/views/logo.php | 13 + wp-content/plugins/akismet/views/notice.php | 379 ++ .../plugins/akismet/views/predefined.php | 11 + .../plugins/akismet/views/setup-jetpack.php | 97 + wp-content/plugins/akismet/views/setup.php | 78 + wp-content/plugins/akismet/views/start.php | 26 + wp-content/plugins/akismet/views/stats.php | 12 + wp-content/plugins/akismet/wrapper.php | 215 + wp-content/plugins/hello.php | 106 + wp-content/plugins/index.php | 2 + wp-content/themes/index.php | 2 + wp-content/themes/xkater/404.php | 7 + wp-content/themes/xkater/acf-json/.gitkeep | 0 wp-content/themes/xkater/archive.php | 9 + wp-content/themes/xkater/assets/css/.gitkeep | 0 wp-content/themes/xkater/assets/css/main.css | 3732 +++++++++++++++++ .../themes/xkater/assets/css/main.css.map | 1 + .../themes/xkater/assets/fonts/AKONY.otf | Bin 0 -> 33688 bytes .../themes/xkater/assets/fonts/AKONY.ttf | Bin 0 -> 55936 bytes .../themes/xkater/assets/fonts/AKONY.woff | Bin 0 -> 22740 bytes .../themes/xkater/assets/fonts/AKONY.woff2 | Bin 0 -> 15704 bytes .../xkater/assets/fonts/AtypDisplay-Bold.eot | Bin 0 -> 317314 bytes .../xkater/assets/fonts/AtypDisplay-Bold.ttf | Bin 0 -> 317128 bytes .../xkater/assets/fonts/AtypDisplay-Bold.woff | Bin 0 -> 131656 bytes .../assets/fonts/AtypDisplay-Bold.woff2 | Bin 0 -> 88848 bytes .../assets/fonts/AtypDisplay-BoldItalic.eot | Bin 0 -> 323896 bytes .../assets/fonts/AtypDisplay-BoldItalic.ttf | Bin 0 -> 323668 bytes .../assets/fonts/AtypDisplay-BoldItalic.woff | Bin 0 -> 135028 bytes .../assets/fonts/AtypDisplay-BoldItalic.woff2 | Bin 0 -> 90836 bytes .../assets/fonts/AtypDisplay-Italic.eot | Bin 0 -> 320962 bytes .../assets/fonts/AtypDisplay-Italic.ttf | Bin 0 -> 320764 bytes .../assets/fonts/AtypDisplay-Italic.woff | Bin 0 -> 138672 bytes .../assets/fonts/AtypDisplay-Italic.woff2 | Bin 0 -> 93920 bytes .../xkater/assets/fonts/AtypDisplay-Light.eot | Bin 0 -> 307576 bytes .../xkater/assets/fonts/AtypDisplay-Light.ttf | Bin 0 -> 307384 bytes .../assets/fonts/AtypDisplay-Light.woff | Bin 0 -> 131616 bytes .../assets/fonts/AtypDisplay-Light.woff2 | Bin 0 -> 90140 bytes .../assets/fonts/AtypDisplay-LightItalic.eot | Bin 0 -> 314590 bytes .../assets/fonts/AtypDisplay-LightItalic.ttf | Bin 0 -> 314356 bytes .../assets/fonts/AtypDisplay-LightItalic.woff | Bin 0 -> 135844 bytes .../fonts/AtypDisplay-LightItalic.woff2 | Bin 0 -> 92148 bytes .../assets/fonts/AtypDisplay-Medium.eot | Bin 0 -> 312726 bytes .../assets/fonts/AtypDisplay-Medium.ttf | Bin 0 -> 312528 bytes .../assets/fonts/AtypDisplay-Medium.woff | Bin 0 -> 133344 bytes .../assets/fonts/AtypDisplay-Medium.woff2 | Bin 0 -> 91332 bytes .../assets/fonts/AtypDisplay-MediumItalic.eot | Bin 0 -> 319284 bytes .../assets/fonts/AtypDisplay-MediumItalic.ttf | Bin 0 -> 319044 bytes .../fonts/AtypDisplay-MediumItalic.woff | Bin 0 -> 138556 bytes .../fonts/AtypDisplay-MediumItalic.woff2 | Bin 0 -> 94448 bytes .../assets/fonts/AtypDisplay-Regular.eot | Bin 0 -> 313592 bytes .../assets/fonts/AtypDisplay-Regular.ttf | Bin 0 -> 313420 bytes .../assets/fonts/AtypDisplay-Regular.woff | Bin 0 -> 133852 bytes .../assets/fonts/AtypDisplay-Regular.woff2 | Bin 0 -> 91264 bytes .../assets/fonts/AtypDisplay-Semibold.eot | Bin 0 -> 314490 bytes .../assets/fonts/AtypDisplay-Semibold.ttf | Bin 0 -> 314280 bytes .../assets/fonts/AtypDisplay-Semibold.woff | Bin 0 -> 133700 bytes .../assets/fonts/AtypDisplay-Semibold.woff2 | Bin 0 -> 91760 bytes .../fonts/AtypDisplay-SemiboldItalic.eot | Bin 0 -> 319980 bytes .../fonts/AtypDisplay-SemiboldItalic.ttf | Bin 0 -> 319728 bytes .../fonts/AtypDisplay-SemiboldItalic.woff | Bin 0 -> 137472 bytes .../fonts/AtypDisplay-SemiboldItalic.woff2 | Bin 0 -> 93568 bytes .../xkater/assets/fonts/AtypDisplay-Thin.eot | Bin 0 -> 303758 bytes .../xkater/assets/fonts/AtypDisplay-Thin.ttf | Bin 0 -> 303572 bytes .../xkater/assets/fonts/AtypDisplay-Thin.woff | Bin 0 -> 125552 bytes .../assets/fonts/AtypDisplay-Thin.woff2 | Bin 0 -> 84832 bytes .../assets/fonts/AtypDisplay-ThinItalic.eot | Bin 0 -> 312160 bytes .../assets/fonts/AtypDisplay-ThinItalic.ttf | Bin 0 -> 311932 bytes .../assets/fonts/AtypDisplay-ThinItalic.woff | Bin 0 -> 130608 bytes .../assets/fonts/AtypDisplay-ThinItalic.woff2 | Bin 0 -> 87564 bytes .../assets/fonts/AtypRegularVariable.eot | Bin 0 -> 223416 bytes .../assets/fonts/AtypRegularVariable.ttf | Bin 0 -> 223240 bytes .../assets/fonts/AtypRegularVariable.woff | Bin 0 -> 94772 bytes .../assets/fonts/AtypRegularVariable.woff2 | Bin 0 -> 66872 bytes .../xkater/assets/fonts/AtypText-Bold.eot | Bin 0 -> 314586 bytes .../xkater/assets/fonts/AtypText-Bold.ttf | Bin 0 -> 314412 bytes .../xkater/assets/fonts/AtypText-Bold.woff | Bin 0 -> 130340 bytes .../xkater/assets/fonts/AtypText-Bold.woff2 | Bin 0 -> 87876 bytes .../assets/fonts/AtypText-BoldItalic.eot | Bin 0 -> 322448 bytes .../assets/fonts/AtypText-BoldItalic.ttf | Bin 0 -> 322232 bytes .../assets/fonts/AtypText-BoldItalic.woff | Bin 0 -> 134032 bytes .../assets/fonts/AtypText-BoldItalic.woff2 | Bin 0 -> 90100 bytes .../xkater/assets/fonts/AtypText-Italic.eot | Bin 0 -> 319794 bytes .../xkater/assets/fonts/AtypText-Italic.ttf | Bin 0 -> 319608 bytes .../xkater/assets/fonts/AtypText-Italic.woff | Bin 0 -> 138132 bytes .../xkater/assets/fonts/AtypText-Italic.woff2 | Bin 0 -> 93904 bytes .../xkater/assets/fonts/AtypText-Light.eot | Bin 0 -> 306572 bytes .../xkater/assets/fonts/AtypText-Light.ttf | Bin 0 -> 306392 bytes .../xkater/assets/fonts/AtypText-Light.woff | Bin 0 -> 130976 bytes .../xkater/assets/fonts/AtypText-Light.woff2 | Bin 0 -> 89500 bytes .../assets/fonts/AtypText-LightItalic.eot | Bin 0 -> 313894 bytes .../assets/fonts/AtypText-LightItalic.ttf | Bin 0 -> 313672 bytes .../assets/fonts/AtypText-LightItalic.woff | Bin 0 -> 135552 bytes .../assets/fonts/AtypText-LightItalic.woff2 | Bin 0 -> 91972 bytes .../xkater/assets/fonts/AtypText-Medium.eot | Bin 0 -> 313238 bytes .../xkater/assets/fonts/AtypText-Medium.ttf | Bin 0 -> 313052 bytes .../xkater/assets/fonts/AtypText-Medium.woff | Bin 0 -> 133592 bytes .../xkater/assets/fonts/AtypText-Medium.woff2 | Bin 0 -> 91084 bytes .../assets/fonts/AtypText-MediumItalic.eot | Bin 0 -> 318680 bytes .../assets/fonts/AtypText-MediumItalic.ttf | Bin 0 -> 318452 bytes .../assets/fonts/AtypText-MediumItalic.woff | Bin 0 -> 138216 bytes .../assets/fonts/AtypText-MediumItalic.woff2 | Bin 0 -> 93680 bytes .../xkater/assets/fonts/AtypText-Regular.eot | Bin 0 -> 312468 bytes .../xkater/assets/fonts/AtypText-Regular.ttf | Bin 0 -> 312308 bytes .../xkater/assets/fonts/AtypText-Regular.woff | Bin 0 -> 133476 bytes .../assets/fonts/AtypText-Regular.woff2 | Bin 0 -> 91152 bytes .../xkater/assets/fonts/AtypText-Semibold.eot | Bin 0 -> 313346 bytes .../xkater/assets/fonts/AtypText-Semibold.ttf | Bin 0 -> 313148 bytes .../assets/fonts/AtypText-Semibold.woff | Bin 0 -> 132804 bytes .../assets/fonts/AtypText-Semibold.woff2 | Bin 0 -> 90972 bytes .../assets/fonts/AtypText-SemiboldItalic.eot | Bin 0 -> 319296 bytes .../assets/fonts/AtypText-SemiboldItalic.ttf | Bin 0 -> 319056 bytes .../assets/fonts/AtypText-SemiboldItalic.woff | Bin 0 -> 137140 bytes .../fonts/AtypText-SemiboldItalic.woff2 | Bin 0 -> 93472 bytes .../xkater/assets/fonts/AtypText-Thin.eot | Bin 0 -> 302774 bytes .../xkater/assets/fonts/AtypText-Thin.ttf | Bin 0 -> 302600 bytes .../xkater/assets/fonts/AtypText-Thin.woff | Bin 0 -> 124940 bytes .../xkater/assets/fonts/AtypText-Thin.woff2 | Bin 0 -> 84472 bytes .../assets/fonts/AtypText-ThinItalic.eot | Bin 0 -> 311872 bytes .../assets/fonts/AtypText-ThinItalic.ttf | Bin 0 -> 311656 bytes .../assets/fonts/AtypText-ThinItalic.woff | Bin 0 -> 130336 bytes .../assets/fonts/AtypText-ThinItalic.woff2 | Bin 0 -> 87412 bytes .../xkater/assets/fonts/Stapel-Bold.eot | Bin 0 -> 183522 bytes .../xkater/assets/fonts/Stapel-Bold.ttf | Bin 0 -> 183360 bytes .../xkater/assets/fonts/Stapel-Bold.woff | Bin 0 -> 74960 bytes .../xkater/assets/fonts/Stapel-Bold.woff2 | Bin 0 -> 51340 bytes .../xkater/assets/fonts/Stapel-BoldItalic.eot | Bin 0 -> 181856 bytes .../xkater/assets/fonts/Stapel-BoldItalic.ttf | Bin 0 -> 181652 bytes .../assets/fonts/Stapel-BoldItalic.woff | Bin 0 -> 76172 bytes .../assets/fonts/Stapel-BoldItalic.woff2 | Bin 0 -> 51628 bytes .../assets/fonts/Stapel-ExpandedBlack.eot | Bin 0 -> 191358 bytes .../assets/fonts/Stapel-ExpandedBlack.ttf | Bin 0 -> 191136 bytes .../assets/fonts/Stapel-ExpandedBlack.woff | Bin 0 -> 77924 bytes .../assets/fonts/Stapel-ExpandedBlack.woff2 | Bin 0 -> 52824 bytes .../assets/fonts/Stapel-ExpandedBold.eot | Bin 0 -> 187180 bytes .../assets/fonts/Stapel-ExpandedBold.ttf | Bin 0 -> 186964 bytes .../assets/fonts/Stapel-ExpandedBold.woff | Bin 0 -> 77212 bytes .../assets/fonts/Stapel-ExpandedBold.woff2 | Bin 0 -> 52996 bytes .../assets/fonts/Stapel-ExpandedExtraBold.eot | Bin 0 -> 188164 bytes .../assets/fonts/Stapel-ExpandedExtraBold.ttf | Bin 0 -> 187912 bytes .../fonts/Stapel-ExpandedExtraBold.woff | Bin 0 -> 76360 bytes .../fonts/Stapel-ExpandedExtraBold.woff2 | Bin 0 -> 52212 bytes .../xkater/assets/fonts/Stapel-ExtraBold.eot | Bin 0 -> 184002 bytes .../xkater/assets/fonts/Stapel-ExtraBold.ttf | Bin 0 -> 183804 bytes .../xkater/assets/fonts/Stapel-ExtraBold.woff | Bin 0 -> 73520 bytes .../assets/fonts/Stapel-ExtraBold.woff2 | Bin 0 -> 50200 bytes .../assets/fonts/Stapel-ExtraBoldItalic.eot | Bin 0 -> 186288 bytes .../assets/fonts/Stapel-ExtraBoldItalic.ttf | Bin 0 -> 186048 bytes .../assets/fonts/Stapel-ExtraBoldItalic.woff | Bin 0 -> 75916 bytes .../assets/fonts/Stapel-ExtraBoldItalic.woff2 | Bin 0 -> 51024 bytes .../xkater/assets/fonts/Stapel-ExtraLight.eot | Bin 0 -> 169328 bytes .../xkater/assets/fonts/Stapel-ExtraLight.ttf | Bin 0 -> 169124 bytes .../assets/fonts/Stapel-ExtraLight.woff | Bin 0 -> 70612 bytes .../assets/fonts/Stapel-ExtraLight.woff2 | Bin 0 -> 48512 bytes .../assets/fonts/Stapel-ExtraLightItalic.eot | Bin 0 -> 170086 bytes .../assets/fonts/Stapel-ExtraLightItalic.ttf | Bin 0 -> 169840 bytes .../assets/fonts/Stapel-ExtraLightItalic.woff | Bin 0 -> 72536 bytes .../fonts/Stapel-ExtraLightItalic.woff2 | Bin 0 -> 49172 bytes .../xkater/assets/fonts/Stapel-Italic.eot | Bin 0 -> 175002 bytes .../xkater/assets/fonts/Stapel-Italic.ttf | Bin 0 -> 174828 bytes .../xkater/assets/fonts/Stapel-Italic.woff | Bin 0 -> 73204 bytes .../xkater/assets/fonts/Stapel-Italic.woff2 | Bin 0 -> 49564 bytes .../xkater/assets/fonts/Stapel-Light.eot | Bin 0 -> 168620 bytes .../xkater/assets/fonts/Stapel-Light.ttf | Bin 0 -> 168452 bytes .../xkater/assets/fonts/Stapel-Light.woff | Bin 0 -> 70284 bytes .../xkater/assets/fonts/Stapel-Light.woff2 | Bin 0 -> 48440 bytes .../assets/fonts/Stapel-LightItalic.eot | Bin 0 -> 168562 bytes .../assets/fonts/Stapel-LightItalic.ttf | Bin 0 -> 168352 bytes .../assets/fonts/Stapel-LightItalic.woff | Bin 0 -> 71788 bytes .../assets/fonts/Stapel-LightItalic.woff2 | Bin 0 -> 48896 bytes .../xkater/assets/fonts/Stapel-Medium.eot | Bin 0 -> 175230 bytes .../xkater/assets/fonts/Stapel-Medium.ttf | Bin 0 -> 175056 bytes .../xkater/assets/fonts/Stapel-Medium.woff | Bin 0 -> 73432 bytes .../xkater/assets/fonts/Stapel-Medium.woff2 | Bin 0 -> 50516 bytes .../assets/fonts/Stapel-MediumItalic.eot | Bin 0 -> 180100 bytes .../assets/fonts/Stapel-MediumItalic.ttf | Bin 0 -> 179884 bytes .../assets/fonts/Stapel-MediumItalic.woff | Bin 0 -> 75968 bytes .../assets/fonts/Stapel-MediumItalic.woff2 | Bin 0 -> 51764 bytes .../assets/fonts/Stapel-SemiExpandedBlack.eot | Bin 0 -> 189064 bytes .../assets/fonts/Stapel-SemiExpandedBlack.ttf | Bin 0 -> 188812 bytes .../fonts/Stapel-SemiExpandedBlack.woff | Bin 0 -> 77192 bytes .../fonts/Stapel-SemiExpandedBlack.woff2 | Bin 0 -> 52328 bytes .../assets/fonts/Stapel-SemiExpandedBold.eot | Bin 0 -> 186002 bytes .../assets/fonts/Stapel-SemiExpandedBold.ttf | Bin 0 -> 185756 bytes .../assets/fonts/Stapel-SemiExpandedBold.woff | Bin 0 -> 76588 bytes .../fonts/Stapel-SemiExpandedBold.woff2 | Bin 0 -> 52540 bytes .../fonts/Stapel-SemiExpandedExtraBold.eot | Bin 0 -> 187242 bytes .../fonts/Stapel-SemiExpandedExtraBold.ttf | Bin 0 -> 186960 bytes .../fonts/Stapel-SemiExpandedExtraBold.woff | Bin 0 -> 75724 bytes .../fonts/Stapel-SemiExpandedExtraBold.woff2 | Bin 0 -> 51696 bytes .../fonts/Stapel-SemiExpandedMedium.eot | Bin 0 -> 179154 bytes .../fonts/Stapel-SemiExpandedMedium.ttf | Bin 0 -> 178896 bytes .../fonts/Stapel-SemiExpandedMedium.woff | Bin 0 -> 75088 bytes .../fonts/Stapel-SemiExpandedMedium.woff2 | Bin 0 -> 51572 bytes .../xkater/assets/fonts/StapelText-Bold.eot | Bin 0 -> 164582 bytes .../xkater/assets/fonts/StapelText-Bold.ttf | Bin 0 -> 164400 bytes .../xkater/assets/fonts/StapelText-Bold.woff | Bin 0 -> 66776 bytes .../xkater/assets/fonts/StapelText-Bold.woff2 | Bin 0 -> 46640 bytes .../assets/fonts/StapelText-BoldItalic.eot | Bin 0 -> 164268 bytes .../assets/fonts/StapelText-BoldItalic.ttf | Bin 0 -> 164044 bytes .../assets/fonts/StapelText-BoldItalic.woff | Bin 0 -> 68292 bytes .../assets/fonts/StapelText-BoldItalic.woff2 | Bin 0 -> 46844 bytes .../xkater/assets/fonts/StapelText-Italic.eot | Bin 0 -> 154170 bytes .../xkater/assets/fonts/StapelText-Italic.ttf | Bin 0 -> 153976 bytes .../assets/fonts/StapelText-Italic.woff | Bin 0 -> 65468 bytes .../assets/fonts/StapelText-Italic.woff2 | Bin 0 -> 45264 bytes .../assets/fonts/StapelText-LightItalic.eot | Bin 0 -> 148694 bytes .../assets/fonts/StapelText-LightItalic.ttf | Bin 0 -> 148464 bytes .../assets/fonts/StapelText-LightItalic.woff | Bin 0 -> 63604 bytes .../assets/fonts/StapelText-LightItalic.woff2 | Bin 0 -> 44064 bytes .../themes/xkater/assets/images/.gitkeep | 0 .../themes/xkater/assets/images/favicon.svg | 11 + .../themes/xkater/assets/images/hero.webp | Bin 0 -> 510444 bytes .../themes/xkater/assets/images/logo.svg | 16 + .../themes/xkater/assets/images/tabler.svg | 3 + wp-content/themes/xkater/assets/images/tg.svg | 10 + wp-content/themes/xkater/assets/images/wh.svg | 3 + wp-content/themes/xkater/assets/js/.gitkeep | 0 .../themes/xkater/assets/js/dropdown.js | 114 + wp-content/themes/xkater/assets/js/main.js | 0 .../xkater/assets/scss/abstracts/_flex.scss | 155 + .../assets/scss/abstracts/_functions.scss | 39 + .../xkater/assets/scss/abstracts/_gap.scss | 28 + .../xkater/assets/scss/abstracts/_grid.scss | 226 + .../xkater/assets/scss/abstracts/_index.scss | 8 + .../xkater/assets/scss/abstracts/_mixins.scss | 30 + .../assets/scss/abstracts/_spacing.scss | 90 + .../assets/scss/abstracts/_variables.scss | 16 + .../xkater/assets/scss/abstracts/_width.scss | 44 + .../xkater/assets/scss/base/_fonts.scss | 621 +++ .../xkater/assets/scss/base/_globals.scss | 42 + .../xkater/assets/scss/base/_hover.scss | 9 + .../xkater/assets/scss/base/_index.scss | 4 + .../xkater/assets/scss/base/_reset.scss | 25 + .../xkater/assets/scss/base/_typography.scss | 25 + .../assets/scss/components/_buttons.scss | 99 + .../xkater/assets/scss/components/_forms.scss | 140 + .../xkater/assets/scss/components/_icons.scss | 24 + .../xkater/assets/scss/components/_index.scss | 17 + .../assets/scss/components/_sections.scss | 37 + .../xkater/assets/scss/layout/_container.scss | 5 + .../xkater/assets/scss/layout/_header.scss | 100 + .../xkater/assets/scss/layout/_index.scss | 3 + .../assets/scss/layout/pages/_index.scss | 2 + .../assets/scss/layout/pages/home/_hero.scss | 97 + .../assets/scss/layout/pages/home/_rent.scss | 55 + .../themes/xkater/assets/scss/main.scss | 6 + .../xkater/assets/scss/pages/_index.scss | 1 + .../assets/scss/utilities/_helpers.scss | 11 + .../xkater/assets/scss/utilities/_index.scss | 1 + wp-content/themes/xkater/footer.php | 15 + wp-content/themes/xkater/front-page.php | 178 + wp-content/themes/xkater/functions.php | 62 + wp-content/themes/xkater/header.php | 53 + wp-content/themes/xkater/index.php | 9 + wp-content/themes/xkater/page.php | 9 + wp-content/themes/xkater/single.php | 9 + wp-content/themes/xkater/style.css | 8 + .../xkater/template-parts/content-page.php | 6 + .../xkater/template-parts/content-single.php | 6 + .../themes/xkater/template-parts/content.php | 6 + wp-content/uploads/.gitkeep | 0 307 files changed, 19544 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 .woodpecker.yaml create mode 100644 README.md create mode 100644 docker-compose.yml create mode 100644 docker/php/uploads.ini create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.cjs create mode 100644 sync.sh create mode 100644 wp-content/index.php create mode 100644 wp-content/mu-plugins/acf-options-pages.php create mode 100644 wp-content/mu-plugins/local-dev-performance.php create mode 100644 wp-content/mu-plugins/remove-action.php create mode 100644 wp-content/plugins/README.md create mode 100644 wp-content/plugins/akismet/.htaccess create mode 100644 wp-content/plugins/akismet/LICENSE.txt create mode 100644 wp-content/plugins/akismet/_inc/akismet-admin.css create mode 100644 wp-content/plugins/akismet/_inc/akismet-admin.js create mode 100644 wp-content/plugins/akismet/_inc/akismet-frontend.js create mode 100644 wp-content/plugins/akismet/_inc/akismet.css create mode 100644 wp-content/plugins/akismet/_inc/akismet.js create mode 100644 wp-content/plugins/akismet/_inc/fonts/inter.css create mode 100644 wp-content/plugins/akismet/_inc/img/akismet-activation-banner-elements.png create mode 100644 wp-content/plugins/akismet/_inc/img/akismet-refresh-logo.svg create mode 100644 wp-content/plugins/akismet/_inc/img/akismet-refresh-logo@2x.png create mode 100644 wp-content/plugins/akismet/_inc/img/arrow-left.svg create mode 100644 wp-content/plugins/akismet/_inc/img/logo-a-2x.png create mode 100644 wp-content/plugins/akismet/_inc/rtl/akismet-admin-rtl.css create mode 100644 wp-content/plugins/akismet/_inc/rtl/akismet-rtl.css create mode 100644 wp-content/plugins/akismet/akismet.php create mode 100644 wp-content/plugins/akismet/changelog.txt create mode 100644 wp-content/plugins/akismet/class-akismet-compatible-plugins.php create mode 100644 wp-content/plugins/akismet/class.akismet-admin.php create mode 100644 wp-content/plugins/akismet/class.akismet-cli.php create mode 100644 wp-content/plugins/akismet/class.akismet-rest-api.php create mode 100644 wp-content/plugins/akismet/class.akismet-widget.php create mode 100644 wp-content/plugins/akismet/class.akismet.php create mode 100644 wp-content/plugins/akismet/index.php create mode 100644 wp-content/plugins/akismet/readme.txt create mode 100644 wp-content/plugins/akismet/views/activate.php create mode 100644 wp-content/plugins/akismet/views/compatible-plugins.php create mode 100644 wp-content/plugins/akismet/views/config.php create mode 100644 wp-content/plugins/akismet/views/connect-jp.php create mode 100644 wp-content/plugins/akismet/views/enter.php create mode 100644 wp-content/plugins/akismet/views/get.php create mode 100644 wp-content/plugins/akismet/views/logo.php create mode 100644 wp-content/plugins/akismet/views/notice.php create mode 100644 wp-content/plugins/akismet/views/predefined.php create mode 100644 wp-content/plugins/akismet/views/setup-jetpack.php create mode 100644 wp-content/plugins/akismet/views/setup.php create mode 100644 wp-content/plugins/akismet/views/start.php create mode 100644 wp-content/plugins/akismet/views/stats.php create mode 100644 wp-content/plugins/akismet/wrapper.php create mode 100644 wp-content/plugins/hello.php create mode 100644 wp-content/plugins/index.php create mode 100644 wp-content/themes/index.php create mode 100644 wp-content/themes/xkater/404.php create mode 100644 wp-content/themes/xkater/acf-json/.gitkeep create mode 100644 wp-content/themes/xkater/archive.php create mode 100644 wp-content/themes/xkater/assets/css/.gitkeep create mode 100644 wp-content/themes/xkater/assets/css/main.css create mode 100644 wp-content/themes/xkater/assets/css/main.css.map create mode 100644 wp-content/themes/xkater/assets/fonts/AKONY.otf create mode 100644 wp-content/themes/xkater/assets/fonts/AKONY.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AKONY.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AKONY.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Bold.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Bold.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Bold.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Bold.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-BoldItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-BoldItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-BoldItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-BoldItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Italic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Italic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Italic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Italic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Light.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Light.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Light.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Light.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-LightItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-LightItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-LightItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-LightItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Medium.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Medium.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Medium.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Medium.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-MediumItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-MediumItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-MediumItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-MediumItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Regular.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Regular.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Regular.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Regular.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Semibold.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Semibold.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Semibold.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Semibold.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-SemiboldItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-SemiboldItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-SemiboldItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-SemiboldItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Thin.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Thin.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Thin.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-Thin.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-ThinItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-ThinItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-ThinItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypDisplay-ThinItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypRegularVariable.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypRegularVariable.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypRegularVariable.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypRegularVariable.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Bold.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Bold.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Bold.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Bold.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-BoldItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-BoldItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-BoldItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-BoldItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Italic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Italic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Italic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Italic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Light.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Light.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Light.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Light.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-LightItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-LightItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-LightItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-LightItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Medium.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Medium.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Medium.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Medium.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-MediumItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-MediumItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-MediumItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-MediumItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Regular.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Regular.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Regular.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Regular.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Semibold.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Semibold.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Semibold.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Semibold.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-SemiboldItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-SemiboldItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-SemiboldItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-SemiboldItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Thin.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Thin.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Thin.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-Thin.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-ThinItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-ThinItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-ThinItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/AtypText-ThinItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Bold.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Bold.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Bold.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Bold.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-BoldItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-BoldItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-BoldItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-BoldItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExpandedBlack.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExpandedBlack.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExpandedBlack.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExpandedBlack.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExpandedBold.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExpandedBold.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExpandedBold.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExpandedBold.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExpandedExtraBold.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExpandedExtraBold.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExpandedExtraBold.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExpandedExtraBold.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraBold.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraBold.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraBold.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraBold.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraBoldItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraBoldItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraBoldItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraBoldItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraLight.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraLight.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraLight.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraLight.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraLightItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraLightItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraLightItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-ExtraLightItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Italic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Italic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Italic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Italic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Light.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Light.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Light.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Light.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-LightItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-LightItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-LightItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-LightItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Medium.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Medium.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Medium.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-Medium.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-MediumItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-MediumItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-MediumItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-MediumItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedBlack.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedBlack.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedBlack.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedBlack.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedBold.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedBold.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedBold.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedBold.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedExtraBold.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedExtraBold.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedExtraBold.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedExtraBold.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedMedium.eot create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedMedium.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedMedium.woff create mode 100644 wp-content/themes/xkater/assets/fonts/Stapel-SemiExpandedMedium.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-Bold.eot create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-Bold.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-Bold.woff create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-Bold.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-BoldItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-BoldItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-BoldItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-BoldItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-Italic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-Italic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-Italic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-Italic.woff2 create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-LightItalic.eot create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-LightItalic.ttf create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-LightItalic.woff create mode 100644 wp-content/themes/xkater/assets/fonts/StapelText-LightItalic.woff2 create mode 100644 wp-content/themes/xkater/assets/images/.gitkeep create mode 100644 wp-content/themes/xkater/assets/images/favicon.svg create mode 100644 wp-content/themes/xkater/assets/images/hero.webp create mode 100644 wp-content/themes/xkater/assets/images/logo.svg create mode 100644 wp-content/themes/xkater/assets/images/tabler.svg create mode 100644 wp-content/themes/xkater/assets/images/tg.svg create mode 100644 wp-content/themes/xkater/assets/images/wh.svg create mode 100644 wp-content/themes/xkater/assets/js/.gitkeep create mode 100644 wp-content/themes/xkater/assets/js/dropdown.js create mode 100644 wp-content/themes/xkater/assets/js/main.js create mode 100644 wp-content/themes/xkater/assets/scss/abstracts/_flex.scss create mode 100644 wp-content/themes/xkater/assets/scss/abstracts/_functions.scss create mode 100644 wp-content/themes/xkater/assets/scss/abstracts/_gap.scss create mode 100644 wp-content/themes/xkater/assets/scss/abstracts/_grid.scss create mode 100644 wp-content/themes/xkater/assets/scss/abstracts/_index.scss create mode 100644 wp-content/themes/xkater/assets/scss/abstracts/_mixins.scss create mode 100644 wp-content/themes/xkater/assets/scss/abstracts/_spacing.scss create mode 100644 wp-content/themes/xkater/assets/scss/abstracts/_variables.scss create mode 100644 wp-content/themes/xkater/assets/scss/abstracts/_width.scss create mode 100644 wp-content/themes/xkater/assets/scss/base/_fonts.scss create mode 100644 wp-content/themes/xkater/assets/scss/base/_globals.scss create mode 100644 wp-content/themes/xkater/assets/scss/base/_hover.scss create mode 100644 wp-content/themes/xkater/assets/scss/base/_index.scss create mode 100644 wp-content/themes/xkater/assets/scss/base/_reset.scss create mode 100644 wp-content/themes/xkater/assets/scss/base/_typography.scss create mode 100644 wp-content/themes/xkater/assets/scss/components/_buttons.scss create mode 100644 wp-content/themes/xkater/assets/scss/components/_forms.scss create mode 100644 wp-content/themes/xkater/assets/scss/components/_icons.scss create mode 100644 wp-content/themes/xkater/assets/scss/components/_index.scss create mode 100644 wp-content/themes/xkater/assets/scss/components/_sections.scss create mode 100644 wp-content/themes/xkater/assets/scss/layout/_container.scss create mode 100644 wp-content/themes/xkater/assets/scss/layout/_header.scss create mode 100644 wp-content/themes/xkater/assets/scss/layout/_index.scss create mode 100644 wp-content/themes/xkater/assets/scss/layout/pages/_index.scss create mode 100644 wp-content/themes/xkater/assets/scss/layout/pages/home/_hero.scss create mode 100644 wp-content/themes/xkater/assets/scss/layout/pages/home/_rent.scss create mode 100644 wp-content/themes/xkater/assets/scss/main.scss create mode 100644 wp-content/themes/xkater/assets/scss/pages/_index.scss create mode 100644 wp-content/themes/xkater/assets/scss/utilities/_helpers.scss create mode 100644 wp-content/themes/xkater/assets/scss/utilities/_index.scss create mode 100644 wp-content/themes/xkater/footer.php create mode 100644 wp-content/themes/xkater/front-page.php create mode 100644 wp-content/themes/xkater/functions.php create mode 100644 wp-content/themes/xkater/header.php create mode 100644 wp-content/themes/xkater/index.php create mode 100644 wp-content/themes/xkater/page.php create mode 100644 wp-content/themes/xkater/single.php create mode 100644 wp-content/themes/xkater/style.css create mode 100644 wp-content/themes/xkater/template-parts/content-page.php create mode 100644 wp-content/themes/xkater/template-parts/content-single.php create mode 100644 wp-content/themes/xkater/template-parts/content.php create mode 100644 wp-content/uploads/.gitkeep diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..bfb0441 --- /dev/null +++ b/.env.example @@ -0,0 +1,13 @@ +WORDPRESS_PORT=8080 +WORDPRESS_DEBUG=1 + +MYSQL_DATABASE=xkater +MYSQL_USER=xkater_user +MYSQL_PASSWORD=xkater_password +MYSQL_ROOT_PASSWORD=root_password + +WORDPRESS_DB_HOST=db:3306 +WORDPRESS_DB_NAME=xkater +WORDPRESS_DB_USER=xkater_user +WORDPRESS_DB_PASSWORD=xkater_password +WORDPRESS_TABLE_PREFIX=wp_ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e126d6b --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.env +.DS_Store +node_modules/ + +wp-content/uploads/* +!wp-content/uploads/.gitkeep diff --git a/.woodpecker.yaml b/.woodpecker.yaml new file mode 100644 index 0000000..c58fa1a --- /dev/null +++ b/.woodpecker.yaml @@ -0,0 +1,50 @@ +# .woodpecker.yaml +pipeline: + # Шаг 1: Сборка ассетов темы + build-assets: + image: node:20-alpine + commands: + - cd wp-content/themes/xkater + # Проверяем, есть ли package.json (вдруг вы не используете сборщик) + - if [ -f package.json ]; then npm ci && npm run build; fi + when: + branch: main + + # Шаг 2: Деплой на боевой сервер + deploy-production: + image: drillster/drone-rsync + settings: + user: ${PROD_SSH_USER} + host: ${PROD_SSH_HOST} + key: ${PROD_SSH_KEY} + source: ./wp-content/ + target: ${REMOTE_PATH}/wp-content/ + recursive: true + delete: false # ← ВАЖНО: не удалять то, чего нет в репозитории + args: > + --exclude=uploads/ + --exclude=plugins/akismet/ + --exclude=plugins/index.php + --exclude=.git/ + --exclude=node_modules/ + --exclude=.DS_Store + --exclude=mu-plugins/local-dev-performance.php + when: + branch: main + + # Шаг 3: Очистка кэша на сервере + flush-cache: + image: appleboy/drone-ssh + settings: + host: ${PROD_SSH_HOST} + username: ${PROD_SSH_USER} + key: ${PROD_SSH_KEY} + script: + - cd ${REMOTE_PATH} + # Очистка кэша WordPress (если есть WP-CLI) + - if command -v wp &> /dev/null; then wp cache flush; fi + # Или просто трогаем wp-config.php для сброса кэша опкодов + - touch wp-config.php + when: + branch: main + status: success diff --git a/README.md b/README.md new file mode 100644 index 0000000..fb62b54 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# X-Kater WordPress Starter + +Минимальный каркас проекта для многостраничного сайта на WordPress с использованием ACF Pro. + +## Быстрый старт + +1. Скопировать переменные окружения: + ```bash + cp .env.example .env + ``` +2. Запустить окружение: + ```bash + docker compose up -d + ``` +3. Открыть установку WordPress: + - `http://localhost:8080` +4. В админке активировать тему `X-Kater Theme`. + +## ACF Pro + +- Установите ACF Pro через админку WordPress (`Plugins -> Add New -> Upload Plugin`) или положите папку плагина в `wp-content/plugins/acf-pro`. +- JSON полей ACF сохраняется в `wp-content/themes/xkater/acf-json`. + +## SCSS + +Структура SCSS находится в `wp-content/themes/xkater/assets/scss`. + +1. Установить зависимости: + ```bash + npm install + ``` +2. Разовая сборка: + ```bash + npm run scss:build + ``` +3. Режим разработки (watch + autoprefixer): + ```bash + npm run scss:dev + ``` +4. Продакшен-сборка: + ```bash + npm run scss:prod + ``` + +Скомпилированный CSS: `wp-content/themes/xkater/assets/css/main.css`. + +Для резиновой верстки добавлены: + +- SCSS-функция `fluid(...)` для `clamp(...)`; +- миксин `fluid-property(...)`; +- миксин `container(...)`; +- миксин `respond(...)` для брейкпоинтов. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..7ab844c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,40 @@ +name: xkater + +services: + db: + image: mysql:8.0 + container_name: xkater-db + restart: unless-stopped + environment: + MYSQL_DATABASE: ${MYSQL_DATABASE} + MYSQL_USER: ${MYSQL_USER} + MYSQL_PASSWORD: ${MYSQL_PASSWORD} + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + volumes: + - db_data:/var/lib/mysql + + wordpress: + image: wordpress:php8.2-apache + container_name: xkater-wp + restart: unless-stopped + depends_on: + - db + ports: + - '${WORDPRESS_PORT}:80' + environment: + WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST} + WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME} + WORDPRESS_DB_USER: ${WORDPRESS_DB_USER} + WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD} + WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX} + WORDPRESS_DEBUG: ${WORDPRESS_DEBUG} + WORDPRESS_CONFIG_EXTRA: | + define('WP_ENVIRONMENT_TYPE', 'local'); + define('WP_DEBUG_DISPLAY', false); + @ini_set('display_errors', 0); + volumes: + - ./wp-content:/var/www/html/wp-content + - ./docker/php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini + +volumes: + db_data: diff --git a/docker/php/uploads.ini b/docker/php/uploads.ini new file mode 100644 index 0000000..a1cd593 --- /dev/null +++ b/docker/php/uploads.ini @@ -0,0 +1,4 @@ +upload_max_filesize = 64M +post_max_size = 64M +memory_limit = 256M +max_execution_time = 300 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f48475e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1459 @@ +{ + "name": "xkater-wordpress-starter", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "xkater-wordpress-starter", + "version": "1.0.0", + "devDependencies": { + "autoprefixer": "^10.4.21", + "onchange": "^7.1.0", + "postcss": "^8.5.6", + "postcss-cli": "^11.0.1", + "sass": "^1.89.0" + } + }, + "node_modules/@blakeembrey/deque": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@blakeembrey/deque/-/deque-1.0.5.tgz", + "integrity": "sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@blakeembrey/template": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@blakeembrey/template/-/template-1.2.0.tgz", + "integrity": "sha512-w/63nURdkRPpg3AXbNr7lPv6HgOuVDyefTumiXsbXxtIwcuk5EXayWR5OpSwDjsQPgaYsfUSedMduaNOjAYY8A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.16.tgz", + "integrity": "sha512-Lyf3aK28zpsD1yQMiiHD4RvVb6UdMoo8xzG2XzFIfR9luPzOpcBlAsT/qfB1XWS1bxWT+UtE4WmQgsp297FYOA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001787", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz", + "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.334", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.334.tgz", + "integrity": "sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/onchange": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/onchange/-/onchange-7.1.0.tgz", + "integrity": "sha512-ZJcqsPiWUAUpvmnJri5TPBooqJOPmC0ttN65juhN15Q8xA+Nbg3BaxBHXQ45EistKKlKElb0edmbPWnKSBkvMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@blakeembrey/deque": "^1.0.5", + "@blakeembrey/template": "^1.0.0", + "arg": "^4.1.3", + "chokidar": "^3.3.1", + "cross-spawn": "^7.0.1", + "ignore": "^5.1.4", + "tree-kill": "^1.2.2" + }, + "bin": { + "onchange": "dist/bin.js" + } + }, + "node_modules/onchange/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/onchange/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/onchange/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", + "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-cli": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz", + "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^1.0.0", + "fs-extra": "^11.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^5.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "tinyglobby": "^0.2.12", + "yargs": "^17.0.0" + }, + "bin": { + "postcss": "index.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + } + } + }, + "node_modules/postcss-reporter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sass": { + "version": "1.99.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz", + "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9fc1e57 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "xkater-wordpress-starter", + "version": "1.0.0", + "private": true, + "scripts": { + "scss:build": "sass --no-source-map --style=expanded wp-content/themes/xkater/assets/scss/main.scss wp-content/themes/xkater/assets/css/main.css && postcss wp-content/themes/xkater/assets/css/main.css --replace", + "scss:watch": "sass --watch --style=expanded wp-content/themes/xkater/assets/scss/main.scss:wp-content/themes/xkater/assets/css/main.css", + "scss:dev": "npm run scss:build && onchange \"wp-content/themes/xkater/assets/scss/**/*.scss\" -- npm run scss:build", + "scss:prod": "sass --style=compressed wp-content/themes/xkater/assets/scss/main.scss wp-content/themes/xkater/assets/css/main.css && postcss wp-content/themes/xkater/assets/css/main.css --replace" + }, + "devDependencies": { + "autoprefixer": "^10.4.21", + "onchange": "^7.1.0", + "postcss": "^8.5.6", + "postcss-cli": "^11.0.1", + "sass": "^1.89.0" + }, + "browserslist": [ + "> 0.5%", + "last 2 versions", + "not dead" + ] +} diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 0000000..b122ab5 --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,5 @@ +module.exports = { + plugins: [ + require('autoprefixer') + ] +}; diff --git a/sync.sh b/sync.sh new file mode 100644 index 0000000..ce1f04f --- /dev/null +++ b/sync.sh @@ -0,0 +1,447 @@ +#!/bin/bash + +# ============================================ +# WP-CLI Sync Script for WordPress with Docker +# ============================================ + +# Цвета для вывода +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# ============================================ +# НАСТРОЙКИ (ИЗМЕНИТЕ ПОД СЕБЯ) +# ============================================ + +# Локальные настройки (хост-машина) +LOCAL_PATH="$(pwd)" # Текущая папка, где лежит скрипт (автоопределение) + +# Docker настройки +# Получите имя контейнера командой: docker ps --format "table {{.Names}}\t{{.Image}}" | grep wordpress +WP_CONTAINER="wordpress" # ИЗМЕНИТЕ: имя вашего WordPress контейнера +WP_CONTAINER_PATH="/var/www/html" # Путь к WordPress внутри контейнера (обычно /var/www/html) + +# Локальный URL (как вы открываете сайт в браузере) +LOCAL_URL="http://localhost:8080" # ИЗМЕНИТЕ: ваш URL и порт + +# Боевые настройки (продакшен) +PROD_SSH="user@your-server.com" # ИЗМЕНИТЕ: SSH пользователь и сервер +PROD_PATH="/var/www/production" # ИЗМЕНИТЕ: путь к WordPress на сервере +PROD_URL="https://your-site.com" # ИЗМЕНИТЕ: боевой URL + +# Настройки синхронизации +BACKUP_DIR="./sync_backups" # Папка для бэкапов +EXCLUDE_TABLES="wp_options" # Таблицы для исключения (через запятую) + # Например: "wp_options,wp_users" + +# Команда WP-CLI для Docker +WP_CMD="docker exec -i $WP_CONTAINER wp --path=$WP_CONTAINER_PATH" + +# ============================================ +# ФУНКЦИИ +# ============================================ + +# Функция для проверки Docker контейнера +check_docker() { + info "Проверка Docker контейнера: $WP_CONTAINER" + + if ! docker ps --format "table {{.Names}}" | grep -q "^$WP_CONTAINER$"; then + error "Контейнер $WP_CONTAINER не запущен. Запустите Docker и контейнер WordPress." + fi + + # Проверяем WP-CLI в контейнере + if ! docker exec $WP_CONTAINER wp --info &> /dev/null; then + error "WP-CLI не найден в контейнере. Установите WP-CLI в Docker образ." + fi + + success "Docker контейнер готов" +} + +# Функция для вывода ошибок +error() { + echo -e "${RED}[ОШИБКА]${NC} $1" + exit 1 +} + +# Функция для вывода успеха +success() { + echo -e "${GREEN}[УСПЕХ]${NC} $1" +} + +# Функция для вывода информации +info() { + echo -e "${BLUE}[ИНФО]${NC} $1" +} + +# Функция для вывода предупреждения +warning() { + echo -e "${YELLOW}[ПРЕДУПРЕЖДЕНИЕ]${NC} $1" +} + +# Функция для запроса подтверждения +confirm() { + read -p "$(echo -e ${YELLOW}[?]${NC} $1 (y/n): " )" -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + info "Отменено пользователем" + return 1 + fi + return 0 +} + +# Функция для создания бэкапа БД +backup_db() { + local backup_name="$1" + local backup_file="${BACKUP_DIR}/${backup_name}_$(date +%Y%m%d_%H%M%S).sql" + + mkdir -p "$BACKUP_DIR" + info "Создание бэкапа БД: $backup_file" + + # Выполняем WP-CLI внутри контейнера, сохраняем на хост + if $WP_CMD db export - 2>/dev/null > "$backup_file"; then + success "Бэкап создан: $backup_file" + echo "$backup_file" + else + error "Не удалось создать бэкап БД" + fi +} + +# Функция для импорта БД из файла +import_db() { + local backup_file="$1" + + if [ ! -f "$backup_file" ]; then + error "Файл бэкапа не найден: $backup_file" + fi + + info "Импорт БД из $backup_file" + + # Читаем файл с хоста и передаём в контейнер + if cat "$backup_file" | $WP_CMD db import -; then + success "БД импортирована успешно" + else + error "Не удалось импортировать БД" + fi +} + +# Функция для замены URL +replace_url() { + local from_url="$1" + local to_url="$2" + + info "Замена URL: $from_url -> $to_url" + + # Сначала проверка (dry run) + info "Проверка замены (dry run)..." + if ! $WP_CMD search-replace "$from_url" "$to_url" --dry-run; then + error "Ошибка при проверке замены URL" + fi + + if confirm "Продолжить замену URL?"; then + if $WP_CMD search-replace "$from_url" "$to_url"; then + success "URL заменены успешно" + else + error "Ошибка при замене URL" + fi + fi +} + +# Функция для очистки кэша +flush_cache() { + info "Очистка кэша WordPress..." + $WP_CMD cache flush + success "Кэш очищен" +} + +# ============================================ +# ОСНОВНЫЕ КОМАНДЫ +# ============================================ + +# Функция: Pull (с боевого на локальный) +do_pull() { + echo "" + echo "=========================================" + echo "PULL: Боевой -> Локальный" + echo "=========================================" + echo "" + + # 1. Проверка соединения с боевым сервером + info "Проверка соединения с боевым сервером..." + ssh $PROD_SSH "wp core is-installed --path=$PROD_PATH" || error "Не удалось подключиться к боевому серверу" + success "Соединение с сервером установлено" + + # 2. Создание бэкапа боевой БД на сервере + local timestamp=$(date +%Y%m%d_%H%M%S) + local prod_backup="prod_backup_${timestamp}.sql" + + info "Создание бэкапа боевой БД на сервере..." + ssh $PROD_SSH "cd $PROD_PATH && wp db export $prod_backup" || error "Не удалось создать бэкап на сервере" + success "Бэкап создан на сервере: $prod_backup" + + # 3. Скачивание бэкапа + info "Скачивание бэкапа с сервера..." + scp $PROD_SSH:$PROD_PATH/$prod_backup "$BACKUP_DIR/" || error "Не удалось скачать бэкап" + + # 4. Удаление временного файла на сервере + ssh $PROD_SSH "rm $PROD_PATH/$prod_backup" + success "Бэкап скачан и временный файл удалён" + + # 5. Создание бэкапа локальной БД (на всякий случай) + backup_db "local_before_pull_${timestamp}" + + # 6. Импорт боевой БД в локальную среду + import_db "$BACKUP_DIR/$prod_backup" + + # 7. Замена URL на локальные + replace_url "$PROD_URL" "$LOCAL_URL" + + # 8. Очистка кэша + flush_cache + + success "Pull завершён успешно!" + info "Локальный сайт теперь полностью соответствует боевому" +} + +# Функция: Push (с локального на боевой) +do_push() { + echo "" + echo "=========================================" + echo "PUSH: Локальный -> Боевой" + echo "=========================================" + echo "" + + # ПРЕДУПРЕЖДЕНИЕ! + warning "Эта операция ЗАМЕНИТ боевую базу данных на локальную!" + echo "Вы потеряете все новые данные на боевом сайте:" + echo " • Заказы (если есть интернет-магазин)" + echo " • Комментарии пользователей" + echo " • Новых зарегистрированных пользователей" + echo " • Изменения в настройках" + echo "" + + if ! confirm "Вы уверены, что хотите продолжить?"; then + exit 0 + fi + + local timestamp=$(date +%Y%m%d_%H%M%S) + + # 1. Создание бэкапа боевой БД + info "Создание бэкапа боевой БД перед обновлением..." + ssh $PROD_SSH "cd $PROD_PATH && wp db export backup_before_push_${timestamp}.sql" || error "Не удалось создать бэкап боевой БД" + success "Бэкап боевой БД сохранён на сервере" + + # 2. Создание бэкапа локальной БД + backup_db "local_before_push_${timestamp}" + + # 3. Экспорт локальной БД с заменой URL + info "Подготовка локальной БД для боевого сервера..." + local temp_backup="${BACKUP_DIR}/temp_for_prod_${timestamp}.sql" + + # Экспортируем БД из контейнера + $WP_CMD db export - > "$temp_backup" || error "Не удалось экспортировать локальную БД" + + # 4. Замена URL в дампе (локальный -> боевой) + info "Замена URL в дампе: $LOCAL_URL -> $PROD_URL" + sed -i "s|$LOCAL_URL|$PROD_URL|g" "$temp_backup" + + # 5. Исключение некоторых таблиц (если нужно) + if [ -n "$EXCLUDE_TABLES" ] && [ "$EXCLUDE_TABLES" != "none" ]; then + info "Исключение таблиц: $EXCLUDE_TABLES" + local filtered_backup="${BACKUP_DIR}/filtered_${timestamp}.sql" + + # Создаём временный файл без исключённых таблиц + local exclude_pattern=$(echo "$EXCLUDE_TABLES" | sed 's/,/\\|/g') + grep -v "CREATE TABLE \`\(${exclude_pattern}\)\`" "$temp_backup" > "$filtered_backup" + grep -v "INSERT INTO \`\(${exclude_pattern}\)\`" "$filtered_backup" > "${filtered_backup}.tmp" + mv "${filtered_backup}.tmp" "$filtered_backup" + mv "$filtered_backup" "$temp_backup" + success "Таблицы исключены" + fi + + # 6. Отправка дампа на сервер + info "Отправка дампа на боевой сервер..." + scp "$temp_backup" $PROD_SSH:$PROD_PATH/ || error "Не удалось отправить дамп на сервер" + + # 7. Импорт на боевом сервере + info "Импорт на боевом сервере..." + ssh $PROD_SSH "cd $PROD_PATH && wp db import $(basename $temp_backup) && rm $(basename $temp_backup)" || error "Не удалось импортировать БД на сервере" + + # 8. Очистка кэша на сервере + info "Очистка кэша на боевом сервере..." + ssh $PROD_SSH "cd $PROD_PATH && wp cache flush" + + # 9. Удаление временных файлов + rm "$temp_backup" + + success "Push завершён успешно!" + info "Боевой сайт обновлён. Бэкап старой версии сохранён на сервере" +} + +# Функция: Синхронизация файлов (Uploads через rsync) +do_sync_files() { + echo "" + echo "=========================================" + echo "СИНХРОНИЗАЦИЯ ФАЙЛОВ (Uploads)" + echo "=========================================" + echo "" + + # Проверка наличия rsync + if ! command -v rsync &> /dev/null; then + warning "rsync не установлен. Установите rsync: brew install rsync (macOS) или apt-get install rsync (Linux)" + return 1 + fi + + # Пути к папкам uploads + LOCAL_UPLOADS="${LOCAL_PATH}/wp-content/uploads" + REMOTE_UPLOADS="$PROD_SSH:$PROD_PATH/wp-content/uploads" + + # Проверка существования локальной папки + if [ ! -d "$LOCAL_UPLOADS" ]; then + warning "Локальная папка uploads не найдена: $LOCAL_UPLOADS" + info "Создаю папку..." + mkdir -p "$LOCAL_UPLOADS" + fi + + echo "Выберите направление синхронизации:" + echo " 1) Локальный -> Боевой (отправить новые файлы на сервер)" + echo " 2) Боевой -> Локальный (скачать новые файлы с сервера)" + echo "" + read -p "Ваш выбор (1/2): " direction + + case $direction in + 1) + info "Синхронизация локальных файлов на боевой сервер..." + rsync -avz --progress \ + --exclude="*.tmp" \ + --exclude=".DS_Store" \ + "$LOCAL_UPLOADS/" "$REMOTE_UPLOADS/" + success "Файлы отправлены на сервер" + ;; + 2) + info "Скачивание файлов с боевого сервера..." + rsync -avz --progress \ + --exclude="*.tmp" \ + --exclude=".DS_Store" \ + "$REMOTE_UPLOADS/" "$LOCAL_UPLOADS/" + success "Файлы скачаны с сервера" + ;; + *) + error "Неверный выбор" + ;; + esac +} + +# Функция: Показать статус +do_status() { + echo "" + echo "=========================================" + echo "СТАТУС СИСТЕМЫ" + echo "=========================================" + echo "" + + # Docker контейнер + info "Docker контейнер:" + if docker ps --format "table {{.Names}}\t{{.Status}}" | grep -q "^$WP_CONTAINER"; then + docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep "$WP_CONTAINER" + else + warning "Контейнер $WP_CONTAINER не запущен" + fi + echo "" + + # Локальный WordPress + info "Локальный WordPress:" + if $WP_CMD core version &> /dev/null; then + echo " Версия: $($WP_CMD core version)" + echo " URL: $LOCAL_URL" + echo " Путь в контейнере: $WP_CONTAINER_PATH" + else + warning "WordPress не доступен в контейнере" + fi + echo "" + + # Боевой сервер + info "Боевой сервер:" + if ssh $PROD_SSH "wp core version --path=$PROD_PATH" &> /dev/null; then + echo " Версия: $(ssh $PROD_SSH "wp core version --path=$PROD_PATH")" + echo " URL: $PROD_URL" + echo " Путь: $PROD_PATH" + else + warning "Не удалось подключиться к боевому серверу" + fi +} + +# ============================================ +# ГЛАВНОЕ МЕНЮ +# ============================================ + +# Очистка экрана +clear + +# Приветствие +echo "" +echo "=========================================" +echo " WP-CLI Sync Script for WordPress" +echo " Docker + Production Sync" +echo "=========================================" +echo "" + +# Проверка Docker +check_docker + +# Создание папки для бэкапов +mkdir -p "$BACKUP_DIR" + +# Основной цикл меню +while true; do + echo "" + echo "=========================================" + echo "ГЛАВНОЕ МЕНЮ" + echo "=========================================" + echo "" + echo "Текущие настройки:" + echo " 📦 Docker контейнер: $WP_CONTAINER" + echo " 🏠 Локальный URL: $LOCAL_URL" + echo " ☁️ Боевой URL: $PROD_URL" + echo " 📁 Бэкапы: $BACKUP_DIR" + echo "" + echo "Доступные действия:" + echo " 📥 1) Pull (Боевой -> Локальный) - забрать данные с сервера" + echo " 📤 2) Push (Локальный -> Боевой) - отправить данные на сервер" + echo " 📁 3) Sync Files - синхронизировать только файлы (uploads)" + echo " ℹ️ 4) Status - показать статус системы" + echo " 🗑️ 5) Backup - создать бэкап локальной БД" + echo " 🚪 6) Exit - выход" + echo "" + read -p "Выберите действие (1-6): " action + + case $action in + 1) + do_pull + ;; + 2) + do_push + ;; + 3) + do_sync_files + ;; + 4) + do_status + ;; + 5) + backup_db "manual_backup" + ;; + 6) + info "Выход из программы" + exit 0 + ;; + *) + error "Неверный выбор. Пожалуйста, выберите 1-6" + ;; + esac + + echo "" + read -p "Нажмите Enter, чтобы продолжить..." + clear +done \ No newline at end of file diff --git a/wp-content/index.php b/wp-content/index.php new file mode 100644 index 0000000..6220032 --- /dev/null +++ b/wp-content/index.php @@ -0,0 +1,2 @@ + 'Site Settings', + 'menu_title' => 'Site Settings', + 'menu_slug' => 'site-settings', + 'capability' => 'edit_posts', + 'redirect' => false, + ]); +}); diff --git a/wp-content/mu-plugins/local-dev-performance.php b/wp-content/mu-plugins/local-dev-performance.php new file mode 100644 index 0000000..e6be594 --- /dev/null +++ b/wp-content/mu-plugins/local-dev-performance.php @@ -0,0 +1,52 @@ + [], + 'last_checked' => time(), + 'version_checked' => get_bloginfo('version'), + ]; +}); + +add_filter('pre_site_transient_update_plugins', function () { + return (object) [ + 'last_checked' => time(), + 'checked' => [], + 'response' => [], + 'no_update' => [], + 'translations' => [], + ]; +}); + +add_filter('pre_site_transient_update_themes', function () { + return (object) [ + 'last_checked' => time(), + 'checked' => [], + 'response' => [], + 'no_update' => [], + 'translations' => [], + ]; +}); + +add_filter('automatic_updater_disabled', '__return_true'); diff --git a/wp-content/mu-plugins/remove-action.php b/wp-content/mu-plugins/remove-action.php new file mode 100644 index 0000000..f23824a --- /dev/null +++ b/wp-content/mu-plugins/remove-action.php @@ -0,0 +1,129 @@ +remove_menu('comments'); + }); + + // Отключаем поддержку комментариев + add_action('init', function() { + $post_types = get_post_types(); + foreach ($post_types as $post_type) { + if (post_type_supports($post_type, 'comments')) { + remove_post_type_support($post_type, 'comments'); + remove_post_type_support($post_type, 'trackbacks'); + } + } + }); + + // Перенаправляем при попытке доступа к странице комментариев + add_action('admin_init', function() { + global $pagenow; + if ($pagenow === 'edit-comments.php') { + wp_redirect(admin_url()); + exit; + } + }); + + // Скрываем мета-бокс комментариев в редакторе записей + add_action('admin_init', function() { + remove_meta_box('dashboard_recent_comments', 'dashboard', 'normal'); + }); + + // Закрываем комментарии для существующих записей + add_action('wp', function() { + if (is_singular()) { + $post_id = get_queried_object_id(); + if ($post_id) { + update_post_meta($post_id, '_wp_trash_meta_time', time()); + wp_update_post(array( + 'ID' => $post_id, + 'comment_status' => 'closed' + )); + } + } + }, 100); +} + +add_action('init', 'disable_comments_completely'); + +// Полное удаление ненужных пунктов из меню "Внешний вид" +function customize_appearance_menu() { + global $submenu; + + // Массив пунктов для удаления + $items_to_remove = array( + 'customize.php?return=%2Fwp-admin%2F', + 'customize.php?return=%2Fwp-admin%2F&autofocus%5Bcontrol%5D=header_image', + 'customize.php?return=%2Fwp-admin%2F&autofocus%5Bcontrol%5D=background_image', + 'site-editor.php?p=/pattern', + ); + + // Удаляем каждый пункт + foreach ($items_to_remove as $item) { + remove_submenu_page('themes.php', $item); + } + + // Альтернативный способ - прямое удаление из глобального массива $submenu + if (isset($submenu['themes.php'])) { + foreach ($submenu['themes.php'] as $key => $item) { + if (in_array($item[2], $items_to_remove) || + strpos($item[0], 'Паттерны') !== false || + strpos($item[0], 'Настроить') !== false || + strpos($item[0], 'Заголовок') !== false || + strpos($item[0], 'Фон') !== false) { + unset($submenu['themes.php'][$key]); + } + } + } +} +add_action('admin_menu', 'customize_appearance_menu', 999); + +function complete_cleanup() { + $styles_to_remove = [ + 'wp-emoji', + 'wp-emoji-styles', + 'wp-block-library', + 'wp-block-library-theme', + 'classic-theme-styles', + 'global-styles', + 'wp-block-archives', + 'wp-block-categories', + 'wp-block-heading', + 'wp-block-latest-comments', + 'wp-block-latest-posts', + 'wp-block-search', + 'wp-block-group', + 'wp-block-paragraph', + 'global-styles-inline', + 'wc-block-style' + ]; + + foreach ($styles_to_remove as $style) { + wp_dequeue_style($style); + wp_deregister_style($style); + } + + remove_action('wp_head', 'wp_generator'); + remove_action('wp_head', 'rsd_link'); + remove_action('wp_head', 'wlwmanifest_link'); + remove_action('wp_head', 'wp_shortlink_wp_head'); + remove_action('wp_head', 'rest_output_link_wp_head'); +} +add_action('wp_enqueue_scripts', 'complete_cleanup', 999); +add_action('wp_head', 'complete_cleanup', 1); + +remove_action( 'wp_enqueue_scripts', 'wp_enqueue_global_styles' ); +remove_action( 'wp_footer', 'wp_enqueue_global_styles', 1 ); + +?> \ No newline at end of file diff --git a/wp-content/plugins/README.md b/wp-content/plugins/README.md new file mode 100644 index 0000000..0bbe0a6 --- /dev/null +++ b/wp-content/plugins/README.md @@ -0,0 +1 @@ +Place third-party plugins here (e.g. ACF Pro). diff --git a/wp-content/plugins/akismet/.htaccess b/wp-content/plugins/akismet/.htaccess new file mode 100644 index 0000000..43c089d --- /dev/null +++ b/wp-content/plugins/akismet/.htaccess @@ -0,0 +1,34 @@ +# Only allow direct access to specific Web-available files. + +# Apache 2.2 + + Order Deny,Allow + Deny from all + + +# Apache 2.4 + + Require all denied + + +# Akismet CSS and JS + + + Allow from all + + + + Require all granted + + + +# Akismet images + + + Allow from all + + + + Require all granted + + diff --git a/wp-content/plugins/akismet/LICENSE.txt b/wp-content/plugins/akismet/LICENSE.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/wp-content/plugins/akismet/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/wp-content/plugins/akismet/_inc/akismet-admin.css b/wp-content/plugins/akismet/_inc/akismet-admin.css new file mode 100644 index 0000000..df930cb --- /dev/null +++ b/wp-content/plugins/akismet/_inc/akismet-admin.css @@ -0,0 +1,716 @@ +body { + --akismet-color-charcoal: #272635; + --akismet-color-light-grey: #f6f7f7; + --akismet-color-mid-grey: #a7aaad; + --akismet-color-dark-grey: #646970; + --akismet-color-grey-80: #2c3338; + --akismet-color-grey-100: #101517; + --akismet-color-grey-border: #dcdcde; + --akismet-color-white: #fff; + --akismet-color-dark-green: #2d6a40; + --akismet-color-mid-green: #357b49; + --akismet-color-light-green: #4eb26a; + --akismet-color-mid-red: #e82c3f; + --akismet-color-light-blue: #256eff; + --akismet-color-notice-light-green: #dbf0e1; + --akismet-color-notice-dark-green: #69bf82; + --akismet-color-notice-light-red: #ffdbde; + --akismet-color-notice-dark-red: #ff6676; + --akismet-color-notice-yellow: #e5c133; +} + +/* UI components */ +.akismet-new-feature { + background-color: var(--akismet-color-mid-green); + border-radius: 4px; + color: var(--akismet-color-white); + font-size: 10px; + padding: 4px 6px; + text-transform: uppercase; + vertical-align: top; +} + +#akismet-plugin-container { + background-color: var(--akismet-color-light-grey); + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen-Sans', 'Ubuntu', 'Cantarell', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; +} + +#akismet-plugin-container a { + color: var(--akismet-color-mid-green); +} + +#akismet-plugin-container a.akismet-button { + background-color: var(--akismet-color-mid-green); + color: var(--akismet-color-white); +} + +#akismet-plugin-container button:focus-visible, +#akismet-plugin-container input:focus-visible, +#akismet-plugin-container a:focus-visible { + border: 0; + box-shadow: none; + outline: 2px solid var(--akismet-color-light-blue); +} + +.akismet-masthead { + box-shadow: none; +} + +.akismet-masthead__logo { + margin: 20px 0; +} + +.akismet-section-header { + box-shadow: none; + margin-bottom: 0; +} + +.akismet-section-header__label { + color: var(--akismet-color-charcoal); + font-weight: 600; + padding-left: 0.2em; +} + +.akismet-button, +.akismet-button:hover { + border: 0; + color: var(--akismet-color-white); +} + +.akismet-button { + background-color: var(--akismet-color-mid-green); +} + +.akismet-button:hover { + background-color: var(--akismet-color-dark-green); +} + +.akismet-external-link::after { + content: "↗"; + display: inline-block; + padding-left: 2px; + text-decoration: none; + vertical-align: text-top; +} + +/* Need this specificity to override the existing header rule */ +.akismet-new-snapshot h3.akismet-new-snapshot__header { + background: none; + font-size: 13px; + color: var(--akismet-color-charcoal); + text-align: left; + text-transform: none; +} + +.akismet-new-snapshot__number { + color: var(--akismet-color-charcoal); + display: block; + font-size: 32px; + font-weight: 400; + letter-spacing: -1px; + line-height: 1.5em; + text-align: left; +} + +.akismet-new-snapshot li.akismet-new-snapshot__item { + color: var(--akismet-color-dark-grey); + font-size: 13px; + text-align: left; + text-transform: none; +} + +.akismet-masthead__logo-link { + min-height: 50px; +} + +.akismet-masthead__back-link-container { + margin-top: 16px; + margin-bottom: 2px; +} + +/* Need this specificity to override the existing link rule */ +#akismet-plugin-container a.akismet-masthead__back-link { + background-image: url(img/arrow-left.svg); + background-position: left; + background-repeat: no-repeat; + background-size: 16px; + color: var(--akismet-color-charcoal); + font-weight: 400; + padding-left: 20px; + text-decoration: none; +} + +#akismet-plugin-container a.akismet-masthead__back-link:hover { + text-decoration: underline; +} + +.akismet-new-snapshot__item { + border-top: 1px solid var(--akismet-color-light-grey); + border-left: 1px solid var(--akismet-color-light-grey); + padding: 1em; +} + +.akismet-new-snapshot li:first-child { + border-left: none; +} + +.akismet-new-snapshot__list { + display: flex; + margin-bottom: 0; +} + +.akismet-new-snapshot__item { + flex: 1 0 33.33%; + margin-bottom: 0; + padding-left: 1.5em; + padding-right: 1.5em; +} + +.akismet-new-snapshot__chart { + padding: 1em; +} + +.akismet-box { + border: 0; +} + +.akismet-box:not(:first-child) { + margin-top: 1rem; +} + +.akismet-box, +.akismet-card { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06), 0 0 2px rgba(0, 0, 0, 0.16); + border-radius: 8px; + overflow: hidden; +} + +.akismet-card { + margin: 32px auto 0 auto; +} + +.akismet-lower { + padding-top: 0; +} + +.akismet-lower .inside { + padding: 0; +} + +.akismet-section-header__label { + margin: 0; +} + +.akismet-settings__row { + border-bottom: 1px solid var(--akismet-color-light-grey); + display: block; + padding: 1em 1.5em; +} + +.akismet-settings__row-input { + margin-left: auto; +} + +.akismet-settings__row-title { + font-weight: 500; + font-size: 1em; + margin: 0; + margin-bottom: 1em; +} + +.akismet-settings__row-description { + margin-top: 0.5em; +} + +.akismet-card-actions { + display: flex; + justify-content: flex-end; + padding: 1em; +} + +.akismet-card-actions__secondary-action { + align-self: center; + margin-right: auto; +} + +.akismet-settings__row label { + padding-bottom: 1em; +} + +.akismet-settings__row-note { + font-size: 0.9em; + margin-top: 0.4em; +} + +.akismet-settings__row input[type="checkbox"], +.akismet-settings__row input[type="radio"] { + accent-color: var(--akismet-color-mid-green); + box-shadow: none; + flex-shrink: 0; + margin: 2px 0 0 0; +} + +.akismet-settings__row input[type="checkbox"] { + margin-top: 1px; + vertical-align: top; + -webkit-appearance: checkbox; +} + +.akismet-settings__row input[type="radio"] { + -webkit-appearance: radio; +} + +/* Fix up misbehaving wp-admin styles in Chrome (from forms and colors stylesheets) */ +.akismet-settings__row input[type="checkbox"]:checked:before { + content: ''; +} + +.akismet-settings__row input[type="radio"]:checked:before { + background: none; +} + +.akismet-settings__row input[type="checkbox"]:checked:hover, +.akismet-settings__row input[type="radio"]:checked:hover { + accent-color: var(--akismet-color-mid-green); +} + +.akismet-button:disabled { + background-color: var(--akismet-color-mid-grey); + color: var(--akismet-color-white); + cursor: arrow; +} + +.akismet-awaiting-stats, +.akismet-account { + padding: 0 1rem 1rem 1rem; + margin: 0; +} + +.akismet-account { + padding-bottom: 0; +} + +.akismet-account th { + font-weight: 500; + padding-right: 1em; +} + +.akismet-account th, .akismet-account td { + padding-bottom: 1em; +} + +.akismet-settings__row-input-label { + align-items: center; + display: flex; +} + +.akismet-settings__row-label-text { + padding-left: 0.5em; + margin-top: 2px; +} + +.akismet-alert { + border-left: 8px solid; + border-radius: 8px; + margin: 20px 0; + padding: 0.2em 1em; +} + +.akismet-alert__heading { + font-size: 1em; +} + +.akismet-alert.is-good { + background-color: var(--akismet-color-notice-light-green); + border-left-color: var(--akismet-color-notice-dark-green); +} + +.akismet-alert.is-neutral { + background-color: var(--akismet-color-white); + border-left-color: var(--akismet-color-dark-grey); +} + +.akismet-alert.is-bad { + background-color: var(--akismet-color-notice-light-red); + border-left-color: var(--akismet-color-notice-dark-red); +} + +.akismet-alert.is-commercial { + background-color: var(--akismet-color-white); + border-color: var(--akismet-color-mid-grey); + border-bottom-width: 1px; + border-left-color: var(--akismet-color-notice-yellow); + display: flex; + padding-bottom: 1em; +} + +#akismet-plugin-container .akismet-alert.is-good a, +#akismet-plugin-container .akismet-alert.is-bad a { + /* For better contrast - green isn't great */ + color: var(--akismet-color-grey-80); +} + +.akismet-alert-header { + font-size: 16px; + margin-bottom: 0.5em; +} + +.akismet-alert-button-wrapper { + align-self: center; + margin-left: 2em; + min-width: 120px; +} + +.akismet-alert-info { + text-wrap: pretty; + margin: 0.5em 0; +} + +/* Setup */ +.akismet-setup-instructions__heading { + font-size: 1.375rem; + font-weight: 700; + padding-block-end: 0; +} + +h3.akismet-setup-instructions__subheading { + color: var(--akismet-color-dark-grey); + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + margin: 0 0 1.25rem; + padding-block-start: 1rem; +} + +.akismet-setup-instructions__feature-list { + list-style: none; + margin: 1rem 0.5rem 1.5rem; + max-width: 640px; + padding: 0 1rem; +} + +.akismet-setup-instructions__feature { + align-items: start; + display: flex; + margin-block-end: 1rem; + text-align: left; +} + +.akismet-setup-instructions__icon { + height: 20px; + width: 20px; +} + +.akismet-setup-instructions__body { + flex: 1; + padding-inline-start: 0.5rem; +} + +.akismet-setup-instructions__title { + color: #1d2327; + font-size: 1rem; + font-weight: 600; + line-height: 1.3; + margin: 0; + text-align: left; +} + +p.akismet-setup-instructions__text { + color: var(--akismet-color-grey-80); + font-size: 0.875rem; + line-height: 1.5; + margin: 0.25rem 0 0; + padding: 0; + text-align: left; +} + +.akismet-setup-instructions__button, +.akismet-setup-instructions__button:hover, +.akismet-setup-instructions__button:visited { + font-size: 1rem; + margin-inline-start: 1.5rem; +} + +.akismet-setup__connection { + background: var(--akismet-color-light-grey); + border: 1px solid var(--akismet-color-grey-border); + border-radius: 8px; + margin: 1rem 1rem 2rem 1rem; + padding: 1rem; +} + +.akismet-setup__connection-action:not(:last-child) { + margin-bottom: 1rem; +} + +.akismet-setup__connection-user { + display: flex; +} + +.akismet-setup__connection-avatar { + align-items: center; + display: flex; + gap: 12px; + margin-bottom: 12px; +} + +.akismet-setup__connection-avatar-image { + border-radius: 50%; +} + +.akismet-setup__connection-account-name { + color: var(--akismet-color-charcoal); + font-size: 0.9rem; + overflow-wrap: anywhere; +} + +.akismet-setup__connection-account-email { + margin-top: 0.1rem; + overflow-wrap: anywhere; +} + +.akismet-setup__connection-action { + margin-left: auto; +} + +.akismet-setup__connection-button { + text-align: center; + width: 100%; +} + +p.akismet-setup__connection-action-intro, +p.akismet-setup__connection-action-description { + color: var(--akismet-color-dark-grey); + font-size: 0.875rem; + padding: 0; +} + +p.akismet-setup__connection-action-intro { + margin: 0 0 1rem 0; +} + +p.akismet-setup__connection-action-description { + margin: 1rem 0 0; +} + +/* Setup - API key input */ +.akismet-enter-api-key-box { + margin: 1.5rem 0; +} + +.akismet-enter-api-key-box__reveal { + background: none; + border: 0; + color: var(--akismet-color-mid-green); + cursor: pointer; + text-decoration: underline; +} + +.akismet-enter-api-key-box__form-wrapper { + display: none; + margin-top: 1.5rem; +} + +.akismet-enter-api-key-box__input-wrapper { + box-sizing: border-box; + display: flex; + flex-wrap: nowrap; + padding: 0 1.5rem; + width: 100%; +} + +.akismet-enter-api-key-box__key-input { + flex-grow: 1; + margin-right: 1rem; +} + +h3.akismet-enter-api-key-box__header { + padding-top: 0; + padding-bottom: 1em; + text-align: left; +} + +/* Notices > Activation (shown on edit-comments.php) */ +#akismet-setup-prompt { + background: none; + border: none; + margin: 0; + padding: 0; + width: 100%; +} + +.akismet-activate { + align-items: center; + /* background-image is defined via an inline style in class.akismet-admin.php */ + background-color: var(--akismet-color-light-grey); + background-position: calc(100% - 1em) center; + background-repeat: no-repeat; + background-size: 140px; + border: 1px solid var(--akismet-color-mid-green); + border-left-width: 4px; + display: flex; + justify-content: space-between; + margin: 15px 0; + min-height: 60px; + overflow: hidden; + padding: 5px 160px 5px 5px; + position: relative; +} + +.akismet-activate__button, +.akismet-activate__button:hover, +.akismet-activate__button:visited { + margin: 0 1em; +} + +.akismet-activate__description { + color: var(--akismet-color-charcoal); + flex-grow: 1; + font-size: 16px; + font-weight: 600; + margin: 0 auto; + text-align: center; + text-wrap: pretty; +} + +/* Compatible plugins section */ +.akismet-compatible-plugins__content { + padding: 0 1.5em 1.5em 1.5em; +} + +.akismet-compatible-plugins__intro { + margin: 0; +} + +.akismet-compatible-plugins__section-header-label { + display: block; +} + +.akismet-compatible-plugins__section-header-label-text { + padding-right: 0.5em; +} + +.akismet-compatible-plugins__list { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(245px, 1fr)); + gap: 20px; + margin: 1.5em 0 1em 0; + padding: 0; +} + +.akismet-compatible-plugins__card { + border: 1px solid var(--akismet-color-light-grey); + border-radius: 4px; + flex: 1 1 calc(50% - 5px); + padding: 1em; + display: flex; +} + +.akismet-compatible-plugins__card-logo { + padding: 0 1.5em 0 0; + object-fit: contain; +} + +.akismet-compatible-plugins__card-title { + font-size: 1.2em; + margin-top: 0; +} + +.akismet-compatible-plugins__docs { + margin-top: 1em; +} + +.akismet-compatible-plugins__show-more { + all: unset; + cursor: pointer; + display: flex; + justify-content: space-between; + position: relative; + width: 100%; +} + +/* Generates the show/hide chevron */ +.akismet-compatible-plugins__show-more::after { + align-self: center; + border-bottom: 2px solid black; + border-right: 2px solid black; + content: ""; + height: 8px; + transform: rotate(45deg); + transition: transform 0.2s ease; + width: 8px; +} + +.akismet-compatible-plugins__list.is-expanded + .akismet-compatible-plugins__show-more::after { + align-self: end; + transform: rotate(225deg); +} + +/* Gutenberg medium breakpoint */ +@media screen and (max-width: 782px) { + .akismet-new-snapshot__list { + display: block; + } + + .akismet-new-snapshot__number { + float: right; + font-size: 20px; + font-weight: 500; + margin-top: -16px; + } + + .akismet-new-snapshot__header { + font-size: 14px; + font-weight: 500; + } + + .akismet-new-snapshot__text { + font-size: 12px; + } + + .akismet-settings__row input[type="checkbox"], + .akismet-settings__row input[type="radio"] { + height: 24px; + width: 24px; + } + + .akismet-settings__row-label-text { + padding-left: 0.8em; + } + + .akismet-settings__row input[type="checkbox"], + .akismet-settings__row input[type="radio"] { + margin-top: 0; + } + + .akismet-activate { + background-size: 120px; + padding-right: 134px; + } + + .akismet-activate__button { + white-space: normal; + } + + .akismet-activate__description { + font-size: 14px; + margin-right: 1em; + } +} + +/* Gutenberg small breakpoint */ +@media screen and (max-width: 600px) { + .akismet-compatible-plugins__list { + gap: 10px; + } + + .akismet-activate__button, + .akismet-activate__button:hover { + font-size: 13px; + } + + .akismet-activate__description { + display: none; + } +} \ No newline at end of file diff --git a/wp-content/plugins/akismet/_inc/akismet-admin.js b/wp-content/plugins/akismet/_inc/akismet-admin.js new file mode 100644 index 0000000..62b87d6 --- /dev/null +++ b/wp-content/plugins/akismet/_inc/akismet-admin.js @@ -0,0 +1,37 @@ +document.addEventListener( 'DOMContentLoaded', function() { + // Prevent aggressive iframe caching in Firefox + var statsIframe = document.getElementById( 'stats-iframe' ); + if ( statsIframe ) { + statsIframe.contentWindow.location.href = statsIframe.src; + } + + initCompatiblePluginsShowMoreToggle(); +} ); + +function initCompatiblePluginsShowMoreToggle() { + const section = document.querySelector( '.akismet-compatible-plugins' ); + const list = document.querySelector( '.akismet-compatible-plugins__list' ); + const button = document.querySelector( '.akismet-compatible-plugins__show-more' ); + + if ( ! section || ! list || ! button ) { + return; + } + + function isElementInViewport( element ) { + const rect = element.getBoundingClientRect(); + return rect.top >= 0 && rect.bottom <= window.innerHeight; + } + + function toggleCards() { + list.classList.toggle( 'is-expanded' ); + const isExpanded = list.classList.contains( 'is-expanded' ); + button.textContent = isExpanded ? button.dataset.labelOpen : button.dataset.labelClosed; + button.setAttribute( 'aria-expanded', isExpanded.toString() ); + + if ( ! isExpanded && ! isElementInViewport( section ) ) { + section.scrollIntoView( { block: 'start' } ); + } + } + + button.addEventListener( 'click', toggleCards ); +} diff --git a/wp-content/plugins/akismet/_inc/akismet-frontend.js b/wp-content/plugins/akismet/_inc/akismet-frontend.js new file mode 100644 index 0000000..40ebfe6 --- /dev/null +++ b/wp-content/plugins/akismet/_inc/akismet-frontend.js @@ -0,0 +1,376 @@ +/** + * Observe how the user enters content into the comment form in order to determine whether it's a bot or not. + * + * Note that no actual input is being saved here, only counts and timings between events. + */ + +( function() { + // Passive event listeners are guaranteed to never call e.preventDefault(), + // but they're not supported in all browsers. Use this feature detection + // to determine whether they're available for use. + var supportsPassive = false; + + try { + var opts = Object.defineProperty( {}, 'passive', { + get : function() { + supportsPassive = true; + } + } ); + + window.addEventListener( 'testPassive', null, opts ); + window.removeEventListener( 'testPassive', null, opts ); + } catch ( e ) {} + + function init() { + var input_begin = ''; + + var keydowns = {}; + var lastKeyup = null; + var lastKeydown = null; + var keypresses = []; + + var modifierKeys = []; + var correctionKeys = []; + + var lastMouseup = null; + var lastMousedown = null; + var mouseclicks = []; + + var mousemoveTimer = null; + var lastMousemoveX = null; + var lastMousemoveY = null; + var mousemoveStart = null; + var mousemoves = []; + + var touchmoveCountTimer = null; + var touchmoveCount = 0; + + var lastTouchEnd = null; + var lastTouchStart = null; + var touchEvents = []; + + var scrollCountTimer = null; + var scrollCount = 0; + + var correctionKeyCodes = [ 'Backspace', 'Delete', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown' ]; + var modifierKeyCodes = [ 'Shift', 'CapsLock' ]; + + var forms = document.querySelectorAll( 'form[method=post]' ); + + for ( var i = 0; i < forms.length; i++ ) { + var form = forms[i]; + + var formAction = form.getAttribute( 'action' ); + + // Ignore forms that POST directly to other domains; these could be things like payment forms. + if ( formAction ) { + // Check that the form is posting to an external URL, not a path. + if ( formAction.indexOf( 'http://' ) == 0 || formAction.indexOf( 'https://' ) == 0 ) { + if ( formAction.indexOf( 'http://' + window.location.hostname + '/' ) != 0 && formAction.indexOf( 'https://' + window.location.hostname + '/' ) != 0 ) { + continue; + } + } + } + + form.addEventListener( 'submit', function () { + var ak_bkp = prepare_timestamp_array_for_request( keypresses ); + var ak_bmc = prepare_timestamp_array_for_request( mouseclicks ); + var ak_bte = prepare_timestamp_array_for_request( touchEvents ); + var ak_bmm = prepare_timestamp_array_for_request( mousemoves ); + + var input_fields = { + // When did the user begin entering any input? + 'bib': input_begin, + + // When was the form submitted? + 'bfs': Date.now(), + + // How many keypresses did they make? + 'bkpc': keypresses.length, + + // How quickly did they press a sample of keys, and how long between them? + 'bkp': ak_bkp, + + // How quickly did they click the mouse, and how long between clicks? + 'bmc': ak_bmc, + + // How many mouseclicks did they make? + 'bmcc': mouseclicks.length, + + // When did they press modifier keys (like Shift or Capslock)? + 'bmk': modifierKeys.join( ';' ), + + // When did they correct themselves? e.g., press Backspace, or use the arrow keys to move the cursor back + 'bck': correctionKeys.join( ';' ), + + // How many times did they move the mouse? + 'bmmc': mousemoves.length, + + // How many times did they move around using a touchscreen? + 'btmc': touchmoveCount, + + // How many times did they scroll? + 'bsc': scrollCount, + + // How quickly did they perform touch events, and how long between them? + 'bte': ak_bte, + + // How many touch events were there? + 'btec' : touchEvents.length, + + // How quickly did they move the mouse, and how long between moves? + 'bmm' : ak_bmm + }; + + var akismet_field_prefix = 'ak_'; + + if ( this.getElementsByClassName ) { + // Check to see if we've used an alternate field name prefix. We store this as an attribute of the container around some of the Akismet fields. + var possible_akismet_containers = this.getElementsByClassName( 'akismet-fields-container' ); + + for ( var containerIndex = 0; containerIndex < possible_akismet_containers.length; containerIndex++ ) { + var container = possible_akismet_containers.item( containerIndex ); + + if ( container.getAttribute( 'data-prefix' ) ) { + akismet_field_prefix = container.getAttribute( 'data-prefix' ); + break; + } + } + } + + for ( var field_name in input_fields ) { + var field = document.createElement( 'input' ); + field.setAttribute( 'type', 'hidden' ); + field.setAttribute( 'name', akismet_field_prefix + field_name ); + field.setAttribute( 'value', input_fields[ field_name ] ); + this.appendChild( field ); + } + }, supportsPassive ? { passive: true } : false ); + + form.addEventListener( 'keydown', function ( e ) { + // If you hold a key down, some browsers send multiple keydown events in a row. + // Ignore any keydown events for a key that hasn't come back up yet. + if ( e.key in keydowns ) { + return; + } + + var keydownTime = ( new Date() ).getTime(); + keydowns[ e.key ] = [ keydownTime ]; + + if ( ! input_begin ) { + input_begin = keydownTime; + } + + // In some situations, we don't want to record an interval since the last keypress -- for example, + // on the first keypress, or on a keypress after focus has changed to another element. Normally, + // we want to record the time between the last keyup and this keydown. But if they press a + // key while already pressing a key, we want to record the time between the two keydowns. + + var lastKeyEvent = Math.max( lastKeydown, lastKeyup ); + + if ( lastKeyEvent ) { + keydowns[ e.key ].push( keydownTime - lastKeyEvent ); + } + + lastKeydown = keydownTime; + }, supportsPassive ? { passive: true } : false ); + + form.addEventListener( 'keyup', function ( e ) { + if ( ! ( e.key in keydowns ) ) { + // This key was pressed before this script was loaded, or a mouseclick happened during the keypress, or... + return; + } + + var keyupTime = ( new Date() ).getTime(); + + if ( 'TEXTAREA' === e.target.nodeName || 'INPUT' === e.target.nodeName ) { + if ( -1 !== modifierKeyCodes.indexOf( e.key ) ) { + modifierKeys.push( keypresses.length - 1 ); + } else if ( -1 !== correctionKeyCodes.indexOf( e.key ) ) { + correctionKeys.push( keypresses.length - 1 ); + } else { + // ^ Don't record timings for keys like Shift or backspace, since they + // typically get held down for longer than regular typing. + + var keydownTime = keydowns[ e.key ][0]; + + var keypress = []; + + // Keypress duration. + keypress.push( keyupTime - keydownTime ); + + // Amount of time between this keypress and the previous keypress. + if ( keydowns[ e.key ].length > 1 ) { + keypress.push( keydowns[ e.key ][1] ); + } + + keypresses.push( keypress ); + } + } + + delete keydowns[ e.key ]; + + lastKeyup = keyupTime; + }, supportsPassive ? { passive: true } : false ); + + form.addEventListener( "focusin", function ( e ) { + lastKeydown = null; + lastKeyup = null; + keydowns = {}; + }, supportsPassive ? { passive: true } : false ); + + form.addEventListener( "focusout", function ( e ) { + lastKeydown = null; + lastKeyup = null; + keydowns = {}; + }, supportsPassive ? { passive: true } : false ); + } + + document.addEventListener( 'mousedown', function ( e ) { + lastMousedown = ( new Date() ).getTime(); + }, supportsPassive ? { passive: true } : false ); + + document.addEventListener( 'mouseup', function ( e ) { + if ( ! lastMousedown ) { + // If the mousedown happened before this script was loaded, but the mouseup happened after... + return; + } + + var now = ( new Date() ).getTime(); + + var mouseclick = []; + mouseclick.push( now - lastMousedown ); + + if ( lastMouseup ) { + mouseclick.push( lastMousedown - lastMouseup ); + } + + mouseclicks.push( mouseclick ); + + lastMouseup = now; + + // If the mouse has been clicked, don't record this time as an interval between keypresses. + lastKeydown = null; + lastKeyup = null; + keydowns = {}; + }, supportsPassive ? { passive: true } : false ); + + document.addEventListener( 'mousemove', function ( e ) { + if ( mousemoveTimer ) { + clearTimeout( mousemoveTimer ); + mousemoveTimer = null; + } + else { + mousemoveStart = ( new Date() ).getTime(); + lastMousemoveX = e.offsetX; + lastMousemoveY = e.offsetY; + } + + mousemoveTimer = setTimeout( function ( theEvent, originalMousemoveStart ) { + var now = ( new Date() ).getTime() - 500; // To account for the timer delay. + + var mousemove = []; + mousemove.push( now - originalMousemoveStart ); + mousemove.push( + Math.round( + Math.sqrt( + Math.pow( theEvent.offsetX - lastMousemoveX, 2 ) + + Math.pow( theEvent.offsetY - lastMousemoveY, 2 ) + ) + ) + ); + + if ( mousemove[1] > 0 ) { + // If there was no measurable distance, then it wasn't really a move. + mousemoves.push( mousemove ); + } + + mousemoveStart = null; + mousemoveTimer = null; + }, 500, e, mousemoveStart ); + }, supportsPassive ? { passive: true } : false ); + + document.addEventListener( 'touchmove', function ( e ) { + if ( touchmoveCountTimer ) { + clearTimeout( touchmoveCountTimer ); + } + + touchmoveCountTimer = setTimeout( function () { + touchmoveCount++; + }, 500 ); + }, supportsPassive ? { passive: true } : false ); + + document.addEventListener( 'touchstart', function ( e ) { + lastTouchStart = ( new Date() ).getTime(); + }, supportsPassive ? { passive: true } : false ); + + document.addEventListener( 'touchend', function ( e ) { + if ( ! lastTouchStart ) { + // If the touchstart happened before this script was loaded, but the touchend happened after... + return; + } + + var now = ( new Date() ).getTime(); + + var touchEvent = []; + touchEvent.push( now - lastTouchStart ); + + if ( lastTouchEnd ) { + touchEvent.push( lastTouchStart - lastTouchEnd ); + } + + touchEvents.push( touchEvent ); + + lastTouchEnd = now; + + // Don't record this time as an interval between keypresses. + lastKeydown = null; + lastKeyup = null; + keydowns = {}; + }, supportsPassive ? { passive: true } : false ); + + document.addEventListener( 'scroll', function ( e ) { + if ( scrollCountTimer ) { + clearTimeout( scrollCountTimer ); + } + + scrollCountTimer = setTimeout( function () { + scrollCount++; + }, 500 ); + }, supportsPassive ? { passive: true } : false ); + } + + /** + * For the timestamp data that is collected, don't send more than `limit` data points in the request. + * Choose a random slice and send those. + */ + function prepare_timestamp_array_for_request( a, limit ) { + if ( ! limit ) { + limit = 100; + } + + var rv = ''; + + if ( a.length > 0 ) { + var random_starting_point = Math.max( 0, Math.floor( Math.random() * a.length - limit ) ); + + for ( var i = 0; i < limit && i < a.length; i++ ) { + rv += a[ random_starting_point + i ][0]; + + if ( a[ random_starting_point + i ].length >= 2 ) { + rv += "," + a[ random_starting_point + i ][1]; + } + + rv += ";"; + } + } + + return rv; + } + + if ( document.readyState !== 'loading' ) { + init(); + } else { + document.addEventListener( 'DOMContentLoaded', init ); + } +})(); \ No newline at end of file diff --git a/wp-content/plugins/akismet/_inc/akismet.css b/wp-content/plugins/akismet/_inc/akismet.css new file mode 100644 index 0000000..be279a2 --- /dev/null +++ b/wp-content/plugins/akismet/_inc/akismet.css @@ -0,0 +1,462 @@ +.wp-admin.jetpack_page_akismet-key-config, .wp-admin.settings_page_akismet-key-config { + background-color:#f3f6f8; +} + +#submitted-on { + position: relative; +} +#the-comment-list .author .akismet-user-comment-count { + display: inline; +} +#the-comment-list .author a span { + text-decoration: none; + color: #999; +} +#the-comment-list .author a span.akismet-span-link { + text-decoration: inherit; + color: inherit; +} +#the-comment-list .akismet_remove_url { + margin-left: 3px; + color: #999; + padding: 2px 3px 2px 0; +} +#the-comment-list .akismet_remove_url:hover { + color: #A7301F; + font-weight: bold; + padding: 2px 2px 2px 0; +} +#dashboard_recent_comments .akismet-status { + display: none; +} +.akismet-status { + float: right; +} +.akismet-status a { + color: #AAA; + font-style: italic; +} +table.comments td.comment p a { + text-decoration: underline; +} +table.comments td.comment p a:after { + content: attr(href); + color: #aaa; + display: inline-block; /* Show the URL without the link's underline extending under it. */ + padding: 0 1ex; /* Because it's inline block, we can't just use spaces in the content: attribute to separate it from the link text. */ +} +.mshot-arrow { + width: 0; + height: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + border-right: 10px solid #5C5C5C; + position: absolute; + left: -6px; + top: 91px; +} +.mshot-container { + background: #5C5C5C; + position: absolute; + top: -94px; + padding: 7px; + width: 450px; + height: 338px; + z-index: 20000; + border-radius: 6px; +} +.akismet-mshot { + position: absolute; + z-index: 100; +} +.akismet-mshot .mshot-image { + margin: 0; + height: 338px; + width: 450px; +} +.checkforspam { + display: inline-block !important; +} + +.checkforspam-spinner { + display: inline-block; + margin-top: 7px; +} + +.akismet-right { + float: right; +} + +.akismet-card .akismet-right { + margin: 1em 0; +} + +.akismet-new-snapshot { + margin-top: 1em; + text-align: center; + background: #fff; +} + +.akismet-new-snapshot h3 { + background: #f5f5f5; + color: #888; + font-size: 11px; + margin: 0; +} + +.akismet-new-snapshot ul li { + color: #999; + font-size: 11px; + text-transform: uppercase; + box-sizing: border-box; +} + + +.akismet-settings th:first-child { + vertical-align: top; + padding-top: 15px; +} + +.akismet-settings th.akismet-api-key { + vertical-align: middle; + padding-top: 0; +} + +.akismet-settings span.akismet-note { + float: left; + padding-left: 23px; + font-size: 75%; + margin-top: -10px; +} + +.jetpack_page_akismet-key-config #wpcontent, .settings_page_akismet-key-config #wpcontent { + padding-left: 0; +} + +.akismet-masthead { + background-color:#fff; + text-align:center; + box-shadow:0 1px 0 rgba(200,215,225,0.5),0 1px 2px #e9eff3 +} + +@media (max-width: 45rem) { + .akismet-masthead { + padding:0 1.25rem + } +} + +.akismet-masthead__inside-container { + padding:.375rem 0; + margin:0 auto; + width:100%; + max-width:45rem; + text-align: left; +} +.akismet-masthead__logo-container { + padding:.3125rem 0 0 +} +.akismet-masthead__logo-link { + display:inline-block; + outline:none; + vertical-align:middle +} +.akismet-masthead__logo-link:focus { + line-height:0; + box-shadow:0 0 0 2px #78dcfa +} +.akismet-masthead__logo-link+code { + margin:0 10px; + padding:5px 9px; + border-radius:2px; + background:#e6ecf1; + color:#647a88 +} +.akismet-masthead__links { + display:flex; + flex-flow:row wrap; + flex:2 50%; + justify-content:flex-end; + margin:0 +} +@media (max-width: 480px) { + .akismet-masthead__links { + padding-right:.625rem + } +} +.akismet-masthead__link-li { + margin:0; + padding:0 +} +.akismet-masthead__link { + font-style:normal; + color:#0087be; + padding:.625rem; + display:inline-block +} +.akismet-masthead__link:visited { + color:#0087be +} +.akismet-masthead__link:active,.akismet-masthead__link:hover { + color:#00aadc +} +.akismet-masthead__link:hover { + text-decoration:underline +} +.akismet-masthead__link .dashicons { + display:none +} +@media (max-width: 480px) { + .akismet-masthead__link:hover,.akismet-masthead__link:active { + text-decoration:none + } + .akismet-masthead__link .dashicons { + display:block; + font-size:1.75rem + } + .akismet-masthead__link span+span { + display:none + } +} +.akismet-masthead__link-li:last-of-type .akismet-masthead__link { + padding-right:0 +} + +.akismet-lower { + margin: 0 auto; + text-align: left; + max-width: 45rem; + padding: 1.5rem; +} + +.akismet-lower .notice { + margin-bottom: 2rem; +} + +.akismet-card { + margin-top: 1rem; + margin-bottom: 0; + position: relative; + box-sizing: border-box; + background: white; +} + +.akismet-card:after, .akismet-card .inside:after, .akismet-masthead__logo-container:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +.akismet-card .inside { + padding: 1.5rem; + padding-top: 1rem; +} + +.akismet-card .akismet-card-actions { + margin-top: 1rem; +} + +.jetpack_page_akismet-key-config .update-nag, .settings_page_akismet-key-config .update-nag { + display: none; +} + +.akismet-masthead .akismet-right { + line-height: 2.125rem; + font-size: 0.9rem; +} + +.akismet-box { + box-sizing: border-box; + background: white; + border: 1px solid rgba(200, 215, 225, 0.5); +} + +.akismet-box h2, .akismet-box h3 { + padding: 1.5rem 1.5rem .5rem 1.5rem; + margin: 0; +} + +.akismet-box p { + padding: 0 1.5rem 1.5rem 1.5rem; + margin: 0; +} + +.akismet-box p:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +.akismet-box .akismet-right { + padding-right: 1.5rem; +} + +.akismet-boxes .akismet-box { + margin-bottom: 0; + padding: 0; + margin-top: -1px; +} + +.akismet-boxes .akismet-box:last-child { + margin-bottom: 1.5rem; +} + +.akismet-boxes .akismet-box:first-child { + margin-top: 1.5rem; +} + +.akismet-box .centered { + text-align: center; +} + +.akismet-button, .akismet-button:hover, .akismet-button:visited { + background: white; + border-color: #c8d7e1; + border-style: solid; + border-width: 1px 1px 2px; + color: #2e4453; + cursor: pointer; + display: inline-block; + margin: 0; + outline: 0; + overflow: hidden; + font-size: 14px; + font-weight: 500; + text-overflow: ellipsis; + text-decoration: none; + vertical-align: top; + box-sizing: border-box; + line-height: 21px; + border-radius: 4px; + padding: 7px 14px 9px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.akismet-button:hover { + border-color: #a8bece; +} + +.akismet-button:active { + border-width: 2px 1px 1px; +} + +.akismet-is-primary, .akismet-is-primary:hover, .akismet-is-primary:visited { + background: #00aadc; + border-color: #0087be; + color: white; +} + +.akismet-is-primary:hover, .akismet-is-primary:focus { + border-color: #005082; +} + +.akismet-is-primary:hover { + border-color: #005082; +} + +.akismet-section-header { + position: relative; + margin: 0 auto 0.625rem auto; + padding: 1rem; + box-sizing: border-box; + box-shadow: 0 0 0 1px rgba(200, 215, 225, 0.5), 0 1px 2px #e9eff3; + background: #ffffff; + width: 100%; + padding-top: 0.6875rem; + padding-bottom: 0.6875rem; + display: flex; +} + +.akismet-section-header__label { + display: flex; + align-items: center; + flex-grow: 1; + line-height: 1.75rem; + position: relative; + font-size: 0.875rem; + color: #4f748e; +} + +.akismet-section-header__actions { + line-height: 1.75rem; +} + +.akismet-setup-instructions form { + padding-bottom: 1.5rem; +} + +.akismet-setup-instructions > a.akismet-button { + display: inline-block; + margin-bottom: 1.5rem; +} + +div.error.akismet-usage-limit-alert { + padding: 25px 45px 25px 15px; + display: flex; + align-items: center; +} + +#akismet-plugin-container .akismet-usage-limit-alert { + margin: 0 auto 0.625rem auto; + box-sizing: border-box; + box-shadow: 0 0 0 1px rgba(200, 215, 225, 0.5), 0 1px 2px #e9eff3; + border: none; + border-left: 4px solid #d63638; +} + +.akismet-usage-limit-alert .akismet-usage-limit-logo { + width: 38px; + min-width: 38px; + height: 38px; + border-radius: 20px; + margin-right: 18px; + background: black; + position: relative; +} + +.akismet-usage-limit-alert .akismet-usage-limit-logo img { + position: absolute; + width: 22px; + left: 8px; + top: 10px; +} + +.akismet-usage-limit-alert .akismet-usage-limit-text { + flex-grow: 1; + margin-right: 18px; +} + +.akismet-usage-limit-alert h3 { + line-height: 1.3; + margin: 0; +} + +.akismet-usage-limit-alert .akismet-usage-limit-cta { + border-color: none; + text-align: right; +} + +#akismet-plugin-container .akismet-usage-limit-cta a { + color: #d63638; + background: #fafafa; +} + +@media (max-width: 550px) { + div.error.akismet-usage-limit-alert { + display: block; + } + + .akismet-usage-limit-alert .akismet-usage-limit-logo, + .akismet-usage-limit-alert .akismet-usage-limit-text { + margin-bottom: 15px; + } + + .akismet-usage-limit-alert .akismet-usage-limit-cta { + text-align: left; + } +} \ No newline at end of file diff --git a/wp-content/plugins/akismet/_inc/akismet.js b/wp-content/plugins/akismet/_inc/akismet.js new file mode 100644 index 0000000..8a874d0 --- /dev/null +++ b/wp-content/plugins/akismet/_inc/akismet.js @@ -0,0 +1,397 @@ +jQuery( function ( $ ) { + var mshotRemovalTimer = null; + var mshotRetryTimer = null; + var mshotTries = 0; + var mshotRetryInterval = 1000; + var mshotEnabledLinkSelector = 'a[id^="author_comment_url"], tr.pingback td.column-author a:first-of-type, td.comment p a'; + + var preloadedMshotURLs = []; + + $('.akismet-status').each(function () { + var thisId = $(this).attr('commentid'); + $(this).prependTo('#comment-' + thisId + ' .column-comment'); + }); + $('.akismet-user-comment-count').each(function () { + var thisId = $(this).attr('commentid'); + $(this).insertAfter('#comment-' + thisId + ' .author strong:first').show(); + }); + + akismet_enable_comment_author_url_removal(); + + $( '#the-comment-list' ).on( 'click', '.akismet_remove_url', function () { + var thisId = $(this).attr('commentid'); + var data = { + action: 'comment_author_deurl', + _wpnonce: WPAkismet.comment_author_url_nonce, + id: thisId + }; + $.ajax({ + url: ajaxurl, + type: 'POST', + data: data, + beforeSend: function () { + // Removes "x" link + $("a[commentid='"+ thisId +"']").hide(); + // Show temp status + $("#author_comment_url_"+ thisId).html( $( '' ).text( WPAkismet.strings['Removing...'] ) ); + }, + success: function (response) { + if (response) { + // Show status/undo link + $("#author_comment_url_"+ thisId) + .attr('cid', thisId) + .addClass('akismet_undo_link_removal') + .html( + $( '' ).text( WPAkismet.strings['URL removed'] ) + ) + .append( ' ' ) + .append( + $( '' ) + .text( WPAkismet.strings['(undo)'] ) + .addClass( 'akismet-span-link' ) + ); + } + } + }); + + return false; + }).on( 'click', '.akismet_undo_link_removal', function () { + var thisId = $(this).attr('cid'); + var thisUrl = $(this).attr('href'); + var data = { + action: 'comment_author_reurl', + _wpnonce: WPAkismet.comment_author_url_nonce, + id: thisId, + url: thisUrl + }; + $.ajax({ + url: ajaxurl, + type: 'POST', + data: data, + beforeSend: function () { + // Show temp status + $("#author_comment_url_"+ thisId).html( $( '' ).text( WPAkismet.strings['Re-adding...'] ) ); + }, + success: function (response) { + if (response) { + // Add "x" link + $("a[commentid='"+ thisId +"']").show(); + // Show link. Core strips leading http://, so let's do that too. + $("#author_comment_url_"+ thisId).removeClass('akismet_undo_link_removal').text( thisUrl.replace( /^http:\/\/(www\.)?/ig, '' ) ); + } + } + }); + + return false; + }); + + // Show a preview image of the hovered URL. Applies to author URLs and URLs inside the comments. + if ( "enable_mshots" in WPAkismet && WPAkismet.enable_mshots ) { + $( '#the-comment-list' ).on( 'mouseover', mshotEnabledLinkSelector, function () { + clearTimeout( mshotRemovalTimer ); + + if ( $( '.akismet-mshot' ).length > 0 ) { + if ( $( '.akismet-mshot:first' ).data( 'link' ) == this ) { + // The preview is already showing for this link. + return; + } + else { + // A new link is being hovered, so remove the old preview. + $( '.akismet-mshot' ).remove(); + } + } + + clearTimeout( mshotRetryTimer ); + + var linkUrl = $( this ).attr( 'href' ); + + if ( preloadedMshotURLs.indexOf( linkUrl ) !== -1 ) { + // This preview image was already preloaded, so begin with a retry URL so the user doesn't see the placeholder image for the first second. + mshotTries = 2; + } + else { + mshotTries = 1; + } + + var mShot = $( '
' ); + mShot.data( 'link', this ); + mShot.data( 'url', linkUrl ); + + mShot.find( 'img' ).on( 'load', function () { + $( '.akismet-mshot' ).data( 'pending-request', false ); + } ); + + var offset = $( this ).offset(); + + mShot.offset( { + left : Math.min( $( window ).width() - 475, offset.left + $( this ).width() + 10 ), // Keep it on the screen if the link is near the edge of the window. + top: offset.top + ( $( this ).height() / 2 ) - 101 // 101 = top offset of the arrow plus the top border thickness + } ); + + $( 'body' ).append( mShot ); + + mshotRetryTimer = setTimeout( retryMshotUntilLoaded, mshotRetryInterval ); + } ).on( 'mouseout', 'a[id^="author_comment_url"], tr.pingback td.column-author a:first-of-type, td.comment p a', function () { + mshotRemovalTimer = setTimeout( function () { + clearTimeout( mshotRetryTimer ); + + $( '.akismet-mshot' ).remove(); + }, 200 ); + } ); + + var preloadDelayTimer = null; + + $( window ).on( 'scroll resize', function () { + clearTimeout( preloadDelayTimer ); + + preloadDelayTimer = setTimeout( preloadMshotsInViewport, 500 ); + } ); + + preloadMshotsInViewport(); + } + + /** + * The way mShots works is if there was no screenshot already recently generated for the URL, + * it returns a "loading..." image for the first request. Then, some subsequent request will + * receive the actual screenshot, but it's unknown how long it will take. So, what we do here + * is continually re-request the mShot, waiting a second after every response until we get the + * actual screenshot. + */ + function retryMshotUntilLoaded() { + clearTimeout( mshotRetryTimer ); + + var imageWidth = $( '.akismet-mshot img' ).get(0).naturalWidth; + + if ( imageWidth == 0 ) { + // It hasn't finished loading yet the first time. Check again shortly. + setTimeout( retryMshotUntilLoaded, mshotRetryInterval ); + } + else if ( imageWidth == 400 ) { + // It loaded the preview image. + + if ( mshotTries == 20 ) { + // Give up if we've requested the mShot 20 times already. + return; + } + + if ( ! $( '.akismet-mshot' ).data( 'pending-request' ) ) { + $( '.akismet-mshot' ).data( 'pending-request', true ); + + mshotTries++; + + $( '.akismet-mshot .mshot-image' ).attr( 'src', akismet_mshot_url( $( '.akismet-mshot' ).data( 'url' ), mshotTries ) ); + } + + mshotRetryTimer = setTimeout( retryMshotUntilLoaded, mshotRetryInterval ); + } + else { + // All done. + } + } + + function preloadMshotsInViewport() { + var windowWidth = $( window ).width(); + var windowHeight = $( window ).height(); + + $( '#the-comment-list' ).find( mshotEnabledLinkSelector ).each( function ( index, element ) { + var linkUrl = $( this ).attr( 'href' ); + + // Don't attempt to preload an mshot for a single link twice. + if ( preloadedMshotURLs.indexOf( linkUrl ) !== -1 ) { + // The URL is already preloaded. + return true; + } + + if ( typeof element.getBoundingClientRect !== 'function' ) { + // The browser is too old. Return false to stop this preloading entirely. + return false; + } + + var rect = element.getBoundingClientRect(); + + if ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= windowHeight && rect.right <= windowWidth ) { + akismet_preload_mshot( linkUrl ); + $( this ).data( 'akismet-mshot-preloaded', true ); + } + } ); + } + + $( '.checkforspam.enable-on-load' ).on( 'click', function( e ) { + if ( $( this ).hasClass( 'ajax-disabled' ) ) { + // Akismet hasn't been configured yet. Allow the user to proceed to the button's link. + return; + } + + e.preventDefault(); + + if ( $( this ).hasClass( 'button-disabled' ) ) { + window.location.href = $( this ).data( 'success-url' ).replace( '__recheck_count__', 0 ).replace( '__spam_count__', 0 ); + return; + } + + $('.checkforspam').addClass('button-disabled').addClass( 'checking' ); + $('.checkforspam-spinner').addClass( 'spinner' ).addClass( 'is-active' ); + + akismet_check_for_spam(0, 100); + }).removeClass( 'button-disabled' ); + + var spam_count = 0; + var recheck_count = 0; + + function akismet_check_for_spam(offset, limit) { + var check_for_spam_buttons = $( '.checkforspam' ); + + var nonce = check_for_spam_buttons.data( 'nonce' ); + + // We show the percentage complete down to one decimal point so even queues with 100k + // pending comments will show some progress pretty quickly. + var percentage_complete = Math.round( ( recheck_count / check_for_spam_buttons.data( 'pending-comment-count' ) ) * 1000 ) / 10; + + // Update the progress counter on the "Check for Spam" button. + $( '.checkforspam' ).text( check_for_spam_buttons.data( 'progress-label' ).replace( '%1$s', percentage_complete ) ); + + $.post( + ajaxurl, + { + 'action': 'akismet_recheck_queue', + 'offset': offset, + 'limit': limit, + 'nonce': nonce + }, + function(result) { + if ( 'error' in result ) { + // An error is only returned in the case of a missing nonce, so we don't need the actual error message. + window.location.href = check_for_spam_buttons.data( 'failure-url' ); + return; + } + + recheck_count += result.counts.processed; + spam_count += result.counts.spam; + + if (result.counts.processed < limit) { + window.location.href = check_for_spam_buttons.data( 'success-url' ).replace( '__recheck_count__', recheck_count ).replace( '__spam_count__', spam_count ); + } + else { + // Account for comments that were caught as spam and moved out of the queue. + akismet_check_for_spam(offset + limit - result.counts.spam, limit); + } + } + ); + } + + if ( "start_recheck" in WPAkismet && WPAkismet.start_recheck ) { + $( '.checkforspam:first' ).click(); + } + + if ( typeof MutationObserver !== 'undefined' ) { + // Dynamically add the "X" next the the author URL links when a comment is quick-edited. + var comment_list_container = document.getElementById( 'the-comment-list' ); + + if ( comment_list_container ) { + var observer = new MutationObserver( function ( mutations ) { + for ( var i = 0, _len = mutations.length; i < _len; i++ ) { + if ( mutations[i].addedNodes.length > 0 ) { + akismet_enable_comment_author_url_removal(); + + // Once we know that we'll have to check for new author links, skip the rest of the mutations. + break; + } + } + } ); + + observer.observe( comment_list_container, { attributes: true, childList: true, characterData: true } ); + } + } + + function akismet_enable_comment_author_url_removal() { + $( '#the-comment-list' ) + .find( 'tr.comment, tr[id ^= "comment-"]' ) + .find( '.column-author a[href^="http"]:first' ) // Ignore mailto: links, which would be the comment author's email. + .each(function () { + if ( $( this ).parent().find( '.akismet_remove_url' ).length > 0 ) { + return; + } + + var linkHref = $(this).attr( 'href' ); + + // Ignore any links to the current domain, which are diagnostic tools, like the IP address link + // or any other links another plugin might add. + var currentHostParts = document.location.href.split( '/' ); + var currentHost = currentHostParts[0] + '//' + currentHostParts[2] + '/'; + + if ( linkHref.indexOf( currentHost ) != 0 ) { + var thisCommentId = $(this).parents('tr:first').attr('id').split("-"); + + $(this) + .attr("id", "author_comment_url_"+ thisCommentId[1]) + .after( + $( 'x' ) + .attr( 'commentid', thisCommentId[1] ) + .attr( 'title', WPAkismet.strings['Remove this URL'] ) + ); + } + }); + } + + /** + * Generate an mShot URL if given a link URL. + * + * @param string linkUrl + * @param int retry If retrying a request, the number of the retry. + * @return string The mShot URL; + */ + function akismet_mshot_url( linkUrl, retry ) { + var mshotUrl = '//s0.wp.com/mshots/v1/' + encodeURIComponent( linkUrl ) + '?w=900'; + + if ( retry > 1 ) { + mshotUrl += '&r=' + encodeURIComponent( retry ); + } + + mshotUrl += '&source=akismet'; + + return mshotUrl; + } + + /** + * Begin loading an mShot preview of a link. + * + * @param string linkUrl + */ + function akismet_preload_mshot( linkUrl ) { + var img = new Image(); + img.src = akismet_mshot_url( linkUrl ); + + preloadedMshotURLs.push( linkUrl ); + } + + $( '.akismet-could-be-primary' ).each( function () { + var form = $( this ).closest( 'form' ); + + form.data( 'initial-state', form.serialize() ); + + form.on( 'change keyup', function () { + var self = $( this ); + var submit_button = self.find( '.akismet-could-be-primary' ); + + if ( self.serialize() != self.data( 'initial-state' ) ) { + submit_button.addClass( 'akismet-is-primary' ); + } + else { + submit_button.removeClass( 'akismet-is-primary' ); + } + } ); + } ); + + /** + * Shows the Enter API key form + */ + $( '.akismet-enter-api-key-box__reveal' ).on( 'click', function ( e ) { + e.preventDefault(); + + var div = $( '.akismet-enter-api-key-box__form-wrapper' ); + div.show( 500 ); + div.find( 'input[name=key]' ).focus(); + + $( this ).hide(); + } ); +}); diff --git a/wp-content/plugins/akismet/_inc/fonts/inter.css b/wp-content/plugins/akismet/_inc/fonts/inter.css new file mode 100644 index 0000000..d28b612 --- /dev/null +++ b/wp-content/plugins/akismet/_inc/fonts/inter.css @@ -0,0 +1,67 @@ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("https://s0.wp.com/i/fonts/inter/Inter-Regular.woff2?v=3.19") format("woff2"), + url("https://s0.wp.com/i/fonts/inter/Inter-Regular.woff?v=3.19") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url("https://s0.wp.com/i/fonts/inter/Inter-Italic.woff2?v=3.19") format("woff2"), + url("https://s0.wp.com/i/fonts/inter/Inter-Italic.woff?v=3.19") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url("https://s0.wp.com/i/fonts/inter/Inter-Medium.woff2?v=3.19") format("woff2"), + url("https://s0.wp.com/i/fonts/inter/Inter-Medium.woff?v=3.19") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 500; + font-display: swap; + src: url("https://s0.wp.com/i/fonts/inter/Inter-MediumItalic.woff2?v=3.19") format("woff2"), + url("https://s0.wp.com/i/fonts/inter/Inter-MediumItalic.woff?v=3.19") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url("https://s0.wp.com/i/fonts/inter/Inter-SemiBold.woff2?v=3.19") format("woff2"), + url("https://s0.wp.com/i/fonts/inter/Inter-SemiBold.woff?v=3.19") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 600; + font-display: swap; + src: url("https://s0.wp.com/i/fonts/inter/Inter-SemiBoldItalic.woff2?v=3.19") format("woff2"), + url("https://s0.wp.com/i/fonts/inter/Inter-SemiBoldItalic.woff?v=3.19") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url("https://s0.wp.com/i/fonts/inter/Inter-Bold.woff2?v=3.19") format("woff2"), + url("https://s0.wp.com/i/fonts/inter/Inter-Bold.woff?v=3.19") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: url("https://s0.wp.com/i/fonts/inter/Inter-BoldItalic.woff2?v=3.19") format("woff2"), + url("https://s0.wp.com/i/fonts/inter/Inter-BoldItalic.woff?v=3.19") format("woff"); +} diff --git a/wp-content/plugins/akismet/_inc/img/akismet-activation-banner-elements.png b/wp-content/plugins/akismet/_inc/img/akismet-activation-banner-elements.png new file mode 100644 index 0000000000000000000000000000000000000000..843356b40bbc312a54390bd3f3660081e364719c GIT binary patch literal 5767 zcmd5=hdY~Z)Q%#85G(c`CH5AnT_chZ2}(=tQaftzwnkAkTeGSyr8QeST6+{VO3hle zN0p*Kv*b&^@1OY2bv^5T@8^Ecb%E>tGgBi5I&L}u0Kj03)W-t=6g}j5CWw;U z_q82tk_QTZypbNDYM6Hm0H6ezVJr-c2pBSMS!SsntxcXF(~+oXOQbha)Eh}&D&5C` zKp;e-DI(AmTkT82+G|H+8NguGIIKzt77PNZhMPbb8I@v<5YhiQ8sS*wa6|PN6a$zJ z+vtm}b|V?tlZ>p?qS4Bc7(|4rO0=Wz`c9^etv$w zJ_K)XUoS5oPfu@mch9?bJ>1;fU0vN=TwI-q?d=`yZrj`1*xB5&wYIu>n1{qo<{%qp6{N4WWrp*MO_3s%u>N@^-fiYjWVN=gdKs;Y|e@=7Z5ipnbTa!T@Yvhs?GvNAGq^71m$ z(z0^$(vng#vXau|27^gS%fQ58l2TGI2`TZb;u4bonwY2p;XW4}>ir!UMSJ!`PYwPYE8W|a$o}FF% zXDiz~dwYBPzYj_OPwZ0nD_ac!z#?g^uWJ$VeP>!5YmVdmyuYZ&$PU$H+}m#;j1p|OaMV)v_H6g)r=jlAjIuKnKWvVG<6i8^k-pVVb=eJ z5fcfZS`TiNJ+9S|`;niiv7!5eG3dC*$<1`f=g8oXEbHmT(l$Gg*mewo*p2Wsik`Hw1gO@n!k&d~|Dh#~ZVTAzNDD+t|Cm|u?Mdk4bgiAvEkfIA_U1D;Dm=h< zLP0sE{cCqONQ>QC+Yyf(sQ;{BBg|RNPpAx(? zUP!#;05rEWy%^SosSmWRZd#nAi+g@2Pu(-H-T^B8Wng0vn;VR#-qdEWQlD1BwCnlCduNkp8Y+d9TyJ^%E#Y5{6U%&nxfP@E+(clC=J zI(IMx5|sfmTm_WDS+dH6!cLh(zaQ4&TT79im6B$t%xcXxuj=f9H#NVARW^0#pwWF_ z1_R2f=_elFyDU^}!%%n1(n=-s|I>J*Tagn$Tn^=-MyIU!FwP#$<45g+3udi87*Msm zjJNL%>tU6UvOldzsC$rbHe7X4(P!C>+xSts{d|})%(R6mY-=;yD=V>J?C0i}+Y8F} zJvML$`0abYj{6}F-qJE^V=}}}cF{88yS1;-dpsHMyn^|yI@sT>K0Vp(w}tv*;Vyxmv<)LMdrX#M)|R@4YFA1gWifT& z?-;Wi46qqjqE`<#V~COqJ&x#}$oOC#B`I-cl`tys(E@|@=<3k-ZT9}OyTHT3^pi=d zN!%M_0D?L~eI|2c#cx&ep>+yyw~ z7#i(anK#k|JkGeY_Ptf(Gkhbl(7R=B@vlI&UXbU|U1rWleu@CI?q}X@L!vfyGUoUk zym}XWV{O*CN$c3CcjfRAL{3&#>--Pz$e?!-aOpku4f6N)U6)QWX(8m8B63qVSiRV% zWGv;8dv9gJ;{7i?A>aSo*t{6JxJC+9I6sw3jlQHEY488=@vGkD4QIp*P8P{EvW7pjNnabJ<*q-_!%m-0sY$`+D$#b75rZ{{Q!~vTU5@r zAP;$Z-1AtMjNJYJ>_~C6#YDJCa5`6J9__qYAdz0%MAtXZj@Pu~kg!`Y36tMXqc`a) z;AV~W!zdM9ftnOe=0+e2E`J9*^-mIi{bmZH;pLhtY&{vD1O|IOkKA59H3>V8D-5om z)$YzQ)h|9RV52K}fN|h-1qQgX%;Taos{FT?Dtzt+D#S>&S0cLm;Dt-{HqKh!5xcpi zQ(HH21w%jH!k}fWw)f!OU5M4CAS$I~#`d@4RYgVogPfjmiP0QyX(%hZ+rk{B{MA+} z={L5f-Uii|TQplxQ&}bex(K3OgD&y+t5|`&kPn?+CgoC#KKxg_AT=!Z(MO32$BJ6V zJBUcSX7_++?wV(S&rhDL#*4#XXxE%v5f0aQ$H~C@n3(>&8;wa;fTmu6$jbWE$idBF zyXj)1A#jP3D2~>#imnMJttdJc0Uff9ce&byKx~TYN!j#l$pQj>L(=^Yb03{}t+=Uf zrP~-)0$7H@I!mvf;#V{7;?TMxi1Vy82v$qhG9FQ#98xo~Kh%Fl)=7z8o}V?cxU1>^|k3+WOK;d9S}G0AWdO zCX7h6&_m(oFpAmvLiE{lCOL8E7ScGS^@fYQ)g11B385Y2F*sO#WyU$-qNpY=ihYxem%KR^k&vNb>w!-U z9z_i_{*356k4a2U^}BK*{#woM$YsC;_4KuJiXeS;=h{_yu{Ab2;(GsL*Sxa^cYRw3 zYh`i7$6oPqO`xAa;92w;s3oU0ZVv5(f|>k`%}a2R9Tc@Xs!+xI2ovY-@L#5nH?+ED zR~JFEe1mPdkYbl>3Z+WB?#ZO1z89;-#ZUEwSMCiWa&&&gieu@F`Kt(WMGc_@nM+zH zW7XZ3Btj8mQClceJTW<%#F$b4hEL5~dB8j7qoa>2{D;uPK7)SIRKoFCmXa9h&&W%t z21RRE=|p)~LNY{pN$!TzndSw_=JEQgRpWnE6zO4*JK`A>KC4fs@>EOPZqw9d9C(ka zUT=EM?SCur#iuBW!>9LF`%H2&Y(c+MxE(+`u#FNK^=wz~@%6tg+BJ1BRhh>|Gne_!E{3Iw(+S~h<_j?>(;n&3|78Bt$8)g}zyd`Ppq(GYyxRNnRIiGkYIgmbQW z^M7HfvnQz=gR!~&(l?tzryL7{w-L%p<{bTo+-uI4^Hx`RzakTL?dV?dOp{w;HlPVKeC7uXz$a_hlC#xnH1*P2Vb)Ln38~ z?plV_IT`IStK8WcM$BT%G}X4ZM}Kk%43&nXSF$%JGUW;;S^s$ac~WGQl)9j!q7H|j z@$&BOMK-mxME<(?viIq5_zjvw{ByJxTt3GcxCw? zk3F@KSMBYqIcV3EE8R{KL;Wsm z8fRS2()(8(YN82*!}TXcadVdr;Tyff3mqNDBYt!w@4cw#@2Z{f``U1^M8#PbL)okI z0501!&#JcW@0Cfnu38pkm}a;^WpH2cNyeD7t5+n(>SFWu}%xeDK(-dy&i zM&jvm&-%}yDVuB87NhAfLX~~v#$d{%y7v#1s6Q_qbj`O0KZ~e6Zxw57T$r7iIX$fv z`Z1lPL=cq`#4)mY1X4OfQ~K*^TB0b9|0{fd&L5>fMdT5|@TE)&;tmA~O0w;KT+M%f z$@w1r+C3uu`EoXU@#T8^1FY6>M?g%se7AS6zz;aX?X$Db;w@_DVOahM|1FUpox+0> zV8!siKl5P^w4p^>tpUF#e|-$zTWJ07)F2B&@7*KusQatF$)z`3OxpI(Hzb&*JEEkj z(|yUnIes&p*>EzG`Vs~g3+Qa>Tet(3m>h4GTz=V|nwrcY@hQ11Ax3racRG%>Dp|YV zT7N!Bb0qK&xbiL_=1DTU;L{!V#beE>hhW29Z{D>95Yk8+dvpRd&G*Hmc}JQ%4ejux zbqsaQ`duLU+>&2rTw5_D@$dCn=ZVC=bMyEd6u}qmoq9iFr>+op3$whz$2G5^ZC2`Z z=68F5TWQHbV{ke`ktwOzyp?6x$_kr|Y3xoY2G|VDn`M>42&Qoz zP$pkkQ~m4jA9gY{m4M5+IoD)nqE)BMmzscjP0V9Ov2pdz#N8&Jt|~#*ML0o_t4Irh zxJ9WOVL(HqbgBVC`1@j^xJkvcSo-S&!UMN@5lclBH8+d<=K!tB?X?dmx$LiKhcai} z%wZxNJjq7%y+LPgC#c7kO{(pL=5@bjtK2+SlBiASlX%-NYa**m?c0;PA4dI^n~dz8 zJ#|l)r#=|l>4>KYqQM1WM9a_@YZ@pMe|6uHw*PfaMbJaMHSgS?#d_yS82eZtvlkP!5{+eO??h#c5JkXzK!MZHF1cYD{stLI#Qk zvk~R{d`ibUSESh73}QdQzct(&yTz~P zVcpXV17hq*27&mX}Dtd^Fpn|0MU6v}b9j3CRz3B>o3aEtB*ivN_9u#`@ zOelEeI=uiC0%cwAcpH`w^&lXtypp$8Z0ZJfvwr-=PIlfh!Fnk7#*d!@CfH6Io7E;cJ5Q< zK-v?&w6_X8CF;*)#qv#TlF4u&q*iW_XSc%z|+t`I}KyP z^>UY7fp+sD_(`1!hK2mYpq#KreP9;L92m3a5=EKTadQJoytPML- Ul(50%3p9YSfvJ9#p2Nfc0Z3G#B>(^b literal 0 HcmV?d00001 diff --git a/wp-content/plugins/akismet/_inc/img/akismet-refresh-logo.svg b/wp-content/plugins/akismet/_inc/img/akismet-refresh-logo.svg new file mode 100644 index 0000000..f5b5d2c --- /dev/null +++ b/wp-content/plugins/akismet/_inc/img/akismet-refresh-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/akismet/_inc/img/akismet-refresh-logo@2x.png b/wp-content/plugins/akismet/_inc/img/akismet-refresh-logo@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..15c3db3c0b3e20649fe9b7062da44756c2db135f GIT binary patch literal 2783 zcmZ`*c{mhWA2wVeL_;&yA|)}_21!}648|HVvdj$GlcgDJV@)nuCS7AJg-O)4jl?ix zi$*k-ELoGL8_h?uW*ITx+l)6zP{g||~Pe9%-~R8cRlys{9XrAtx* z?upKng?~h64gtl8U;2TXDz{n|zzu=}>X#@)56o?CN(=q4df|Y%H~^Zx-m3Dk`ZAxw zz29Z&cmz9x_3=q;3aojBcRD$JSdZP@f@7##tKz;YZ(GV2DQ7fx0 z4l=bK!AH=?aTXUBLy^YV>0l6j`9TL21S!h0S{jVJbH^SuyF1Y0*5R@RV7yi9dRc|w z%9~pV%rL#dSg^oh6N1JUK2HY!WZEya(d7M1VZPt&rk z(`3sI0#m%)w{TZLdh2?INU85{3@BzE7w4dj~RtZsrO>E7m+Cg!#Erz#A;wJ*7 z8Y`HHs~hqu9^9}gnjx(|>Zj@XD4tsv?II#mbBeB?R_$q*|G6SrH9BeJv|Y$h(df&F zI37-Lb%Hfx{r4gzw#uojFdH(n{}jWb)aPN_@eGkkDO_&VIY*Y*wK&*NtwhGQ(AFc* z9N`diRW;@eybuV|V%QO>cjJU0`@1F+;Db|yk%@-YUdp`ByC_S+H$acg@-cN;GqPeX za}R0!OHf5({G-xdckhz|7ue(toPJgfv!LFzFU<=%}u*utHEB-Gu*_VUHE1P)D_vc2X zb8kS)5bY9~h!5w{L48-U_CuMv$D5?+8&jI!*N>zgUIgQAbxI4%T{pd;ZJTuQ06 zxli-Yr*yb|Tq}dGgsDJf0+03f9ElB~`n?N#y|HYTxRZb;%p09ykN1o(>9oHkojM)1U2#hoR2`f;9%v@jIDI#yAH7|E=d4*kx|gW;rAaSwM&&H&_xn5XxIN;BK~^s#(QU1J1@OL{*ZI$ zf{J}c%BLQoWkUsF{wv}l_d)3*;X=m*U?zWp#$0Nna*mO({z%u@PR85{@b$sK!eI*H z(o9gUg>hDqm-5W!8+?BBnIMcg-fvo0-h#}M1Lc0}HZ>CP45@4j%@Wi>_tNAUeAaFe zfW?()AJdSvXCk<&VP&J>BFiJrCma2`m+01VIIT77hwJ(M0lmB+B@=%cck-_&h=7#* zIbp4XQ{bL%b8mW~QH>Z##^<|TBvqB_z6K#g;R@@r55jXCCaOXE60&GuJu>?B3kIFM z7V}M*PC{ljtKKn%n6d?&ge(Cd^5=JP;!gopJ^?o7@UIU-+gF zk1whL$NxaR(GtS6y@Q5eRE5I4G*an{6aldY7WnDPL%1~jkL&j4x&>W2PLQj&r`%kp zRwMgp&po$>6Wp@$FqLAX<-megR?}QT=2(6rzP>kQStxj~p#xJ}yZ}EerYzKg0y@={ zWqe08VfzA~uk`^Hdfj@#T5a9wq@-u5=c=ig4~6^~qz3yNF|A(o{r#enfn>NmNKTy+ z;2XgY>G}ageEQ6is?tDeB-4QfV_6JwLJ-nynCNy1Y@>Si<7ApY2nN_!m2|kb|oZ7k?sI zj2+bUU%m(kJ22&lhvAJDb&$8^n(mq0GX7i5a{U9BG9953v}4vbaSwIwXHrN|RqdyhJ$WExq?A#`f=6t{ZO8JL!^WL+th z$C^kQk5>2fR-_oCCKVer_V{#h=TnjM1W~R1Z{*LFo<;ASj;04@^bR~V=<*+}Ab&X- zHnj9ZN93g?;AOc