From 4dafd69f75ed6ff9d946f3d1d96b32de064a1af4 Mon Sep 17 00:00:00 2001 From: Eugene van Aubel <35023@ma-web.nl> Date: Fri, 20 Sep 2024 09:51:50 +0200 Subject: [PATCH] Les 01 --- .env.example | 4 + .gitignore | 18 + docker-compose.yml | 38 + plugins/akismet/.htaccess | 34 + plugins/akismet/LICENSE.txt | 339 +++ plugins/akismet/_inc/akismet-admin.css | 378 ++++ plugins/akismet/_inc/akismet-admin.js | 7 + plugins/akismet/_inc/akismet-frontend.js | 376 ++++ plugins/akismet/_inc/akismet.css | 648 ++++++ plugins/akismet/_inc/akismet.js | 421 ++++ plugins/akismet/_inc/fonts/inter.css | 67 + .../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/icon-external.svg | 1 + plugins/akismet/_inc/img/logo-a-2x.png | Bin 0 -> 904 bytes plugins/akismet/_inc/img/logo-full-2x.png | Bin 0 -> 5052 bytes .../akismet/_inc/rtl/akismet-admin-rtl.css | 380 ++++ plugins/akismet/_inc/rtl/akismet-rtl.css | 649 ++++++ plugins/akismet/akismet.php | 68 + plugins/akismet/changelog.txt | 509 +++++ plugins/akismet/class.akismet-admin.php | 1421 ++++++++++++ plugins/akismet/class.akismet-cli.php | 186 ++ plugins/akismet/class.akismet-rest-api.php | 552 +++++ plugins/akismet/class.akismet-widget.php | 137 ++ plugins/akismet/class.akismet.php | 1921 +++++++++++++++++ plugins/akismet/index.php | 2 + plugins/akismet/readme.txt | 145 ++ plugins/akismet/views/activate.php | 8 + plugins/akismet/views/config.php | 320 +++ plugins/akismet/views/connect-jp.php | 98 + plugins/akismet/views/enter.php | 14 + plugins/akismet/views/get.php | 18 + plugins/akismet/views/logo.php | 13 + plugins/akismet/views/notice.php | 334 +++ plugins/akismet/views/predefined.php | 11 + plugins/akismet/views/setup.php | 4 + plugins/akismet/views/start.php | 29 + plugins/akismet/views/stats.php | 12 + plugins/akismet/views/title.php | 3 + plugins/akismet/wrapper.php | 214 ++ plugins/hello.php | 100 + plugins/index.php | 2 + themes/AlmaMater/functions.php | 0 themes/AlmaMater/index.php | 4 + themes/AlmaMater/screenshot.png | Bin 0 -> 53579 bytes themes/AlmaMater/style.css | 16 + themes/index.php | 2 + .../assets/css/button-outline.css | 6 + .../assets/fonts/cardo/LICENSE.txt | 93 + .../assets/fonts/cardo/cardo_italic_400.woff2 | Bin 0 -> 105184 bytes .../assets/fonts/cardo/cardo_normal_400.woff2 | Bin 0 -> 146060 bytes .../assets/fonts/cardo/cardo_normal_700.woff2 | Bin 0 -> 132564 bytes ...ntSans-Italic-VariableFont_wdth,wght.woff2 | Bin 0 -> 94644 bytes ...nstrumentSans-VariableFont_wdth,wght.woff2 | Bin 0 -> 88476 bytes .../assets/fonts/instrument-sans/OFL.txt | 93 + .../inter/Inter-VariableFont_slnt,wght.woff2 | Bin 0 -> 326628 bytes .../assets/fonts/inter/LICENSE.txt | 93 + .../jost/Jost-Italic-VariableFont_wght.woff2 | Bin 0 -> 62072 bytes .../fonts/jost/Jost-VariableFont_wght.woff2 | Bin 0 -> 50396 bytes .../assets/fonts/jost/OFL.txt | 93 + .../assets/images/abstract-geometric-art.webp | Bin 0 -> 100774 bytes .../assets/images/angular-roof.webp | Bin 0 -> 83964 bytes .../assets/images/art-gallery.webp | Bin 0 -> 118230 bytes .../assets/images/building-exterior.webp | Bin 0 -> 199724 bytes .../assets/images/green-staircase.webp | Bin 0 -> 249360 bytes .../assets/images/hotel-facade.webp | Bin 0 -> 82374 bytes .../assets/images/icon-message.webp | Bin 0 -> 1258 bytes .../assets/images/museum.webp | Bin 0 -> 123690 bytes .../assets/images/tourist-and-building.webp | Bin 0 -> 66482 bytes .../assets/images/windows.webp | Bin 0 -> 126244 bytes themes/twentytwentyfour/functions.php | 206 ++ themes/twentytwentyfour/parts/footer.html | 1 + themes/twentytwentyfour/parts/header.html | 26 + themes/twentytwentyfour/parts/post-meta.html | 1 + themes/twentytwentyfour/parts/sidebar.html | 1 + .../twentytwentyfour/patterns/banner-hero.php | 56 + .../patterns/banner-project-description.php | 45 + .../patterns/cta-content-image-on-right.php | 67 + .../twentytwentyfour/patterns/cta-pricing.php | 215 ++ themes/twentytwentyfour/patterns/cta-rsvp.php | 58 + .../patterns/cta-services-image-left.php | 49 + .../patterns/cta-subscribe-centered.php | 43 + .../patterns/footer-centered-logo-nav.php | 32 + .../patterns/footer-colophon-3-col.php | 106 + themes/twentytwentyfour/patterns/footer.php | 129 ++ .../patterns/gallery-full-screen-image.php | 22 + .../gallery-offset-images-grid-2-col.php | 59 + .../gallery-offset-images-grid-3-col.php | 111 + .../gallery-offset-images-grid-4-col.php | 150 ++ .../patterns/gallery-project-layout.php | 66 + .../twentytwentyfour/patterns/hidden-404.php | 15 + .../patterns/hidden-comments.php | 47 + .../patterns/hidden-no-results.php | 10 + .../patterns/hidden-portfolio-hero.php | 19 + .../patterns/hidden-post-meta.php | 30 + .../patterns/hidden-post-navigation.php | 14 + .../patterns/hidden-search.php | 9 + .../patterns/hidden-sidebar.php | 84 + .../patterns/page-about-business.php | 20 + .../patterns/page-home-blogging.php | 84 + .../patterns/page-home-business.php | 19 + .../patterns/page-home-portfolio-gallery.php | 15 + .../patterns/page-home-portfolio.php | 15 + .../patterns/page-newsletter-landing.php | 48 + .../patterns/page-portfolio-overview.php | 18 + .../patterns/page-rsvp-landing.php | 57 + .../twentytwentyfour/patterns/posts-1-col.php | 44 + .../twentytwentyfour/patterns/posts-3-col.php | 53 + .../patterns/posts-grid-2-col.php | 81 + .../patterns/posts-images-only-3-col.php | 36 + .../posts-images-only-offset-4-col.php | 84 + .../twentytwentyfour/patterns/posts-list.php | 63 + .../twentytwentyfour/patterns/team-4-col.php | 130 ++ .../patterns/template-archive-blogging.php | 21 + .../patterns/template-archive-portfolio.php | 23 + .../patterns/template-home-blogging.php | 21 + .../patterns/template-home-business.php | 19 + .../patterns/template-home-portfolio.php | 22 + .../patterns/template-index-blogging.php | 23 + .../patterns/template-index-portfolio.php | 24 + .../patterns/template-search-blogging.php | 26 + .../patterns/template-search-portfolio.php | 27 + .../patterns/template-single-portfolio.php | 36 + .../patterns/testimonial-centered.php | 47 + .../patterns/text-alternating-images.php | 116 + .../text-centered-statement-small.php | 31 + .../patterns/text-centered-statement.php | 30 + themes/twentytwentyfour/patterns/text-faq.php | 69 + .../patterns/text-feature-grid-3-col.php | 119 + .../patterns/text-project-details.php | 54 + .../patterns/text-title-left-image-right.php | 59 + themes/twentytwentyfour/readme.txt | 86 + themes/twentytwentyfour/screenshot.png | Bin 0 -> 721059 bytes themes/twentytwentyfour/style.css | 15 + themes/twentytwentyfour/styles/ember.json | 249 +++ themes/twentytwentyfour/styles/fossil.json | 279 +++ themes/twentytwentyfour/styles/ice.json | 280 +++ themes/twentytwentyfour/styles/maelstrom.json | 205 ++ themes/twentytwentyfour/styles/mint.json | 169 ++ themes/twentytwentyfour/styles/onyx.json | 165 ++ themes/twentytwentyfour/styles/rust.json | 145 ++ themes/twentytwentyfour/templates/404.html | 9 + .../twentytwentyfour/templates/archive.html | 13 + themes/twentytwentyfour/templates/home.html | 9 + themes/twentytwentyfour/templates/index.html | 12 + .../templates/page-no-title.html | 9 + .../twentytwentyfour/templates/page-wide.html | 33 + .../templates/page-with-sidebar.html | 54 + themes/twentytwentyfour/templates/page.html | 26 + themes/twentytwentyfour/templates/search.html | 17 + .../templates/single-with-sidebar.html | 61 + themes/twentytwentyfour/templates/single.html | 49 + themes/twentytwentyfour/theme.json | 956 ++++++++ .../fonts/dm-sans/DMSans-Bold-Italic.woff2 | Bin 0 -> 32784 bytes .../assets/fonts/dm-sans/DMSans-Bold.woff2 | Bin 0 -> 29272 bytes .../fonts/dm-sans/DMSans-Regular-Italic.woff2 | Bin 0 -> 32492 bytes .../assets/fonts/dm-sans/DMSans-Regular.woff2 | Bin 0 -> 29272 bytes .../assets/fonts/dm-sans/LICENSE.txt | 94 + .../ibm-plex-mono/IBMPlexMono-Bold.woff2 | Bin 0 -> 35652 bytes .../ibm-plex-mono/IBMPlexMono-Italic.woff2 | Bin 0 -> 38924 bytes .../ibm-plex-mono/IBMPlexMono-Light.woff2 | Bin 0 -> 34700 bytes .../ibm-plex-mono/IBMPlexMono-Regular.woff2 | Bin 0 -> 34480 bytes .../assets/fonts/ibm-plex-mono/OFL.txt | 93 + .../inter/Inter-VariableFont_slnt,wght.ttf | Bin 0 -> 803384 bytes .../assets/fonts/inter/LICENSE.txt | 93 + .../assets/fonts/source-serif-pro/LICENSE.md | 93 + .../SourceSerif4Variable-Italic.otf.woff2 | Bin 0 -> 280296 bytes .../SourceSerif4Variable-Italic.ttf.woff2 | Bin 0 -> 346840 bytes .../SourceSerif4Variable-Roman.otf.woff2 | Bin 0 -> 348988 bytes .../SourceSerif4Variable-Roman.ttf.woff2 | Bin 0 -> 428448 bytes themes/twentytwentythree/parts/comments.html | 1 + themes/twentytwentythree/parts/footer.html | 1 + themes/twentytwentythree/parts/header.html | 14 + themes/twentytwentythree/parts/post-meta.html | 1 + .../patterns/call-to-action.php | 42 + .../patterns/footer-default.php | 29 + .../twentytwentythree/patterns/hidden-404.php | 28 + .../patterns/hidden-comments.php | 57 + .../patterns/hidden-no-results.php | 14 + .../twentytwentythree/patterns/post-meta.php | 77 + themes/twentytwentythree/readme.txt | 86 + themes/twentytwentythree/screenshot.png | Bin 0 -> 81654 bytes themes/twentytwentythree/style.css | 15 + .../twentytwentythree/styles/aubergine.json | 292 +++ .../twentytwentythree/styles/block-out.json | 245 +++ themes/twentytwentythree/styles/canary.json | 251 +++ themes/twentytwentythree/styles/electric.json | 100 + themes/twentytwentythree/styles/grapes.json | 97 + themes/twentytwentythree/styles/marigold.json | 311 +++ .../twentytwentythree/styles/pilgrimage.json | 323 +++ themes/twentytwentythree/styles/pitch.json | 242 +++ themes/twentytwentythree/styles/sherbet.json | 243 +++ themes/twentytwentythree/styles/whisper.json | 550 +++++ themes/twentytwentythree/templates/404.html | 9 + .../twentytwentythree/templates/archive.html | 29 + themes/twentytwentythree/templates/blank.html | 1 + .../templates/blog-alternative.html | 29 + themes/twentytwentythree/templates/home.html | 37 + themes/twentytwentythree/templates/index.html | 27 + themes/twentytwentythree/templates/page.html | 17 + .../twentytwentythree/templates/search.html | 33 + .../twentytwentythree/templates/single.html | 18 + themes/twentytwentythree/theme.json | 741 +++++++ .../SourceSerif4Variable-Italic.otf.woff2 | Bin 0 -> 280296 bytes .../SourceSerif4Variable-Italic.ttf.woff2 | Bin 0 -> 346840 bytes .../SourceSerif4Variable-Roman.otf.woff2 | Bin 0 -> 348988 bytes .../SourceSerif4Variable-Roman.ttf.woff2 | Bin 0 -> 428448 bytes .../assets/fonts/dm-sans/DMSans-Bold.ttf | Bin 0 -> 73452 bytes .../fonts/dm-sans/DMSans-BoldItalic.ttf | Bin 0 -> 74908 bytes .../assets/fonts/dm-sans/DMSans-Italic.ttf | Bin 0 -> 75108 bytes .../assets/fonts/dm-sans/DMSans-Regular.ttf | Bin 0 -> 73524 bytes .../assets/fonts/dm-sans/LICENSE.txt | 94 + .../fonts/ibm-plex/IBMPlexMono-Bold.woff2 | Bin 0 -> 40688 bytes .../ibm-plex/IBMPlexMono-BoldItalic.woff2 | Bin 0 -> 44644 bytes .../fonts/ibm-plex/IBMPlexMono-Text.woff2 | Bin 0 -> 40048 bytes .../ibm-plex/IBMPlexMono-TextItalic.woff2 | Bin 0 -> 45348 bytes .../ibm-plex/IBMPlexSans-ExtraLight.woff2 | Bin 0 -> 60108 bytes .../IBMPlexSans-ExtraLightItalic.woff2 | Bin 0 -> 64236 bytes .../fonts/ibm-plex/IBMPlexSans-Light.woff2 | Bin 0 -> 59748 bytes .../ibm-plex/IBMPlexSans-LightItalic.woff2 | Bin 0 -> 64220 bytes .../assets/fonts/ibm-plex/LICENSE.txt | 93 + .../assets/fonts/inter/Inter.ttf | Bin 0 -> 805360 bytes .../assets/fonts/inter/LICENSE.txt | 94 + .../assets/fonts/source-serif-pro/LICENSE.md | 93 + .../SourceSerif4Variable-Italic.otf.woff2 | Bin 0 -> 280296 bytes .../SourceSerif4Variable-Italic.ttf.woff2 | Bin 0 -> 346840 bytes .../SourceSerif4Variable-Roman.otf.woff2 | Bin 0 -> 348988 bytes .../SourceSerif4Variable-Roman.ttf.woff2 | Bin 0 -> 428448 bytes .../assets/images/bird-on-black.jpg | Bin 0 -> 31329 bytes .../assets/images/bird-on-gray.jpg | Bin 0 -> 35687 bytes .../assets/images/bird-on-green.jpg | Bin 0 -> 50998 bytes .../assets/images/bird-on-salmon.jpg | Bin 0 -> 88729 bytes .../assets/images/divider-black.png | Bin 0 -> 4672 bytes .../assets/images/divider-white.png | Bin 0 -> 4745 bytes .../twentytwentytwo/assets/images/ducks.jpg | Bin 0 -> 373006 bytes .../assets/images/flight-path-on-gray-a.jpg | Bin 0 -> 42366 bytes .../assets/images/flight-path-on-gray-b.jpg | Bin 0 -> 66761 bytes .../assets/images/flight-path-on-gray-c.jpg | Bin 0 -> 84870 bytes .../assets/images/flight-path-on-salmon.jpg | Bin 0 -> 35888 bytes .../images/flight-path-on-transparent-a.png | Bin 0 -> 102448 bytes .../images/flight-path-on-transparent-b.png | Bin 0 -> 291784 bytes .../images/flight-path-on-transparent-c.png | Bin 0 -> 176299 bytes .../images/flight-path-on-transparent-d.png | Bin 0 -> 103639 bytes .../assets/images/icon-binoculars.png | Bin 0 -> 4673 bytes .../assets/images/icon-bird.jpg | Bin 0 -> 5245 bytes .../twentytwentytwo/assets/videos/birds.mp4 | Bin 0 -> 468755 bytes themes/twentytwentytwo/functions.php | 65 + themes/twentytwentytwo/inc/block-patterns.php | 135 ++ .../inc/patterns/footer-about-title-logo.php | 32 + .../inc/patterns/footer-blog.php | 55 + .../inc/patterns/footer-dark.php | 23 + .../inc/patterns/footer-default.php | 23 + .../inc/patterns/footer-logo.php | 23 + .../patterns/footer-navigation-copyright.php | 24 + .../inc/patterns/footer-navigation.php | 25 + .../footer-query-images-title-citation.php | 41 + .../patterns/footer-query-title-citation.php | 39 + .../inc/patterns/footer-social-copyright.php | 28 + .../patterns/footer-title-tagline-social.php | 26 + .../inc/patterns/general-divider-dark.php | 13 + .../inc/patterns/general-divider-light.php | 13 + .../inc/patterns/general-featured-posts.php | 25 + .../patterns/general-image-with-caption.php | 19 + .../inc/patterns/general-large-list-names.php | 35 + .../general-layered-images-with-duotone.php | 13 + .../inc/patterns/general-list-events.php | 133 ++ .../inc/patterns/general-pricing-table.php | 93 + .../inc/patterns/general-subscribe.php | 27 + .../inc/patterns/general-two-images-text.php | 47 + .../patterns/general-video-header-details.php | 47 + .../inc/patterns/general-video-trailer.php | 27 + .../general-wide-image-intro-buttons.php | 41 + .../header-centered-logo-black-background.php | 22 + .../inc/patterns/header-centered-logo.php | 26 + ...eader-centered-title-navigation-social.php | 30 + .../inc/patterns/header-default.php | 23 + .../header-image-background-overlay.php | 20 + .../inc/patterns/header-image-background.php | 24 + .../inc/patterns/header-large-dark.php | 34 + ...header-logo-navigation-gray-background.php | 18 + .../header-logo-navigation-offset-tagline.php | 30 + ...ogo-navigation-social-black-background.php | 24 + .../inc/patterns/header-small-dark.php | 31 + .../inc/patterns/header-stacked.php | 28 + .../header-text-only-green-background.php | 22 + .../header-text-only-salmon-background.php | 18 + ...ext-only-with-tagline-black-background.php | 22 + .../inc/patterns/header-title-and-button.php | 18 + .../header-title-navigation-social.php | 24 + .../inc/patterns/header-with-tagline.php | 26 + .../inc/patterns/hidden-404.php | 15 + .../inc/patterns/hidden-bird.php | 14 + .../inc/patterns/hidden-heading-and-bird.php | 21 + .../page-about-large-image-and-buttons.php | 79 + .../inc/patterns/page-about-links-dark.php | 47 + .../inc/patterns/page-about-links.php | 65 + .../inc/patterns/page-about-media-left.php | 41 + .../inc/patterns/page-about-media-right.php | 40 + .../inc/patterns/page-about-simple-dark.php | 45 + .../inc/patterns/page-about-solid-color.php | 41 + .../patterns/page-layout-image-and-text.php | 32 + .../page-layout-image-text-and-video.php | 65 + .../inc/patterns/page-layout-two-columns.php | 73 + .../page-sidebar-blog-posts-right.php | 87 + .../inc/patterns/page-sidebar-blog-posts.php | 79 + .../inc/patterns/page-sidebar-grid-posts.php | 77 + .../inc/patterns/page-sidebar-poster.php | 65 + .../inc/patterns/query-default.php | 50 + .../inc/patterns/query-grid.php | 32 + .../inc/patterns/query-image-grid.php | 36 + .../inc/patterns/query-irregular-grid.php | 170 ++ .../inc/patterns/query-large-titles.php | 26 + .../inc/patterns/query-simple-blog.php | 38 + .../inc/patterns/query-text-grid.php | 31 + themes/twentytwentytwo/index.php | 4 + themes/twentytwentytwo/parts/footer.html | 5 + .../parts/header-large-dark.html | 7 + .../parts/header-small-dark.html | 7 + themes/twentytwentytwo/parts/header.html | 15 + themes/twentytwentytwo/readme.txt | 126 ++ themes/twentytwentytwo/screenshot.png | Bin 0 -> 160517 bytes themes/twentytwentytwo/style.css | 161 ++ themes/twentytwentytwo/styles/blue.json | 146 ++ themes/twentytwentytwo/styles/pink.json | 215 ++ themes/twentytwentytwo/styles/swiss.json | 167 ++ themes/twentytwentytwo/templates/404.html | 11 + themes/twentytwentytwo/templates/archive.html | 39 + themes/twentytwentytwo/templates/blank.html | 1 + themes/twentytwentytwo/templates/home.html | 37 + themes/twentytwentytwo/templates/index.html | 37 + .../templates/page-large-header.html | 9 + .../templates/page-no-separators.html | 18 + themes/twentytwentytwo/templates/page.html | 26 + themes/twentytwentytwo/templates/search.html | 41 + .../templates/single-no-separators.html | 35 + themes/twentytwentytwo/templates/single.html | 47 + themes/twentytwentytwo/theme.json | 374 ++++ 338 files changed, 24945 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 docker-compose.yml create mode 100644 plugins/akismet/.htaccess create mode 100644 plugins/akismet/LICENSE.txt create mode 100644 plugins/akismet/_inc/akismet-admin.css create mode 100644 plugins/akismet/_inc/akismet-admin.js create mode 100644 plugins/akismet/_inc/akismet-frontend.js create mode 100644 plugins/akismet/_inc/akismet.css create mode 100644 plugins/akismet/_inc/akismet.js create mode 100644 plugins/akismet/_inc/fonts/inter.css create mode 100644 plugins/akismet/_inc/img/akismet-refresh-logo.svg create mode 100644 plugins/akismet/_inc/img/akismet-refresh-logo@2x.png create mode 100644 plugins/akismet/_inc/img/arrow-left.svg create mode 100644 plugins/akismet/_inc/img/icon-external.svg create mode 100644 plugins/akismet/_inc/img/logo-a-2x.png create mode 100644 plugins/akismet/_inc/img/logo-full-2x.png create mode 100644 plugins/akismet/_inc/rtl/akismet-admin-rtl.css create mode 100644 plugins/akismet/_inc/rtl/akismet-rtl.css create mode 100644 plugins/akismet/akismet.php create mode 100644 plugins/akismet/changelog.txt create mode 100644 plugins/akismet/class.akismet-admin.php create mode 100644 plugins/akismet/class.akismet-cli.php create mode 100644 plugins/akismet/class.akismet-rest-api.php create mode 100644 plugins/akismet/class.akismet-widget.php create mode 100644 plugins/akismet/class.akismet.php create mode 100644 plugins/akismet/index.php create mode 100644 plugins/akismet/readme.txt create mode 100644 plugins/akismet/views/activate.php create mode 100644 plugins/akismet/views/config.php create mode 100644 plugins/akismet/views/connect-jp.php create mode 100644 plugins/akismet/views/enter.php create mode 100644 plugins/akismet/views/get.php create mode 100644 plugins/akismet/views/logo.php create mode 100644 plugins/akismet/views/notice.php create mode 100644 plugins/akismet/views/predefined.php create mode 100644 plugins/akismet/views/setup.php create mode 100644 plugins/akismet/views/start.php create mode 100644 plugins/akismet/views/stats.php create mode 100644 plugins/akismet/views/title.php create mode 100644 plugins/akismet/wrapper.php create mode 100644 plugins/hello.php create mode 100644 plugins/index.php create mode 100644 themes/AlmaMater/functions.php create mode 100644 themes/AlmaMater/index.php create mode 100644 themes/AlmaMater/screenshot.png create mode 100644 themes/AlmaMater/style.css create mode 100644 themes/index.php create mode 100644 themes/twentytwentyfour/assets/css/button-outline.css create mode 100644 themes/twentytwentyfour/assets/fonts/cardo/LICENSE.txt create mode 100644 themes/twentytwentyfour/assets/fonts/cardo/cardo_italic_400.woff2 create mode 100644 themes/twentytwentyfour/assets/fonts/cardo/cardo_normal_400.woff2 create mode 100644 themes/twentytwentyfour/assets/fonts/cardo/cardo_normal_700.woff2 create mode 100644 themes/twentytwentyfour/assets/fonts/instrument-sans/InstrumentSans-Italic-VariableFont_wdth,wght.woff2 create mode 100644 themes/twentytwentyfour/assets/fonts/instrument-sans/InstrumentSans-VariableFont_wdth,wght.woff2 create mode 100644 themes/twentytwentyfour/assets/fonts/instrument-sans/OFL.txt create mode 100644 themes/twentytwentyfour/assets/fonts/inter/Inter-VariableFont_slnt,wght.woff2 create mode 100644 themes/twentytwentyfour/assets/fonts/inter/LICENSE.txt create mode 100644 themes/twentytwentyfour/assets/fonts/jost/Jost-Italic-VariableFont_wght.woff2 create mode 100644 themes/twentytwentyfour/assets/fonts/jost/Jost-VariableFont_wght.woff2 create mode 100644 themes/twentytwentyfour/assets/fonts/jost/OFL.txt create mode 100644 themes/twentytwentyfour/assets/images/abstract-geometric-art.webp create mode 100644 themes/twentytwentyfour/assets/images/angular-roof.webp create mode 100644 themes/twentytwentyfour/assets/images/art-gallery.webp create mode 100644 themes/twentytwentyfour/assets/images/building-exterior.webp create mode 100644 themes/twentytwentyfour/assets/images/green-staircase.webp create mode 100644 themes/twentytwentyfour/assets/images/hotel-facade.webp create mode 100644 themes/twentytwentyfour/assets/images/icon-message.webp create mode 100644 themes/twentytwentyfour/assets/images/museum.webp create mode 100644 themes/twentytwentyfour/assets/images/tourist-and-building.webp create mode 100644 themes/twentytwentyfour/assets/images/windows.webp create mode 100644 themes/twentytwentyfour/functions.php create mode 100644 themes/twentytwentyfour/parts/footer.html create mode 100644 themes/twentytwentyfour/parts/header.html create mode 100644 themes/twentytwentyfour/parts/post-meta.html create mode 100644 themes/twentytwentyfour/parts/sidebar.html create mode 100644 themes/twentytwentyfour/patterns/banner-hero.php create mode 100644 themes/twentytwentyfour/patterns/banner-project-description.php create mode 100644 themes/twentytwentyfour/patterns/cta-content-image-on-right.php create mode 100644 themes/twentytwentyfour/patterns/cta-pricing.php create mode 100644 themes/twentytwentyfour/patterns/cta-rsvp.php create mode 100644 themes/twentytwentyfour/patterns/cta-services-image-left.php create mode 100644 themes/twentytwentyfour/patterns/cta-subscribe-centered.php create mode 100644 themes/twentytwentyfour/patterns/footer-centered-logo-nav.php create mode 100644 themes/twentytwentyfour/patterns/footer-colophon-3-col.php create mode 100644 themes/twentytwentyfour/patterns/footer.php create mode 100644 themes/twentytwentyfour/patterns/gallery-full-screen-image.php create mode 100644 themes/twentytwentyfour/patterns/gallery-offset-images-grid-2-col.php create mode 100644 themes/twentytwentyfour/patterns/gallery-offset-images-grid-3-col.php create mode 100644 themes/twentytwentyfour/patterns/gallery-offset-images-grid-4-col.php create mode 100644 themes/twentytwentyfour/patterns/gallery-project-layout.php create mode 100644 themes/twentytwentyfour/patterns/hidden-404.php create mode 100644 themes/twentytwentyfour/patterns/hidden-comments.php create mode 100644 themes/twentytwentyfour/patterns/hidden-no-results.php create mode 100644 themes/twentytwentyfour/patterns/hidden-portfolio-hero.php create mode 100644 themes/twentytwentyfour/patterns/hidden-post-meta.php create mode 100644 themes/twentytwentyfour/patterns/hidden-post-navigation.php create mode 100644 themes/twentytwentyfour/patterns/hidden-search.php create mode 100644 themes/twentytwentyfour/patterns/hidden-sidebar.php create mode 100644 themes/twentytwentyfour/patterns/page-about-business.php create mode 100644 themes/twentytwentyfour/patterns/page-home-blogging.php create mode 100644 themes/twentytwentyfour/patterns/page-home-business.php create mode 100644 themes/twentytwentyfour/patterns/page-home-portfolio-gallery.php create mode 100644 themes/twentytwentyfour/patterns/page-home-portfolio.php create mode 100644 themes/twentytwentyfour/patterns/page-newsletter-landing.php create mode 100644 themes/twentytwentyfour/patterns/page-portfolio-overview.php create mode 100644 themes/twentytwentyfour/patterns/page-rsvp-landing.php create mode 100644 themes/twentytwentyfour/patterns/posts-1-col.php create mode 100644 themes/twentytwentyfour/patterns/posts-3-col.php create mode 100644 themes/twentytwentyfour/patterns/posts-grid-2-col.php create mode 100644 themes/twentytwentyfour/patterns/posts-images-only-3-col.php create mode 100644 themes/twentytwentyfour/patterns/posts-images-only-offset-4-col.php create mode 100644 themes/twentytwentyfour/patterns/posts-list.php create mode 100644 themes/twentytwentyfour/patterns/team-4-col.php create mode 100644 themes/twentytwentyfour/patterns/template-archive-blogging.php create mode 100644 themes/twentytwentyfour/patterns/template-archive-portfolio.php create mode 100644 themes/twentytwentyfour/patterns/template-home-blogging.php create mode 100644 themes/twentytwentyfour/patterns/template-home-business.php create mode 100644 themes/twentytwentyfour/patterns/template-home-portfolio.php create mode 100644 themes/twentytwentyfour/patterns/template-index-blogging.php create mode 100644 themes/twentytwentyfour/patterns/template-index-portfolio.php create mode 100644 themes/twentytwentyfour/patterns/template-search-blogging.php create mode 100644 themes/twentytwentyfour/patterns/template-search-portfolio.php create mode 100644 themes/twentytwentyfour/patterns/template-single-portfolio.php create mode 100644 themes/twentytwentyfour/patterns/testimonial-centered.php create mode 100644 themes/twentytwentyfour/patterns/text-alternating-images.php create mode 100644 themes/twentytwentyfour/patterns/text-centered-statement-small.php create mode 100644 themes/twentytwentyfour/patterns/text-centered-statement.php create mode 100644 themes/twentytwentyfour/patterns/text-faq.php create mode 100644 themes/twentytwentyfour/patterns/text-feature-grid-3-col.php create mode 100644 themes/twentytwentyfour/patterns/text-project-details.php create mode 100644 themes/twentytwentyfour/patterns/text-title-left-image-right.php create mode 100644 themes/twentytwentyfour/readme.txt create mode 100644 themes/twentytwentyfour/screenshot.png create mode 100644 themes/twentytwentyfour/style.css create mode 100644 themes/twentytwentyfour/styles/ember.json create mode 100644 themes/twentytwentyfour/styles/fossil.json create mode 100644 themes/twentytwentyfour/styles/ice.json create mode 100644 themes/twentytwentyfour/styles/maelstrom.json create mode 100644 themes/twentytwentyfour/styles/mint.json create mode 100644 themes/twentytwentyfour/styles/onyx.json create mode 100644 themes/twentytwentyfour/styles/rust.json create mode 100644 themes/twentytwentyfour/templates/404.html create mode 100644 themes/twentytwentyfour/templates/archive.html create mode 100644 themes/twentytwentyfour/templates/home.html create mode 100644 themes/twentytwentyfour/templates/index.html create mode 100644 themes/twentytwentyfour/templates/page-no-title.html create mode 100644 themes/twentytwentyfour/templates/page-wide.html create mode 100644 themes/twentytwentyfour/templates/page-with-sidebar.html create mode 100644 themes/twentytwentyfour/templates/page.html create mode 100644 themes/twentytwentyfour/templates/search.html create mode 100644 themes/twentytwentyfour/templates/single-with-sidebar.html create mode 100644 themes/twentytwentyfour/templates/single.html create mode 100644 themes/twentytwentyfour/theme.json create mode 100644 themes/twentytwentythree/assets/fonts/dm-sans/DMSans-Bold-Italic.woff2 create mode 100644 themes/twentytwentythree/assets/fonts/dm-sans/DMSans-Bold.woff2 create mode 100644 themes/twentytwentythree/assets/fonts/dm-sans/DMSans-Regular-Italic.woff2 create mode 100644 themes/twentytwentythree/assets/fonts/dm-sans/DMSans-Regular.woff2 create mode 100644 themes/twentytwentythree/assets/fonts/dm-sans/LICENSE.txt create mode 100644 themes/twentytwentythree/assets/fonts/ibm-plex-mono/IBMPlexMono-Bold.woff2 create mode 100644 themes/twentytwentythree/assets/fonts/ibm-plex-mono/IBMPlexMono-Italic.woff2 create mode 100644 themes/twentytwentythree/assets/fonts/ibm-plex-mono/IBMPlexMono-Light.woff2 create mode 100644 themes/twentytwentythree/assets/fonts/ibm-plex-mono/IBMPlexMono-Regular.woff2 create mode 100644 themes/twentytwentythree/assets/fonts/ibm-plex-mono/OFL.txt create mode 100644 themes/twentytwentythree/assets/fonts/inter/Inter-VariableFont_slnt,wght.ttf create mode 100644 themes/twentytwentythree/assets/fonts/inter/LICENSE.txt create mode 100644 themes/twentytwentythree/assets/fonts/source-serif-pro/LICENSE.md create mode 100644 themes/twentytwentythree/assets/fonts/source-serif-pro/SourceSerif4Variable-Italic.otf.woff2 create mode 100644 themes/twentytwentythree/assets/fonts/source-serif-pro/SourceSerif4Variable-Italic.ttf.woff2 create mode 100644 themes/twentytwentythree/assets/fonts/source-serif-pro/SourceSerif4Variable-Roman.otf.woff2 create mode 100644 themes/twentytwentythree/assets/fonts/source-serif-pro/SourceSerif4Variable-Roman.ttf.woff2 create mode 100644 themes/twentytwentythree/parts/comments.html create mode 100644 themes/twentytwentythree/parts/footer.html create mode 100644 themes/twentytwentythree/parts/header.html create mode 100644 themes/twentytwentythree/parts/post-meta.html create mode 100644 themes/twentytwentythree/patterns/call-to-action.php create mode 100644 themes/twentytwentythree/patterns/footer-default.php create mode 100644 themes/twentytwentythree/patterns/hidden-404.php create mode 100644 themes/twentytwentythree/patterns/hidden-comments.php create mode 100644 themes/twentytwentythree/patterns/hidden-no-results.php create mode 100644 themes/twentytwentythree/patterns/post-meta.php create mode 100644 themes/twentytwentythree/readme.txt create mode 100644 themes/twentytwentythree/screenshot.png create mode 100644 themes/twentytwentythree/style.css create mode 100644 themes/twentytwentythree/styles/aubergine.json create mode 100644 themes/twentytwentythree/styles/block-out.json create mode 100644 themes/twentytwentythree/styles/canary.json create mode 100644 themes/twentytwentythree/styles/electric.json create mode 100644 themes/twentytwentythree/styles/grapes.json create mode 100644 themes/twentytwentythree/styles/marigold.json create mode 100644 themes/twentytwentythree/styles/pilgrimage.json create mode 100644 themes/twentytwentythree/styles/pitch.json create mode 100644 themes/twentytwentythree/styles/sherbet.json create mode 100644 themes/twentytwentythree/styles/whisper.json create mode 100644 themes/twentytwentythree/templates/404.html create mode 100644 themes/twentytwentythree/templates/archive.html create mode 100644 themes/twentytwentythree/templates/blank.html create mode 100644 themes/twentytwentythree/templates/blog-alternative.html create mode 100644 themes/twentytwentythree/templates/home.html create mode 100644 themes/twentytwentythree/templates/index.html create mode 100644 themes/twentytwentythree/templates/page.html create mode 100644 themes/twentytwentythree/templates/search.html create mode 100644 themes/twentytwentythree/templates/single.html create mode 100644 themes/twentytwentythree/theme.json create mode 100644 themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Italic.otf.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Italic.ttf.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Roman.otf.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Roman.ttf.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/dm-sans/DMSans-Bold.ttf create mode 100644 themes/twentytwentytwo/assets/fonts/dm-sans/DMSans-BoldItalic.ttf create mode 100644 themes/twentytwentytwo/assets/fonts/dm-sans/DMSans-Italic.ttf create mode 100644 themes/twentytwentytwo/assets/fonts/dm-sans/DMSans-Regular.ttf create mode 100644 themes/twentytwentytwo/assets/fonts/dm-sans/LICENSE.txt create mode 100644 themes/twentytwentytwo/assets/fonts/ibm-plex/IBMPlexMono-Bold.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/ibm-plex/IBMPlexMono-BoldItalic.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/ibm-plex/IBMPlexMono-Text.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/ibm-plex/IBMPlexMono-TextItalic.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/ibm-plex/IBMPlexSans-ExtraLight.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/ibm-plex/IBMPlexSans-ExtraLightItalic.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/ibm-plex/IBMPlexSans-Light.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/ibm-plex/IBMPlexSans-LightItalic.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/ibm-plex/LICENSE.txt create mode 100644 themes/twentytwentytwo/assets/fonts/inter/Inter.ttf create mode 100644 themes/twentytwentytwo/assets/fonts/inter/LICENSE.txt create mode 100644 themes/twentytwentytwo/assets/fonts/source-serif-pro/LICENSE.md create mode 100644 themes/twentytwentytwo/assets/fonts/source-serif-pro/SourceSerif4Variable-Italic.otf.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/source-serif-pro/SourceSerif4Variable-Italic.ttf.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/source-serif-pro/SourceSerif4Variable-Roman.otf.woff2 create mode 100644 themes/twentytwentytwo/assets/fonts/source-serif-pro/SourceSerif4Variable-Roman.ttf.woff2 create mode 100644 themes/twentytwentytwo/assets/images/bird-on-black.jpg create mode 100644 themes/twentytwentytwo/assets/images/bird-on-gray.jpg create mode 100644 themes/twentytwentytwo/assets/images/bird-on-green.jpg create mode 100644 themes/twentytwentytwo/assets/images/bird-on-salmon.jpg create mode 100644 themes/twentytwentytwo/assets/images/divider-black.png create mode 100644 themes/twentytwentytwo/assets/images/divider-white.png create mode 100644 themes/twentytwentytwo/assets/images/ducks.jpg create mode 100644 themes/twentytwentytwo/assets/images/flight-path-on-gray-a.jpg create mode 100644 themes/twentytwentytwo/assets/images/flight-path-on-gray-b.jpg create mode 100644 themes/twentytwentytwo/assets/images/flight-path-on-gray-c.jpg create mode 100644 themes/twentytwentytwo/assets/images/flight-path-on-salmon.jpg create mode 100644 themes/twentytwentytwo/assets/images/flight-path-on-transparent-a.png create mode 100644 themes/twentytwentytwo/assets/images/flight-path-on-transparent-b.png create mode 100644 themes/twentytwentytwo/assets/images/flight-path-on-transparent-c.png create mode 100644 themes/twentytwentytwo/assets/images/flight-path-on-transparent-d.png create mode 100644 themes/twentytwentytwo/assets/images/icon-binoculars.png create mode 100644 themes/twentytwentytwo/assets/images/icon-bird.jpg create mode 100644 themes/twentytwentytwo/assets/videos/birds.mp4 create mode 100644 themes/twentytwentytwo/functions.php create mode 100644 themes/twentytwentytwo/inc/block-patterns.php create mode 100644 themes/twentytwentytwo/inc/patterns/footer-about-title-logo.php create mode 100644 themes/twentytwentytwo/inc/patterns/footer-blog.php create mode 100644 themes/twentytwentytwo/inc/patterns/footer-dark.php create mode 100644 themes/twentytwentytwo/inc/patterns/footer-default.php create mode 100644 themes/twentytwentytwo/inc/patterns/footer-logo.php create mode 100644 themes/twentytwentytwo/inc/patterns/footer-navigation-copyright.php create mode 100644 themes/twentytwentytwo/inc/patterns/footer-navigation.php create mode 100644 themes/twentytwentytwo/inc/patterns/footer-query-images-title-citation.php create mode 100644 themes/twentytwentytwo/inc/patterns/footer-query-title-citation.php create mode 100644 themes/twentytwentytwo/inc/patterns/footer-social-copyright.php create mode 100644 themes/twentytwentytwo/inc/patterns/footer-title-tagline-social.php create mode 100644 themes/twentytwentytwo/inc/patterns/general-divider-dark.php create mode 100644 themes/twentytwentytwo/inc/patterns/general-divider-light.php create mode 100644 themes/twentytwentytwo/inc/patterns/general-featured-posts.php create mode 100644 themes/twentytwentytwo/inc/patterns/general-image-with-caption.php create mode 100644 themes/twentytwentytwo/inc/patterns/general-large-list-names.php create mode 100644 themes/twentytwentytwo/inc/patterns/general-layered-images-with-duotone.php create mode 100644 themes/twentytwentytwo/inc/patterns/general-list-events.php create mode 100644 themes/twentytwentytwo/inc/patterns/general-pricing-table.php create mode 100644 themes/twentytwentytwo/inc/patterns/general-subscribe.php create mode 100644 themes/twentytwentytwo/inc/patterns/general-two-images-text.php create mode 100644 themes/twentytwentytwo/inc/patterns/general-video-header-details.php create mode 100644 themes/twentytwentytwo/inc/patterns/general-video-trailer.php create mode 100644 themes/twentytwentytwo/inc/patterns/general-wide-image-intro-buttons.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-centered-logo-black-background.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-centered-logo.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-centered-title-navigation-social.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-default.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-image-background-overlay.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-image-background.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-large-dark.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-logo-navigation-gray-background.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-logo-navigation-offset-tagline.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-logo-navigation-social-black-background.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-small-dark.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-stacked.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-text-only-green-background.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-text-only-salmon-background.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-text-only-with-tagline-black-background.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-title-and-button.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-title-navigation-social.php create mode 100644 themes/twentytwentytwo/inc/patterns/header-with-tagline.php create mode 100644 themes/twentytwentytwo/inc/patterns/hidden-404.php create mode 100644 themes/twentytwentytwo/inc/patterns/hidden-bird.php create mode 100644 themes/twentytwentytwo/inc/patterns/hidden-heading-and-bird.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-about-large-image-and-buttons.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-about-links-dark.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-about-links.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-about-media-left.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-about-media-right.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-about-simple-dark.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-about-solid-color.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-layout-image-and-text.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-layout-image-text-and-video.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-layout-two-columns.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-sidebar-blog-posts-right.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-sidebar-blog-posts.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-sidebar-grid-posts.php create mode 100644 themes/twentytwentytwo/inc/patterns/page-sidebar-poster.php create mode 100644 themes/twentytwentytwo/inc/patterns/query-default.php create mode 100644 themes/twentytwentytwo/inc/patterns/query-grid.php create mode 100644 themes/twentytwentytwo/inc/patterns/query-image-grid.php create mode 100644 themes/twentytwentytwo/inc/patterns/query-irregular-grid.php create mode 100644 themes/twentytwentytwo/inc/patterns/query-large-titles.php create mode 100644 themes/twentytwentytwo/inc/patterns/query-simple-blog.php create mode 100644 themes/twentytwentytwo/inc/patterns/query-text-grid.php create mode 100644 themes/twentytwentytwo/index.php create mode 100644 themes/twentytwentytwo/parts/footer.html create mode 100644 themes/twentytwentytwo/parts/header-large-dark.html create mode 100644 themes/twentytwentytwo/parts/header-small-dark.html create mode 100644 themes/twentytwentytwo/parts/header.html create mode 100644 themes/twentytwentytwo/readme.txt create mode 100644 themes/twentytwentytwo/screenshot.png create mode 100644 themes/twentytwentytwo/style.css create mode 100644 themes/twentytwentytwo/styles/blue.json create mode 100644 themes/twentytwentytwo/styles/pink.json create mode 100644 themes/twentytwentytwo/styles/swiss.json create mode 100644 themes/twentytwentytwo/templates/404.html create mode 100644 themes/twentytwentytwo/templates/archive.html create mode 100644 themes/twentytwentytwo/templates/blank.html create mode 100644 themes/twentytwentytwo/templates/home.html create mode 100644 themes/twentytwentytwo/templates/index.html create mode 100644 themes/twentytwentytwo/templates/page-large-header.html create mode 100644 themes/twentytwentytwo/templates/page-no-separators.html create mode 100644 themes/twentytwentytwo/templates/page.html create mode 100644 themes/twentytwentytwo/templates/search.html create mode 100644 themes/twentytwentytwo/templates/single-no-separators.html create mode 100644 themes/twentytwentytwo/templates/single.html create mode 100644 themes/twentytwentytwo/theme.json diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..d64c022 --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +DB_NAME= +DB_USERNAME= +DB_PASSWORD= +DB_ROOT_PASSWORD= \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..43c4848 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +### Node an Vendor files +node_modules/ +vendor/ + +### Windows +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ +*.cab +*.msi +*.msm +*.msp +*.lnk + +### Application +.env +_sources \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..95b9650 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,38 @@ +version: '3.8' + +services: + wordpress: + image: wordpress:latest + container_name: wordpress + environment: + WORDPRESS_DB_HOST: '${DB_HOST}' + WORDPRESS_DB_NAME: '${DB_NAME}' + WORDPRESS_DB_USER: '${DB_USERNAME}' + WORDPRESS_DB_PASSWORD: '${DB_PASSWORD}' + ports: + - 8081:80 + volumes: + - ./themes:/var/www/html/wp-content/themes + - ./plugins:/var/www/html/wp-content/plugins + - ./uploads:/var/www/html/wp-content/uploads + + mariadb: + image: mariadb:latest + container_name: mariadb + environment: + MYSQL_DATABASE: '${DB_NAME}' + MYSQL_USER: '${DB_USERNAME}' + MYSQL_PASSWORD: '${DB_PASSWORD}' + MYSQL_ROOT_PASSWORD: '${DB_ROOT_PASSWORD}' + ports: + - 3310:3306 + + phpmyadmin: + image: phpmyadmin:latest + container_name: phpmyadmin + environment: + PMA_HOST: '${DB_HOST}' + PMA_USER: '${DB_USERNAME}' + PMA_PASSWORD: '${DB_PASSWORD}' + ports: + - 8888:80 diff --git a/plugins/akismet/.htaccess b/plugins/akismet/.htaccess new file mode 100644 index 0000000..ca895f2 --- /dev/null +++ b/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/plugins/akismet/LICENSE.txt b/plugins/akismet/LICENSE.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/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/plugins/akismet/_inc/akismet-admin.css b/plugins/akismet/_inc/akismet-admin.css new file mode 100644 index 0000000..27d2f89 --- /dev/null +++ b/plugins/akismet/_inc/akismet-admin.css @@ -0,0 +1,378 @@ +#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; + --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-white: #fff; + --akismet-color-mid-green: #357b49; + --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-plugin-container a { + color: var(--akismet-color-mid-green); +} + +#akismet-plugin-container button:focus-visible, +#akismet-plugin-container input: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; +} + +.akismet-button, .akismet-button:hover { + background-color: var(--akismet-color-mid-green); + border: 0; + color: #fff; +} + +/* 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 .akismet-new-snapshot__number { + color: var(--akismet-color-charcoal); + letter-spacing: -1px; + 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, +.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-card-actions__secondary-action a[target="_blank"]::after { + background: url('img/icon-external.svg') no-repeat; + background-size: contain; + content: ""; + display: inline-block; + height: 16px; + margin-left: 5px; + vertical-align: middle; + width: 16px; +} + +.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-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); +} + +/* 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; +} + +@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; + } +} \ No newline at end of file diff --git a/plugins/akismet/_inc/akismet-admin.js b/plugins/akismet/_inc/akismet-admin.js new file mode 100644 index 0000000..4a3f9fc --- /dev/null +++ b/plugins/akismet/_inc/akismet-admin.js @@ -0,0 +1,7 @@ +document.addEventListener( 'DOMContentLoaded', function() { + // Prevent aggressive iframe caching in Firefox + var statsIframe = document.getElementById( 'stats-iframe' ); + if ( statsIframe ) { + statsIframe.contentWindow.location.href = statsIframe.src; + } +} ); \ No newline at end of file diff --git a/plugins/akismet/_inc/akismet-frontend.js b/plugins/akismet/_inc/akismet-frontend.js new file mode 100644 index 0000000..40ebfe6 --- /dev/null +++ b/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/plugins/akismet/_inc/akismet.css b/plugins/akismet/_inc/akismet.css new file mode 100644 index 0000000..dbede8f --- /dev/null +++ b/plugins/akismet/_inc/akismet.css @@ -0,0 +1,648 @@ +.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; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-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-alert-text { + color: #dd3d36; + font-weight: bold; + font-size: 120%; + margin-top: .5rem; +} + +.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; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + -ms-box-sizing: border-box; +} + +.akismet-new-snapshot__number { + display: block; + font-size: 32px; + font-weight: lighter; + line-height: 1.5em; +} + +.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; +} + +/** + * For the activation notice on the plugins page. + */ + +#akismet_setup_prompt { + background: none; + border: none; + margin: 0; + padding: 0; + width: 100%; +} + +.akismet_activate { + border: 1px solid #4F800D; + padding: 5px; + margin: 15px 0; + background: #83AF24; + background-image: -webkit-gradient(linear, 0% 0, 80% 100%, from(#83AF24), to(#4F800D)); + background-image: -moz-linear-gradient(80% 100% 120deg, #4F800D, #83AF24); + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-border-radius: 3px; + position: relative; + overflow: hidden; +} + +.akismet_activate .aa_a { + position: absolute; + top: -5px; + right: 10px; + font-size: 140px; + color: #769F33; + font-family: Georgia, "Times New Roman", Times, serif; +} + +.akismet_activate .aa_button { + font-weight: bold; + border: 1px solid #029DD6; + border-top: 1px solid #06B9FD; + font-size: 15px; + text-align: center; + padding: 9px 0 8px 0; + color: #FFF; + background: #029DD6; + background-image: -webkit-gradient(linear, 0% 0, 0% 100%, from(#029DD6), to(#0079B1)); + background-image: -moz-linear-gradient(0% 100% 90deg, #0079B1, #029DD6); + -moz-border-radius: 2px; + border-radius: 2px; + -webkit-border-radius: 2px; + width: 100%; + cursor: pointer; + margin: 0; +} + +.akismet_activate .aa_button:hover { + text-decoration: none !important; + border: 1px solid #029DD6; + border-bottom: 1px solid #00A8EF; + font-size: 15px; + text-align: center; + padding: 9px 0 8px 0; + color: #F0F8FB; + background: #0079B1; + background-image: -webkit-gradient(linear, 0% 0, 0% 100%, from(#0079B1), to(#0092BF)); + background-image: -moz-linear-gradient(0% 100% 90deg, #0092BF, #0079B1); + -moz-border-radius: 2px; + border-radius: 2px; + -webkit-border-radius: 2px; +} + +.akismet_activate .aa_button_border { + border: 1px solid #006699; + -moz-border-radius: 2px; + border-radius: 2px; + -webkit-border-radius: 2px; + background: #029DD6; + background-image: -webkit-gradient(linear, 0% 0, 0% 100%, from(#029DD6), to(#0079B1)); + background-image: -moz-linear-gradient(0% 100% 90deg, #0079B1, #029DD6); +} + +.akismet_activate .aa_button_container { + box-sizing: border-box; + display: inline-block; + background: #DEF1B8; + padding: 5px; + -moz-border-radius: 2px; + border-radius: 2px; + -webkit-border-radius: 2px; + width: 266px; +} + +.akismet_activate .aa_description { + position: absolute; + top: 22px; + left: 285px; + margin-left: 25px; + color: #E5F2B1; + font-size: 15px; +} + +.akismet_activate .aa_description strong { + color: #FFF; + font-weight: normal; +} + +@media (max-width: 550px) { + .akismet_activate .aa_a { + display: none; + } + + .akismet_activate .aa_button_container { + width: 100%; + } +} + +@media (max-width: 782px) { + .akismet_activate { + min-width: 0; + } +} + +@media (max-width: 850px) { + #akismet_setup_prompt .aa_description { + display: none; + } + + .akismet_activate { + min-width: 0; + } +} + +.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:-ms-flexbox; + display:flex; + -ms-flex-flow:row wrap; + flex-flow:row wrap; + -ms-flex:2 50%; + flex:2 50%; + -ms-flex-pack:end; + 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-jetpack-email { + font-style: oblique; +} + +.akismet-jetpack-gravatar { + padding: 0 0 0 1.5rem; + float: left; + margin-right: 1rem; + width: 54px; + height: 54px; +} + +.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-header { + max-width: 700px; + margin: 0 auto 40px auto; + line-height: 1.5; +} + +.akismet-box-header h2 { + margin: 1.5rem 10% 0; + font-size: 1.375rem; + font-weight: 700; + color: #000; +} + +.akismet-box .centered { + text-align: center; +} + +.akismet-box .akismet-toggles { + margin: 3rem 0; +} + +.akismet-box .akismet-ak-connect, .akismet-box .toggle-jp-connect { + display: none; +} + +.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; + font-size: 14px; + 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: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-positive: 1; + 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 { + text-align: center; +} + +.akismet-setup-instructions form { + padding-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 { + 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; +} + +@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/plugins/akismet/_inc/akismet.js b/plugins/akismet/_inc/akismet.js new file mode 100644 index 0000000..2f9aa73 --- /dev/null +++ b/plugins/akismet/_inc/akismet.js @@ -0,0 +1,421 @@ +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' ).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(); + } ); + + /** + * Hides the Connect with Jetpack form | Shows the Activate Akismet Account form + */ + $( 'a.toggle-ak-connect' ).on( 'click', function ( e ) { + e.preventDefault(); + + $( '.akismet-ak-connect' ).slideToggle('slow'); + $( 'a.toggle-ak-connect' ).hide(); + $( '.akismet-jp-connect' ).hide(); + $( 'a.toggle-jp-connect' ).show(); + } ); + + /** + * Shows the Connect with Jetpack form | Hides the Activate Akismet Account form + */ + $( 'a.toggle-jp-connect' ).on( 'click', function ( e ) { + e.preventDefault(); + + $( '.akismet-jp-connect' ).slideToggle('slow'); + $( 'a.toggle-jp-connect' ).hide(); + $( '.akismet-ak-connect' ).hide(); + $( 'a.toggle-ak-connect' ).show(); + } ); +}); diff --git a/plugins/akismet/_inc/fonts/inter.css b/plugins/akismet/_inc/fonts/inter.css new file mode 100644 index 0000000..d28b612 --- /dev/null +++ b/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/plugins/akismet/_inc/img/akismet-refresh-logo.svg b/plugins/akismet/_inc/img/akismet-refresh-logo.svg new file mode 100644 index 0000000..f5b5d2c --- /dev/null +++ b/plugins/akismet/_inc/img/akismet-refresh-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/akismet/_inc/img/akismet-refresh-logo@2x.png b/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