From 5cd37f24fae93930aec6d4d59e81bef0f80d206b Mon Sep 17 00:00:00 2001 From: Moses Fabiyi <90117777+officialmofabs@users.noreply.github.com> Date: Sat, 6 May 2023 02:02:58 +0100 Subject: [PATCH 1/2] Create devcontainer.json (#7) Signed-off-by: Moses Fabiyi <90117777+officialmofabs@users.noreply.github.com> --- .devcontainer/devcontainer.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..ad93c14 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,5 @@ +{ + "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + } +} From 7c10169b0570e0790c358bdb770817324788888d Mon Sep 17 00:00:00 2001 From: IGE Cloud-Project Operations <34292598+projectoperation@users.noreply.github.com> Date: Sun, 18 Jun 2023 18:41:38 +0000 Subject: [PATCH 2/2] Pending changes exported from your codespace --- .env.sample | 71 ++++ .gitignore | 182 ++++++++++- .stylelintrc.js | 308 ++++++++++++++++++ composer.json | 40 +++ docker-compose.yml | 298 +++++++++++++++-- ideasonpurpose.config.js | 25 ++ package.json | 73 ++++- .../themes/docker-wordpress-dev/404.php | 68 ++++ .../themes/docker-wordpress-dev/archive.php | 13 + .../themes/docker-wordpress-dev/footer.php | 10 + .../docker-wordpress-dev/front-page.php | 20 ++ .../themes/docker-wordpress-dev/functions.php | 150 +++++++++ .../themes/docker-wordpress-dev/header.php | 14 + .../themes/docker-wordpress-dev/home.php | 12 + .../themes/docker-wordpress-dev/index.php | 11 + .../docker-wordpress-dev/lib/ImageSize.php | 64 ++++ .../lib/WP/TaxonomyCountColumn.php | 173 ++++++++++ .../themes/docker-wordpress-dev/page.php | 18 + .../docker-wordpress-dev/screenshot.png | Bin 0 -> 110477 bytes .../themes/docker-wordpress-dev/singular.php | 17 + .../src/acf-json/group_637d587898a29.json | 85 +++++ .../src/favicon/favicon.ico | Bin 0 -> 606 bytes .../src/images/svg/email.svg | 1 + .../src/images/svg/facebook.svg | 1 + .../src/images/svg/instagram.svg | 1 + .../src/images/svg/linkedin.svg | 1 + .../src/images/svg/pinterest.svg | 1 + .../src/images/svg/site-logo.svg | 5 + .../src/images/svg/twitter.svg | 1 + .../src/images/svg/vimeo.svg | 1 + .../src/images/svg/youtube.svg | 1 + .../docker-wordpress-dev/src/js/admin.js | 3 + .../docker-wordpress-dev/src/js/editor.js | 12 + .../docker-wordpress-dev/src/js/main.js | 9 + .../src/js/modules/menu.js | 48 +++ .../src/js/modules/share.js | 16 + .../docker-wordpress-dev/src/sass/admin.scss | 3 + .../src/sass/base/_base.scss | 25 ++ .../src/sass/base/_fonts.scss | 12 + .../src/sass/base/_reset.scss | 88 +++++ .../src/sass/base/_typography.scss | 13 + .../src/sass/base/_utilities.scss | 40 +++ .../docker-wordpress-dev/src/sass/editor.scss | 3 + .../docker-wordpress-dev/src/sass/main.scss | 38 +++ .../src/sass/mixins/_breakpoint.scss | 27 ++ .../src/sass/mixins/_columns.scss | 46 +++ .../src/sass/mixins/_rows.scss | 27 ++ .../src/sass/modules/_alignfull.scss | 6 + .../src/sass/modules/_editorial.scss | 13 + .../src/sass/modules/_footer.scss | 6 + .../src/sass/modules/_header.scss | 47 +++ .../sass/modules/_header__menu-button.scss | 93 ++++++ .../src/sass/modules/_header__menu.scss | 33 ++ .../src/sass/modules/_main.scss | 12 + .../src/sass/modules/_sharebar.scss | 9 + .../src/sass/modules/_wrapper.scss | 18 + .../src/sass/variables/_colors.scss | 8 + .../src/sass/variables/_layout.scss | 41 +++ .../src/sass/wp/_wp-editor-colors.scss | 24 ++ .../src/sass/wp/_wp-logged-in.scss | 24 ++ .../themes/docker-wordpress-dev/style.css | 7 + .../template-parts/archive.php | 20 ++ .../template-parts/components/card.php | 41 +++ .../components/cookie-notice.php | 30 ++ .../template-parts/components/pagination.php | 105 ++++++ .../template-parts/components/sharebar.php | 32 ++ .../template-parts/favicon.php | 12 + .../template-parts/footer.php | 67 ++++ .../template-parts/header.php | 52 +++ .../template-parts/page.php | 17 + .../template-parts/single.php | 20 ++ .../themes/docker-wordpress-dev/theme.json | 47 +++ 72 files changed, 2823 insertions(+), 36 deletions(-) create mode 100644 .env.sample create mode 100644 .stylelintrc.js create mode 100644 composer.json create mode 100644 ideasonpurpose.config.js create mode 100644 wp-content/themes/docker-wordpress-dev/404.php create mode 100644 wp-content/themes/docker-wordpress-dev/archive.php create mode 100644 wp-content/themes/docker-wordpress-dev/footer.php create mode 100644 wp-content/themes/docker-wordpress-dev/front-page.php create mode 100644 wp-content/themes/docker-wordpress-dev/functions.php create mode 100644 wp-content/themes/docker-wordpress-dev/header.php create mode 100644 wp-content/themes/docker-wordpress-dev/home.php create mode 100644 wp-content/themes/docker-wordpress-dev/index.php create mode 100644 wp-content/themes/docker-wordpress-dev/lib/ImageSize.php create mode 100644 wp-content/themes/docker-wordpress-dev/lib/WP/TaxonomyCountColumn.php create mode 100644 wp-content/themes/docker-wordpress-dev/page.php create mode 100644 wp-content/themes/docker-wordpress-dev/screenshot.png create mode 100644 wp-content/themes/docker-wordpress-dev/singular.php create mode 100644 wp-content/themes/docker-wordpress-dev/src/acf-json/group_637d587898a29.json create mode 100644 wp-content/themes/docker-wordpress-dev/src/favicon/favicon.ico create mode 100644 wp-content/themes/docker-wordpress-dev/src/images/svg/email.svg create mode 100644 wp-content/themes/docker-wordpress-dev/src/images/svg/facebook.svg create mode 100644 wp-content/themes/docker-wordpress-dev/src/images/svg/instagram.svg create mode 100644 wp-content/themes/docker-wordpress-dev/src/images/svg/linkedin.svg create mode 100644 wp-content/themes/docker-wordpress-dev/src/images/svg/pinterest.svg create mode 100644 wp-content/themes/docker-wordpress-dev/src/images/svg/site-logo.svg create mode 100644 wp-content/themes/docker-wordpress-dev/src/images/svg/twitter.svg create mode 100644 wp-content/themes/docker-wordpress-dev/src/images/svg/vimeo.svg create mode 100644 wp-content/themes/docker-wordpress-dev/src/images/svg/youtube.svg create mode 100644 wp-content/themes/docker-wordpress-dev/src/js/admin.js create mode 100644 wp-content/themes/docker-wordpress-dev/src/js/editor.js create mode 100644 wp-content/themes/docker-wordpress-dev/src/js/main.js create mode 100644 wp-content/themes/docker-wordpress-dev/src/js/modules/menu.js create mode 100644 wp-content/themes/docker-wordpress-dev/src/js/modules/share.js create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/admin.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/base/_base.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/base/_fonts.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/base/_reset.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/base/_typography.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/base/_utilities.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/editor.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/main.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/mixins/_breakpoint.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/mixins/_columns.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/mixins/_rows.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/modules/_alignfull.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/modules/_editorial.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/modules/_footer.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/modules/_header.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/modules/_header__menu-button.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/modules/_header__menu.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/modules/_main.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/modules/_sharebar.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/modules/_wrapper.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/variables/_colors.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/variables/_layout.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/wp/_wp-editor-colors.scss create mode 100644 wp-content/themes/docker-wordpress-dev/src/sass/wp/_wp-logged-in.scss create mode 100644 wp-content/themes/docker-wordpress-dev/style.css create mode 100644 wp-content/themes/docker-wordpress-dev/template-parts/archive.php create mode 100644 wp-content/themes/docker-wordpress-dev/template-parts/components/card.php create mode 100644 wp-content/themes/docker-wordpress-dev/template-parts/components/cookie-notice.php create mode 100644 wp-content/themes/docker-wordpress-dev/template-parts/components/pagination.php create mode 100644 wp-content/themes/docker-wordpress-dev/template-parts/components/sharebar.php create mode 100644 wp-content/themes/docker-wordpress-dev/template-parts/favicon.php create mode 100644 wp-content/themes/docker-wordpress-dev/template-parts/footer.php create mode 100644 wp-content/themes/docker-wordpress-dev/template-parts/header.php create mode 100644 wp-content/themes/docker-wordpress-dev/template-parts/page.php create mode 100644 wp-content/themes/docker-wordpress-dev/template-parts/single.php create mode 100644 wp-content/themes/docker-wordpress-dev/theme.json diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..ea2a679 --- /dev/null +++ b/.env.sample @@ -0,0 +1,71 @@ +# Configuration for the Ideas On Purpose WordPress Docker environment, +# more info here: https://github.com/ideasonpurpose/docker-wordpress-dev + + +SSH_KEY_PATH= +# SSH_KEY_PATH should be set to the local path to your private key. For example, +# if you have public key named `id_rsa_deploy.pub` associated with your managed +# WordPress account, SSH_KEY_PATH should point to the pair's matching private +# key like this: SSH_KEY_PATH="~/.ssh/id_rsa_deploy" + + +SSH_LOGIN= +# SSH_LOGIN should be set to the SSH Login string from WP Engine's or Kinsta's +# admin backend. They should look something like this: +# - wpengine: "iop001@iop001.ssh.wpengine.net" +# - kinsta: "ssh iop001@11.22.33.44 -p 54321" +# In the above examples the elements map like this: +# `${SSH_USER}@${SSH_HOST}` +# Each item can also be entered individually, and individual entries will take +# precedence over components extracted from SSH_LOGIN. +# Values should be quoted for compatibility with Docker Compose v2.x + + +SSH_USER= +# The user account which connects to the server. For WP Engine, this matches the +# environment name. + + +SSH_HOST= +# The server address to connect to. + + +SSH_PORT= +# The server port listening for SSH connections + + +SSH_WP_CONTENT_DIR= +# default: sites/${SSH_USER}/wp-content +# SSH_WP_CONTENT_DIR is the path to the wordpress wp-content directory. This will +# most likely match the `WP_CONTENT_DIR` WordPress constant and does not include +# a trailing slash. +# Path can be relative to the SSH user home folder or an absolute path. +# Examples: +# - wpengine: sites/${SSH_USER}/wp-content +# - kinsta: public/wp-content + + +DATA_MODEL_PLUGIN= +BLOCKS_PLUGIN= +# Additional development plugins can be mounted into the WordPress environment as +# individual volumes. The local relative path to the working plugin directory should +# be pointed to the absolute path inside the container. In the following example, +# a data-model plugin is being developed in a sibling directory to the theme: +# +# DATA_MODEL_PLUGIN="../example-plugin:/var/www/html/wp-content/plugins/example-plugin" + + +WORDPRESS_DEBUG=1 +# This is used to set the WP_DEBUG constant to toggle WordPress debugging. +# .env vars are imported as strings, so true/false will not work correctly. +# PHP does correctly coerce the integers 0 and 1 to their corresponding boolean values. +# PHP interprets the number 0 as a string to boolean false +# Leave this value blank or set it to 0 to disable WP_DEBUG +# Setting this to 1, true or any other non-empty string enables WP_DEBUG + + +WP_ENVIRONMENT_TYPE= +# Blank or one of 'production', 'staging' or 'development'. For IOP's development +# environments, this value defaults to 'development'. Otherwise WordPress defaults +# to 'production'. Documentation: +# https://developer.wordpress.org/reference/functions/wp_get_environment_type/ diff --git a/.gitignore b/.gitignore index 396493b..0a59f50 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,178 @@ -node_modules -logs -wp-content -!wp-content/themes -wp-content/themes/twenty* +# Managed WordPress Hosting .gitignore file for ignoring WordPress files +# +# Most recent revision here: +# https://gist.github.com/joemaller/4f7518e0d04a82a3ca16 +# +# Raw Source (for curl): +# https://gist.githubusercontent.com/joemaller/4f7518e0d04a82a3ca16/raw +# +# Used by these WordPress Development environments: +# https://github.com/ideasonpurpose/docker-wordpress-dev +# https://github.com/ideasonpurpose/basic-wordpress-vagrant (deprecated) +# +# Originally based on WP Engine's gitignore files: +# https://wpengine.com/support/using-git-on-sites-with-legacy-staging/#ignore +# https://wpengine.com/wp-content/uploads/2013/10/recommended-gitignore-no-wp.txt + +# environment vars +.env + +# temp files, OS junk and dotfiles +*.bak +*.swp +*.tmp +*~ +.cvs +.DS_Store +.listing +.svn +Thumbs.db + +# wp core (as of 4.6) +/db-config.php +/index.php +/license.txt +/readme.html +/wp-activate.php +/wp-admin +/wp-app.php +/wp-atom.php +/wp-blog-header.php +/wp-comments-post.php +/wp-commentsrss2.php +/wp-config-sample.php +/wp-content/index.php +/wp-content/themes/index.php +/wp-content/themes/twenty* +/wp-cron.php +/wp-feed.php +/wp-includes +/wp-links-opml.php +/wp-load.php +/wp-login.php +/wp-mail.php +/wp-pass.php +/wp-rdf.php +/wp-register.php +/wp-rss.php +/wp-rss2.php +/wp-settings.php +/wp-signup.php +/wp-trackback.php +/xmlrpc.php + +# wordpress config, user-content and caches +cache/ +sitemap.xml +sitemap.xml.gz +wp-config.php +wp-content/advanced-cache.php +wp-content/backup-db/ +wp-content/backups/ +wp-content/blogs.dir +wp-content/cache/ +wp-content/cache/supercache/ +wp-content/managewp/ +wp-content/upgrade/ +wp-content/uploads/ +wp-content/wp-cache-config.php + +# WordPress debugging files & logs +*.log +debug.log +log.txt +logs/ + +# Third-party files and leftovers +gt-cache/ +ics-importer-cache/ +imagecache.* +pclzip-*.gz +wp-content/w3-.* +wp-content/w3tc.* +gallery/* +album/* + +# wpengine specific +.smushit-status +_wpeprivate +wp-content/advanced-cache.php +wp-content/object-cache.php + +# flywheel specific +wp-content/flywheel-config/ + +# large/disallowed file types +# a CDN should be used for these +*.3gp +*.3gpp +*.asf +*.asx +*.avi +*.bin +*.deb +*.dll +*.dmg +*.exe +*.flv +*.hqx +*.img +*.iso +*.kar +*.m4a +*.m4v +*.mid +*.midi +*.mng +*.mov +*.mp3 +*.mp4 +*.mpeg +*.mpg +*.msi +*.msm +*.msp +*.ogg +*.ra +*.webm +*.wmv + +# don't commit database dumpfiles *.sql +*.sql.gz +*.sql.tgz +*.sql.zip + +# npm and composer dependencies +node_modules/ +vendor/ + +# Let's try ignoring sourcemaps +*.css.map +*.js.map + +# basic-wordpress-vagrant v0.3.0 added links to Kint and XHProf. Ignore them +/kint +/xhprof + +# Moving away from Git-deploys, exclude generated artifacts +/_builds/ +/builds +dist/ + +# Webpack Stats & profiler +/webpack + +# Ignore all plugins +wp-content/plugins +wp-content/mu-plugins + +# I have not yet wanted these files in project history +*.code-workspace + +# Docker experiments +_log/ +_profiler/ + +# WSL 2 Cruft +*:Zone.Identifier diff --git a/.stylelintrc.js b/.stylelintrc.js new file mode 100644 index 0000000..9476165 --- /dev/null +++ b/.stylelintrc.js @@ -0,0 +1,308 @@ +// TODO: Move these into separate files +const special = { + groupName: "Special", + emptyLineBefore: "threshold", + noEmptyLineBetween: true, + properties: ["composes", "@import", "@extend", "@mixin", "@at-root"], +}; + +const content = { + groupName: "Content", + emptyLineBefore: "threshold", + noEmptyLineBetween: true, + properties: ["content"], +}; + +const positioning = { + groupName: "Positioning", + emptyLineBefore: "threshold", + noEmptyLineBetween: true, + properties: ["position", "top", "right", "bottom", "left", "z-index"], +}; + +const boxModel = { + groupName: "Box Model", + emptyLineBefore: "threshold", + noEmptyLineBetween: true, + properties: [ + "display", + "flex", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-grow", + "flex-shrink", + "flex-wrap", + "grid", + "grid-area", + "grid-auto-rows", + "grid-auto-columns", + "grid-auto-flow", + "grid-gap", + "grid-row", + "grid-row-start", + "grid-row-end", + "grid-row-gap", + "grid-column", + "grid-column-start", + "grid-column-end", + "grid-column-gap", + "grid-template", + "grid-template-areas", + "grid-template-rows", + "grid-template-columns", + "gap", + "align-content", + "align-items", + "align-self", + "justify-content", + "justify-items", + "justify-self", + "order", + "float", + "clear", + "box-sizing", + "width", + "min-width", + "max-width", + "height", + "min-height", + "max-height", + "margin", + "margin-top", + "margin-right", + "margin-bottom", + "margin-left", + "padding", + "padding-top", + "padding-right", + "padding-bottom", + "padding-left", + ], +}; + +const visual = { + groupName: "Visual", + emptyLineBefore: "threshold", + noEmptyLineBetween: true, + properties: [ + "list-style", + "list-style-position", + "list-style-type", + "list-style-image", + "table-layout", + "empty-cells", + "caption-side", + "background", + "background-color", + "background-image", + "background-repeat", + "background-position", + "background-position-x", + "background-position-y", + "background-size", + "background-clip", + "background-origin", + "background-attachment", + "background-blend-mode", + "border", + "border-color", + "border-style", + "border-width", + "border-top", + "border-top-color", + "border-top-width", + "border-top-style", + "border-right", + "border-right-color", + "border-right-width", + "border-right-style", + "border-bottom", + "border-bottom-color", + "border-bottom-width", + "border-bottom-style", + "border-left", + "border-left-color", + "border-left-width", + "border-left-style", + "border-radius", + "border-top-left-radius", + "border-top-right-radius", + "border-bottom-right-radius", + "border-bottom-left-radius", + "border-image", + "border-image-source", + "border-image-slice", + "border-image-width", + "border-image-outset", + "border-image-repeat", + "border-collapse", + "border-spacing", + "outline", + "outline-width", + "outline-style", + "outline-color", + "outline-offset", + "box-shadow", + "box-decoration-break", + "transform", + "transform-origin", + "transform-style", + "backface-visibility", + "perspective", + "perspective-origin", + "visibility", + "cursor", + "opacity", + "filter", + "isolation", + "backdrop-filter", + "mix-blend-mode", + ], +}; + +const typography = { + groupName: "Typography", + emptyLineBefore: "threshold", + noEmptyLineBetween: true, + properties: [ + "color", + "font", + "font-weight", + "font-size", + "font-family", + "font-style", + "font-variant", + "font-size-adjust", + "font-stretch", + "font-effect", + "font-emphasize", + "font-emphasize-position", + "font-emphasize-style", + "font-smooth", + "line-height", + "direction", + "letter-spacing", + "white-space", + "text-align", + "text-align-last", + "text-transform", + "text-decoration", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-style", + "text-emphasis-position", + "text-indent", + "text-justify", + "text-outline", + "text-wrap", + "text-overflow", + "text-overflow-ellipsis", + "text-overflow-mode", + "text-orientation", + "text-shadow", + "vertical-align", + "word-wrap", + "word-break", + "word-spacing", + "overflow-wrap", + "tab-size", + "hyphens", + "unicode-bidi", + "columns", + "column-count", + "column-fill", + "column-gap", + "column-rule", + "column-rule-color", + "column-rule-style", + "column-rule-width", + "column-span", + "column-width", + "page-break-after", + "page-break-before", + "page-break-inside", + "src", + ], +}; + +const animation = { + groupName: "Animation", + emptyLineBefore: "threshold", + noEmptyLineBetween: true, + properties: [ + "transition", + "transition-delay", + "transition-timing-function", + "transition-duration", + "transition-property", + "animation", + "animation-name", + "animation-duration", + "animation-play-state", + "animation-timing-function", + "animation-delay", + "animation-iteration-count", + "animation-direction", + "animation-fill-mode", + ], +}; + +const misc = { + groupName: "Misc.", + emptyLineBefore: "threshold", + noEmptyLineBetween: true, + properties: [ + "appearance", + // "content", + "clip", + "clip-path", + "counter-reset", + "counter-increment", + "resize", + "user-select", + "nav-index", + "nav-up", + "nav-right", + "nav-down", + "nav-left", + "pointer-events", + "quotes", + "touch-action", + "will-change", + "zoom", + "fill", + "fill-rule", + "clip-rule", + "stroke", + ], +}; + +module.exports = { + plugins: ["stylelint-order", "stylelint-prettier"], + customSyntax: "postcss-scss", + rules: { + "prettier/prettier": [true, { printWidth: 120 }], + "order/properties-order": [ + [ + special, + content, + positioning, + boxModel, + typography, + visual, + animation, + misc, + ], + { + emptyLineBeforeUnspecified: "threshold", + emptyLineMinimumPropertyThreshold: 7, + }, + ], + "rule-empty-line-before": [ + "always-multi-line", + { except: ["first-nested"], ignore: ["after-comment"] }, + ], + }, + ignoreFiles: ["**/node_modules/**/*", "**/dist/**/*", "**/*.js"], +}; diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..1016c99 --- /dev/null +++ b/composer.json @@ -0,0 +1,40 @@ +{ + "name": "ideasonpurpose/docker-wordpress-dev", + "description": "Docker-based local development environment for WordPress projects", + "authors": [ + { + "name": "Ideas On Purpose", + "homepage": "https://www.ideasonpurpose.com" + } + ], + "config": { + "optimize-autoloader": true, + "sort-packages": true, + "vendor-dir": "wp-content/themes/docker-wordpress-dev/vendor", + "platform": { + "php": "8.0", + "ext-intl": "0" + } + }, + "autoload": { + "psr-4": { + "IdeasOnPurpose\\": [ + "wp-content/themes/docker-wordpress-dev/lib" + ] + } + }, + "require": { + "ideasonpurpose/wp-google-analytics": "^1.1.0", + "ideasonpurpose/wp-svg-lib": "^2.0.1", + "ideasonpurpose/wp-theme-init": "^2.9.0", + "ideasonpurpose/wp-vimeo-embed": "dev-master", + "php-stubs/wordpress-stubs": "dev-master" + }, + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/ideasonpurpose/wp-vimeo-embed", + "no-api": true + } + ] +} diff --git a/docker-compose.yml b/docker-compose.yml index 9f1f66d..9d6ac80 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,28 +1,288 @@ services: - # This service bumps the WordPress verion in the Dockerfile to the latest release. - # See the bin/bump-wordpress.sh script for docs - # - https://github.com/igeclouds/wordpressdevenv - bump-wp: - image: jetbrainsinfra/jq:latest + # Primary database for the local WordPress development environment. + # Image from: https://hub.docker.com/_/mariadb + db: + # image: mysql:5.7 + # NOTE: 10.7.x was corrupting NJHI and IOP imports for unknown reasons + # image: mariadb:10.7.3 + image: mariadb:10.9.3 + restart: always + volumes: + - db_data:/var/lib/mysql + - ./_db:/docker-entrypoint-initdb.d + # - ./_log/mysql:/var/log/mysql + environment: + MYSQL_ALLOW_EMPTY_PASSWORD: 1 + MYSQL_DATABASE: wordpress + MYSQL_USER: wordpress + MYSQL_PASSWORD: wordpress + # command: > + # --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci + + # Ideas On Purpose's local WordPress development environment. + # Update image version with `docker run ideasonpurpose/wordpress init` + # Project info: https://github.com/ideasonpurpose/docker-wordpress-dev + wordpress: + depends_on: + - db + # image: ideasonpurpose/wordpress:dev + image: ideasonpurpose/wordpress:6.1.1 + restart: always + volumes: + - wp_data:/var/www/html + - ./wp-content/themes/${npm_package_name:-ioptheme}:/var/www/html/wp-content/themes/${npm_package_name:-ioptheme} + - ./wp-content/plugins:/var/www/html/wp-content/plugins + - ./wp-content/uploads:/var/www/html/wp-content/uploads + - ${DATA_MODEL_PLUGIN:-/tmp/null:/tmp/DATA_MODEL_PLUGIN} + - ${BLOCKS_PLUGIN:-/tmp/null:/tmp/BLOCKS_PLUGIN} + - ${IOP_DASHBOARD_PLUGIN:-/tmp/null:/tmp/IOP_DASHBOARD_PLUGIN} + - ./webpack/xdebug:/tmp/xdebug + expose: + - 9003 + environment: + DATA_MODEL_PLUGIN: + BLOCKS_PLUGIN: + WORDPRESS_DEBUG: + + # Apache will throw errors for any ulimit value below 8192 + # NOTE THAT THIS MIGHT BE MORE THAN THE SYSTEM OFFERS + ulimits: + nofile: 8192 + + # Ideas On Purpose's development toolchain + # Image from: https://hub.docker.com/r/ideasonpurpose/docker-build + tools: + # image: ideasonpurpose/docker-build:dev + image: ideasonpurpose/docker-build:0.13.2 + user: "${UID:-1000}:${GID:-1000}" + depends_on: + - wordpress + volumes: + - .:/usr/src/site/ + ports: + - "${npm_config_port:-8080}:8080" + environment: + PORT: ${npm_config_port:-8080} + entrypoint: npm run + command: start + + # Utility service which exposes wp-cli. Useful for testing pre-releases + # Update image version with `docker run ideasonpurpose/wordpress init` + # Project info: https://github.com/ideasonpurpose/docker-wordpress-dev + wp-cli: + depends_on: + - db + - wordpress + # image: ideasonpurpose/wordpress:dev + image: ideasonpurpose/wordpress:6.1.1 + profiles: ["utility"] + user: www-data + volumes: + - wp_data:/var/www/html + - ./wp-content/themes/${npm_package_name:-ioptheme}:/var/www/html/wp-content/themes/${npm_package_name:-ioptheme} + - ./wp-content/plugins:/var/www/html/wp-content/plugins + - ./wp-content/uploads:/var/www/html/wp-content/uploads + environment: + - WP_CLI_CACHE_DIR=/tmp/wp-cli + - WP_CLI_DISABLE_AUTO_CHECK_UPDATE=true + command: wp theme activate ${npm_package_name:-ioptheme} + + # Utility service for running composer commands. Useful for adding tools from packagist + # Image from: https://hub.docker.com/_/composer + composer: + image: composer:2.4.2 + profiles: ["utility"] + user: "${UID:-1000}:${GID:-1000}" + environment: + COMPOSER_HOME: /.composer volumes: - ./:/app + - ~/.composer:/.composer + command: install + + # Runs phpMyAdmin on port 8002 + # Image from: https://hub.docker.com/_/phpmyadmin + phpmyadmin: + image: phpmyadmin:5.2.0-apache + profiles: ["utility"] + ports: + - "${npm_config_port:-8002}:80" + depends_on: + - db + environment: + PMA_USER: root + PMA_PASSWORD: ~ + UPLOAD_LIMIT: 1G command: | - sh /app/bin/bump-wordpress.sh + bash -c 'echo && + echo -e "🛠 \033[33mStarting phpMyAdmin at\033[0m \033[36mhttp://localhost:${npm_config_port:-8002}\033[0m" && + echo && + /docker-entrypoint.sh apache2-foreground' - # Wrapper for the shfmt docker image - # Simplifies formatting scripts - # https://hub.docker.com/r/mvdan/shfmt - shfmt: - image: mvdan/shfmt:latest-alpine + # XDebug profile viewer at http://localhost:9001 (change port with --port=xxxx) + # Enable profiling by appending `?XDEBUG_PROFILE=1` to any request + # https://hub.docker.com/r/wodby/webgrind + webgrind: + image: wodby/webgrind:1.9 + profiles: ["utility"] user: "${UID:-1000}:${GID:-1000}" + ports: + - "${npm_config_port:-9004}:8080" + depends_on: + - wordpress volumes: - - ./bin:/mnt + - ./webpack/xdebug:/tmp + environment: + WEBGRIND_DEFAULT_TIMEZONE: America/New_York command: | - sh -c ' - echo && - echo -e "🧙‍ Formatting shell scripts in \033[36m./bin\033[0m with shfmt" && - shfmt -l -i 2 -w /mnt && - echo -e "✨ All done!" && - echo' + bash -c 'echo && + echo -e "🔍 \033[33mStarting WebGrind server at\033[0m \033[36mhttp://localhost:${npm_config_port:-9004}\033[0m" && + echo -e "⏱️ Profile any request by adding \033[1;35m?XDEBUG_PROFILE=1\033[0m to the url" && + echo && + php -S 0.0.0.0:8080 index.php + ' + + # Dumps the current database to _db/theme-YYYY-MM-DDTHHMMSS.sql.gz + # Image from: https://hub.docker.com/_/mariadb + mysqldump: + # image: mysql:5.7 + image: mariadb:10.9.3 + profiles: ["utility"] + depends_on: + - db + volumes: + - ./_db:/usr/src + environment: + MYSQL_DATABASE: wordpress + OWNER_GROUP: "${UID:-1000}:${GID:-1000}" + + # NOTE: The mysqldump file will include these CREATE/USE commands: + # CREATE DATABASE `wordpress`; + # USE `wordpress`; + # to drop those lines, remove "--databases" from the mysqldump command + command: | + bash -c 'for i in {1..10} + do echo -e "⏳ \033[33mWaiting for MySQL server...\033[0m" && + mysql -s -h db -e "exit" && break || sleep 3 + done && + sleep 2 && + echo -e "✔️ \033[32mConnected to MySQL\033[0m" && + export DUMPFILE="/usr/src/'${npm_package_name:-dumpfile}'-$$(date +%FT%H%M%S).sql" && + echo $${DUMPFILE} && + mysqldump -hdb --default-character-set=utf8mb4 --databases $${MYSQL_DATABASE} > "$${DUMPFILE}" && + gzip "$${DUMPFILE}" && + chown -R $${OWNER_GROUP} /usr/src && + echo "Successfully dumped MySQL database to \"$${DUMPFILE}.gz\""' + + # Reloads the database from the first found *.sql dumpfile in _db + # Image from: https://hub.docker.com/_/mariadb + mysql-reload: + # image: mysql:5.7 + image: mariadb:10.9.3 + profiles: ["utility"] + depends_on: + - db + volumes: + - ./_db:/usr/src/dumpfiles + environment: + MYSQL_DATABASE: wordpress + command: | + bash -c 'for i in {1..10} + do echo -e "⏳ \033[33mWaiting for MySQL server...\033[0m" && + mysql -s -h db -e "exit" && break || sleep 3 + done && + sleep 2 && + echo -e "✔️ \033[32mConnected to MySQL\033[0m" && + mysqladmin -hdb -v -f drop $${MYSQL_DATABASE} && + mysqladmin -hdb -v -f create $${MYSQL_DATABASE} && + echo Database \"$${MYSQL_DATABASE}\" created && + echo Reloading database from dumpfile && + mysql -hdb $${MYSQL_DATABASE} < $$(ls /usr/src/dumpfiles/*.sql | tail -n1)' + + # Activates the theme directly in the database + # Image from: https://hub.docker.com/_/mariadb + theme-activate: + # image: mysql:5.7 + image: mariadb:10.9.3 + profiles: ["utility"] + depends_on: + - db + volumes: + - ./_db:/usr/src/dumpfiles + environment: + MYSQL_DATABASE: wordpress + command: | + bash -c 'for i in {1..10} + do echo -e "⏳ \033[33mWaiting for MySQL server...\033[0m" && + mysql -s -h db -e "exit" && break || sleep 3 + done && + sleep 2 && + echo -e "✔️ \033[32mConnected to MySQL\033[0m" && + if [[ $$(mysql -s -h db $${MYSQL_DATABASE} -e "SHOW TABLES LIKE \"wp_options\"") ]] + then + echo -e "🎨 \033[36mActivating theme \033[0m\033[1m${npm_package_name:-ioptheme}\033[0m" + mysql -h db $${MYSQL_DATABASE} \ + -e "UPDATE wp_options \ + SET option_value = \"'${npm_package_name:-ioptheme}'\" \ + WHERE option_name in (\"template\",\"stylesheet\")" + else + echo -e "Unable to activate theme: \033[31m'\'wp_options\'' table does not exist.\033[0m" + echo "To recreate an existing site, copy the site'\''s MySQL dumpfile into _db" + echo If this project is starting from an empty database, you can ignore this messege. + fi' + + # Repairs permissions for known project files and directories + # Update image version with `docker run ideasonpurpose/wordpress init` + # Project info: https://github.com/ideasonpurpose/docker-wordpress-dev + repair-permissions: + # image: ideasonpurpose/wordpress:dev + image: ideasonpurpose/wordpress:6.1.1 + profiles: ["utility"] + volumes: + - .:/usr/src/site + environment: + OWNER_GROUP: "${UID:-1000}:${GID:-1000}" + entrypoint: /usr/local/bin/permissions.sh + + # Locally mirror remote sites by pulling the database, plugins and uploads + # Remote connections are configured in the project's .env file + # Run `docker run ideasonpurpose/wordpress init` to update the image version + # Project info: https://github.com/ideasonpurpose/docker-wordpress-dev + pull: + # image: ideasonpurpose/wordpress:dev + image: ideasonpurpose/wordpress:6.1.1 + profiles: ["utility"] + volumes: + - .:/usr/src/site + entrypoint: | + /usr/local/bin/pull.sh + environment: + OWNER_GROUP: "${UID:-1000}:${GID:-1000}" + SSH_KEY_PATH: + SSH_LOGIN: + SSH_USER: + SSH_PORT: + SSH_WP_CONTENT_DIR: + secrets: + - SSH_KEY + + # Run the init script from ideasonpurpose/wordpress:latest (intentionally "latest") + # to refresh tooling and bring the project inline with our boilerplate + # Image from: https://hub.docker.com/r/ideasonpurpose/docker-build + refresh: + # image: ideasonpurpose/wordpress:dev + image: ideasonpurpose/wordpress:latest + profiles: ["utility"] + volumes: + - .:/usr/src/site + command: init + +secrets: + SSH_KEY: + file: ${SSH_KEY_PATH:-~/.ssh/your_ssh_private_key} +volumes: + db_data: + name: ${npm_package_name:-ioptheme}_db + wp_data: + name: ${npm_package_name:-ioptheme}_wp diff --git a/ideasonpurpose.config.js b/ideasonpurpose.config.js new file mode 100644 index 0000000..75dee95 --- /dev/null +++ b/ideasonpurpose.config.js @@ -0,0 +1,25 @@ +const pkg = require("./package.json"); +const themeName = pkg.name || "ioptheme"; + +module.exports = { + src: `./wp-content/themes/${themeName}/src`, + dist: `./wp-content/themes/${themeName}/dist`, + entry: [ + "./js/main.js", + "./js/admin.js", + "./js/editor.js", + "./sass/main.scss", + ], + publicPath: `/wp-content/themes/${themeName}/dist/`, + + // enable polling on Windows (no iNotify events), does `isWindows` work? + // This property can be a boolean or an integer > 250 + // NOTE: iNotify events sometimes stop working on macOS, restart Docker to get them back + // usePolling: false, + + // OPTIONAL: Specify a Sass implementation, accepts `node-sass` and `sass` (Dart Sass, default) + // sass: "sass", + + // Set the webpack devtool option for sourcemaps + devtool: "source-map", +}; diff --git a/package.json b/package.json index 525fbef..077975c 100644 --- a/package.json +++ b/package.json @@ -4,15 +4,55 @@ "private": true, "description": "Docker-based local development environment for WordPress projects", "repository": "https://github.com/ideasonpurpose/docker-wordpress-dev", - "license": "MIT", "author": "Ideas On Purpose (https://www.ideasonpurpose.com/)", "contributors": [ "Joe Maller " ], "scripts": { + "_bootstrap:composer": "npm run composer:install", + "_bootstrap:npm": "npm ci", + "prebootstrap": "npm run permissions:repair", + "bootstrap": "npm run _bootstrap:npm && npm run _bootstrap:composer && npm run theme:activate", + "postbootstrap": "echo && echo ' 🚀' && echo ' ✨ All set!' && echo '🌏 Run this to get started:' && chalk bold yellow ' npm run start' && echo", + "build": "npm run docker:build", + "build:debug": "cross-env-shell \"docker compose run --rm -p $npm_package_config_port:8080 -p 9229:9229 tools build:debug\"", + "composer": "npm run composer:install", + "composer:install": "docker compose run --rm composer", + "composer:require": "docker compose run --rm composer require", + "composer:update": "docker compose run --rm composer update", + "docker:build": "docker compose run --rm tools build", + "docker:start": "docker compose run --rm --service-ports tools start", + "docker:stop": "docker compose down", + "log:wordpress": "npm run logs:wordpress", + "logs:wordpress": "docker compose exec wordpress tail -f /var/log/wordpress/debug.log", + "mysql": "docker compose exec db mysql wordpress", + "mysql:dump": "docker compose run --rm mysqldump", + "mysql:reload": "cross-env-shell \"docker compose run --rm mysql-reload\"", + "postmysql:reload": "npm run theme:activate", + "mysqldump": "npm run mysql:dump", + "permissions:repair": "docker compose run --rm repair-permissions", + "phpmyadmin": "docker compose run --rm --service-ports phpmyadmin", + "preproject:refresh": "docker compose pull refresh", + "project:refresh": "docker compose run --rm refresh", + "postproject:refresh": "docker compose pull wordpress", + "pull": "npm run pull:db && npm run pull:plugins && npm run pull:uploads", + "prepull:db": "npm run mysql:dump", + "pull:db": "docker compose run --rm pull database", + "postpull:db": "npm run mysql:reload", + "pull:plugins": "docker compose run --rm pull plugins", + "pull:uploads": "docker compose run --rm pull uploads", + "pull:uploads-all": "docker compose run --rm pull uploads all", + "start": "npm run docker:start || exit 0", + "poststart": "npm run stop", + "start:debug": "cross-env-shell \"docker compose run --rm -p $npm_package_config_port:8080 -p 9229:9229 tools start:debug\"", + "stop": "npm run docker:stop", + "theme:activate": "cross-env-shell \"docker compose run --rm theme-activate\"", + "version": "version-everything && git add -u", + "postversion": "npm run build", + "webgrind": "docker compose run --rm --service-ports webgrind", + "wp-cli": "cross-env-shell \"docker compose run --rm wp-cli\"", "bump": "npm run wordpress:bump", "shfmt": "docker compose run --rm shfmt", - "version": "version-everything && auto-changelog && git add -u", "wordpress:bump": "docker-compose run --rm bump-wp" }, "prettier": { @@ -49,24 +89,33 @@ }, "devDependencies": { "@prettier/plugin-php": "^0.19.2", - "auto-changelog": "^2.4.0", + "chalk-cli": "^5.0.0", + "cross-env": "^7.0.3", + "postcss-scss": "^4.0.5", "prettier": "^2.7.1", - "version-everything": "^0.9.1" - }, - "auto-changelog": { - "package": true, - "backfillLimit": 7 + "sort-package-json": "^2.0.0", + "stylelint": "^14.14.0", + "stylelint-order": "^5.0.0", + "stylelint-prettier": "^2.0.0", + "version-everything": "^0.9.1", + "auto-changelog": "^2.4.0" }, "version-everything": { - "prefix": "ideasonpurpose/wordpress:", "files": [ + "Dockerfile", + "README.md", "bin/docker-entrypoint-iop.sh", "bin/getting-started.sh", "bin/permissions.sh", "bin/pull.sh", "bin/wp-init.sh", - "Dockerfile", - "README.md" - ] + "wp-content/themes/docker-wordpress-dev/style.css" + ], + "prefix": "ideasonpurpose/wordpress:" + }, + "license": "MIT", + "auto-changelog": { + "package": true, + "backfillLimit": 7 } } diff --git a/wp-content/themes/docker-wordpress-dev/404.php b/wp-content/themes/docker-wordpress-dev/404.php new file mode 100644 index 0000000..fb81458 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/404.php @@ -0,0 +1,68 @@ + -1, + 'post_type' => 'page', + 'meta_query' => [ + [ + 'key' => '_wp_page_template', + 'value' => '404.php', + ], + ], +]; +$pageQuery = new \WP_Query($args); + +/** + * Use $pageQuery or a synthetic $post object to populate page title and content + */ +if ($pageQuery->have_posts()) { + /** + * Some hosts including WP Engine disable MySQL's `ORDER BY RAND()` option since it + * can be extremely burdensome with larger tables. + * @link https://wpengine.com/support/about-order-by-rand/ + * + * Instead, we just shuffle the returned collection of posts then use the first one. + */ + shuffle($pageQuery->posts); // some hosts disable MySQL rand() queries + $pageQuery->the_post(); +} else { + $fakePost = new \stdClass(); + $fakePost->ID = 0; + $fakePost->post_title = $pageTitle; + $fakePost->post_content = $pageContent; + $fakePost->filter = 'raw'; + + $post = new WP_Post($fakePost); + setup_postdata($post); +} + +get_header(); + +get_template_part('template-parts/page'); + +get_footer(); diff --git a/wp-content/themes/docker-wordpress-dev/archive.php b/wp-content/themes/docker-wordpress-dev/archive.php new file mode 100644 index 0000000..825dfe8 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/archive.php @@ -0,0 +1,13 @@ +post_type); + +get_footer(); diff --git a/wp-content/themes/docker-wordpress-dev/footer.php b/wp-content/themes/docker-wordpress-dev/footer.php new file mode 100644 index 0000000..3c44609 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/footer.php @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/wp-content/themes/docker-wordpress-dev/front-page.php b/wp-content/themes/docker-wordpress-dev/front-page.php new file mode 100644 index 0000000..ea2cbef --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/front-page.php @@ -0,0 +1,20 @@ + + + + +
+
+ +
+
+ + + +get('Version')); +} + +new ThemeInit(); + +/** + * Load Scripts from the webpack generated dist/dependency-manifest.json file + */ +new ThemeInit\Manifest(); + +/** + * Initialize IdeasOnPurpose\WP\GoogleAnalytics + */ +$client_ga_id = 'UA-2565788-3'; +$iop_dev_ga = 'UA-2565788-3'; +new WP\GoogleAnalytics($client_ga_id, $iop_dev_ga); + +/** + * Initialize our SVG Library for all SVGs in ./dist/images/svg + */ +new WP\SVG(__DIR__ . '/dist/images/svg'); + +/** + * Register Custom Widgets + */ +// new Widgets\NAME(); + +/** + * Register Custom Shortcodes + */ +// new Shortcodes\NAME(); + +/** + * Enable TaxonomyCountColumn so post-counts in Taxonomy listings are accurate to the displayed post_type + */ +new WP\TaxonomyCountColumn(); + +/** + * Add Search redirect and length limiter + */ +new WP\Search(); + +/** + * Enable assorted WordPress features + */ +add_action('after_setup_theme', function () { + // Add excerpts to pages + add_post_type_support('page', 'excerpt'); + + // Theme features + add_theme_support('post-thumbnails'); + add_theme_support('title-tag'); + add_theme_support('html5', ['search-form', 'gallery', 'caption']); + + // Gutenberg settings + add_theme_support('editor-styles'); // https://developer.wordpress.org/block-editor/developers/themes/theme-support/#editor-styles + add_theme_support('align-wide'); // https://wordpress.org/gutenberg/handbook/extensibility/theme-support/#wide-alignment + add_theme_support('disable-custom-colors'); // https: //wordpress.org/gutenberg/handbook/extensibility/theme-support/#disabling-custom-colors-in-block-color-palettes +}); + +/** + * Register Sidebars and disable default widgets + */ +add_action('widgets_init', function () { + // register_sidebars(); + + unregister_widget('WP_Nav_Menu_Widget'); + unregister_widget('WP_Widget_Archives'); + unregister_widget('WP_Widget_Calendar'); + unregister_widget('WP_Widget_Categories'); + unregister_widget('WP_Widget_Custom_HTML'); + unregister_widget('WP_Widget_Links'); + unregister_widget('WP_Widget_Media_Audio'); + unregister_widget('WP_Widget_Media_Gallery'); + unregister_widget('WP_Widget_Media_Video'); + unregister_widget('WP_Widget_Meta'); + unregister_widget('WP_Widget_Pages'); + unregister_widget('WP_Widget_Recent_Comments'); + unregister_widget('WP_Widget_Recent_Posts'); + unregister_widget('WP_Widget_RSS'); + unregister_widget('WP_Widget_Search'); + unregister_widget('WP_Widget_Tag_Cloud'); +}); + +/** + * Register Custom Menus + */ +add_action('after_setup_theme', function () { + register_nav_menus([ + 'menu-main' => 'Main Menu', + 'menu-footer' => 'Footer Menu', + ]); +}); + +/** + * Define additional image sizes + * Image sizes are generated from an array of size objects + * Each size maps like this: + * name: (string) Internal image size name (slug) + * dims: (array) Array of two integers: [w, h] + * display: (string) Show in WP Menus using this name + * crop: (array|boolean) if not false, hard-crop the resulting image + * + * If display_name is specified, the image size will appear in authoring menus + */ +$image_sizes = [ + ['name' => '1k', 'dims' => [1024, 1024], 'display' => '1k - 1024px'], + ['name' => '2k', 'dims' => [2048, 2048], 'display' => '2k - 2048px'], + ['name' => '4k', 'dims' => [3840, 3840], 'display' => '4k - 3840px'], +]; +new ImageSize($image_sizes); + +/** + * ACF Options Pages + */ +if (function_exists('acf_add_options_page')) { + $acf_options = acf_add_options_page([ + 'page_title' => 'Global Theme Options', + 'menu_title' => 'Site Options', + 'position' => 35, + 'icon_url' => + 'data:image/svg+xml;base64,' . + base64_encode( + ' + + ', + ), + ]); + + acf_add_options_sub_page([ + 'page_title' => 'Header Options', + 'menu_title' => 'Header', + 'parent_slug' => $acf_options['menu_slug'], + ]); + + + acf_add_options_sub_page([ + 'page_title' => 'Footer Options', + 'menu_title' => 'Footer', + 'parent_slug' => $acf_options['menu_slug'], + ]); +} + diff --git a/wp-content/themes/docker-wordpress-dev/header.php b/wp-content/themes/docker-wordpress-dev/header.php new file mode 100644 index 0000000..0b9e8ee --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/header.php @@ -0,0 +1,14 @@ + + class="no-js"> + + + + + + + + + +> + +post_name); +} + +get_footer(); diff --git a/wp-content/themes/docker-wordpress-dev/lib/ImageSize.php b/wp-content/themes/docker-wordpress-dev/lib/ImageSize.php new file mode 100644 index 0000000..9480490 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/lib/ImageSize.php @@ -0,0 +1,64 @@ +sizes = $image_sizes; + $this->names = []; + + add_action('after_setup_theme', [$this, 'addSizes']); + add_filter('image_size_names_choose', [$this, 'addToMenu']); + } + + public function addSizes() + { + foreach ($this->sizes as $img) { + $crop = false; + if (isset($img['crop'])) { + $crop = (is_array($img['crop'])) ? $img['crop'] : boolval($img['crop']); + } + add_image_size($img['name'], $img['dims'][0], $img['dims'][1], $crop); + if (isset($img['display'])) { + $this->names[$img['name']] = $img['display']; + } + } + } + + /** + * Adds our custom sizes to the WordPress image size menu + * @param array $sizes Array ofimage sizes passed from the iamge_size_names_choose filter + */ + public function addToMenu($sizes) + { + return array_merge($sizes, $this->names); + } + + /** + * Add a filter to remove $sizes from the WordPress thumbnail generation + * @param array $sizes An associative array of image sizes. + */ + public static function removeSizes($sizes) + { + add_filter('intermediate_image_sizes_advanced', function ($defaultSizes) use ($sizes) { + foreach ($sizes as $size) { + unset($defaultSizes[$size]); + } + return $defaultSizes; + }); + } +} diff --git a/wp-content/themes/docker-wordpress-dev/lib/WP/TaxonomyCountColumn.php b/wp-content/themes/docker-wordpress-dev/lib/WP/TaxonomyCountColumn.php new file mode 100644 index 0000000..f25e810 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/lib/WP/TaxonomyCountColumn.php @@ -0,0 +1,173 @@ +object_type); + $guid = sha1(json_encode([$termId, $taxName, $post_types])); + + if (get_transient($guid) === false) { + foreach ($post_types as $type) { + $args = [ + 'posts_per_page' => -1, + 'post_type' => $type, + 'tax_query' => [['taxonomy' => $taxName, 'terms' => $termId]], + ]; + $countQuery = new \WP_Query($args); + + update_term_meta($termId, "count_{$type}", $countQuery->found_posts); + } + set_transient($guid, true, 60); + } + } + + /** + * Adds a meta_query exposing the count_{$post_type} field to the Term Query so there are values to + * order by. Since the query_var has the same name as the termmeta field, we can rely on WordPress + * to sanitize the input. + * + * The query returns whether a number or null depending on whether the key exists. + * + * ref: https://core.trac.wordpress.org/ticket/40335 + * ref: https://stackoverflow.com/a/47224730/503463 + */ + public function orderByMeta(\WP_Term_Query $query) + { + $orderby = $query->query_vars['orderby'] ?? false; + + if (preg_match('/^count_[-a-z]+/', $orderby)) { + $meta_query = new \WP_Meta_Query([ + $orderby => [ + 'relation' => 'OR', + ['key' => $orderby, 'type' => 'NUMERIC'], + ['key' => $orderby, 'compare' => 'NOT EXISTS'], + ], + ]); + $query->meta_query = $meta_query; + } + } + + /** + * Adds a sortable Count column and 'Refresh Counts' bulk action to the Taxonomy admin interface + */ + public function setupTaxonomyAdmin() + { + $taxonomies = get_taxonomies(['public' => true], 'names'); + + foreach ($taxonomies as $taxonomy) { + add_filter("manage_edit-{$taxonomy}_columns", [$this, 'addCountColumn'], 100); + add_filter("manage_edit-{$taxonomy}_sortable_columns", [$this, 'makeCountColumnSortable'], 100); + add_action("manage_{$taxonomy}_custom_column", [$this, 'renderCountColumn'], 100, 3); + + add_filter("bulk_actions-edit-{$taxonomy}", [$this, 'addResetBulkAction']); + add_filter("handle_bulk_actions-edit-{$taxonomy}", [$this, 'bulkActionHandler'], 100, 3); + } + add_action('admin_notices', [$this, 'addCountUpdateNotice']); + add_action('admin_enqueue_scripts', [$this, 'adminCountColumnStyles'], 100); + } + + public function addCountColumn($cols) + { + $newCols = $cols; + unset($newCols['posts']); + $newCols['post_type_count'] = 'Count'; + return $newCols; + } + + public function makeCountColumnSortable($cols) + { + global $post_type; + $newCols = $cols; + $newCols['post_type_count'] = "count_$post_type"; + return $newCols; + } + + public function renderCountColumn($content, $name, $id) + { + $output = $content; + if ($name === 'post_type_count') { + $screen = get_current_screen(); + + $term = get_term($id); + $taxonomy = get_taxonomy($term->taxonomy); + $count = get_term_meta($id, "count_{$screen->post_type}", true); + + $viewHref = add_query_arg( + [$taxonomy->query_var => $term->slug, 'post_type' => $screen->post_type], + 'edit.php', + ); + + $output .= strlen($count) ? sprintf('%s', $viewHref, $count) : '--'; + } + return $output; + } + + public function addResetBulkAction($actions) + { + $newActions = ['reset_post_type_counts' => 'Refresh Counts']; + return array_merge($newActions, $actions); + } + + public function bulkActionHandler($redirect, $action, $ids) + { + $screen = get_current_screen(); + + if (strlen($screen->taxonomy)) { + if (count($ids)) { + wp_update_term_count_now($ids, $screen->taxonomy); + $redirect = add_query_arg(['post_type_count_updated' => count($ids)], $redirect); + } + } + return $redirect; + } + /** + * Note: This method outputs an update message into the admin + */ + public function addCountUpdateNotice() + { + if (!empty($_REQUEST['post_type_count_updated'])) { + $screen = get_current_screen(); + $taxonomy = get_taxonomy($screen->taxonomy); + $term = strtolower($taxonomy->labels->singular_name); + $terms = strtolower($taxonomy->labels->name); + $count = intval($_REQUEST['post_type_count_updated']); + + $msg = _n("Updated count for {$count} {$term}.", "Updated counts for {$count} {$terms}.", $count); + printf('

%s

', $msg); + } + } + + public function adminCountColumnStyles() + { + $css = " + .column-post_type_count { + width: 74px; + text-align: center; + } + "; + wp_add_inline_style('wp-admin', $css); + } +} diff --git a/wp-content/themes/docker-wordpress-dev/page.php b/wp-content/themes/docker-wordpress-dev/page.php new file mode 100644 index 0000000..a7933e9 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/page.php @@ -0,0 +1,18 @@ + true]; + +get_header(); + +while (have_posts()) { + the_post(); + + get_template_part('template-parts/page', $post->post_name, $args); +} + +get_footer(); diff --git a/wp-content/themes/docker-wordpress-dev/screenshot.png b/wp-content/themes/docker-wordpress-dev/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..238df6a8228876d1d60960ed6bf99bcd999b2d5a GIT binary patch literal 110477 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%0Dgb_2&Y+2=X8Ys z!nr5(Y~8MPS&rwedEGeH??zA+u;@@aC+Eur>)1q@S*eTgZK^vOF5Go8h;Uwhqw#dh zWAdiUH&5mxuI=$3E~AM7L8FOx1S&gTFn^0{?&G?=@W-F=?29k%{>JywAIYP4CL@Fg zxd@g%xM?puKG|>}6rWt_y%IM;nG<@jc~amTt=pXkD$8*cd(Y`hKTqOpMSBdhH!i-q z`S=wzs}4!ht0Ok?8|-?A@@(Q}R>i3d*|7fXF<2H|O(_Qqk>$qkh{|r zVv*p*EKOGt5{)j#f+opL^>c+y!y$TK57L=U%|&uXmYC{>iV7MP{3~<^Q5<@khnA)L zWxeIXA366A2HJkK*igT!{U;>2cK^zM`9`u{B7t5{N9OvyCoTAm{4NbV=kz~ca7XQm zI`XkeD?hF7!uW5ps z6_V_J-S7IVzfOe~BM0e+BP`FUeSyuJmOScGJF`5YmAcDj^Klu+{B1JW}V& zRaMK|3yW4cN=eB?*$YT+_TznWeopnrBNgL|(_KYX&};91mrYGsaEL#zd|M?~PN-nM zp^2f#UXJau?ph`3(%r1Bwm72g_Q?Kk77CPS6j1BVj@DlrR$07mloZ{WM(5bXYWh7~ zd?#Q{`ewO`LPcJ;J3%~o$@GsUi>2)8fu7u$g-0lI3zlNL%~F%sajl0v#fFpln61t4 z*;MRQ`}Ui z{z8?&q-oT>qR+cp_`j8qzb)#>E>6-bzaPGbiIWrsuIrDRC`8Ec7Iv-oYHR8B*Nlz= zTl?DDWs0YCyg!6QH>tdcW>T2LPd=iI;{7C`+U@qZokMS+Pc18KWjmH~G_!5g|HEqk__tWctRnw0N~_}8lT$4Fy{1}j zF^RJ8R4d6s%gK-P!qwu4uHL>hP8IiTd@VJ~7K~TFijE&0+PI=ECW*|HEXj@yN1z;ftq#Q;ttK3M`JB_V%!kQCIqs2> zv7s2R{FmbrV}%s~GY~GbT`e=)KKOWZ=!BKyn8D7dTgT&(Lv#A6c+bKi>6_K!d1Q_1i3x!--RnK)aXPPlNkT~3j9xH9Du+y+0cK+qY1o$3F0amfU~88U6pupGp}zt{y$Taz|heU)K&b z-@2Pl<$z3^{=-i{)rrUX*~K2mq3omEA73XZx(d5lSQQotBi8@?0gOfS;tMdp@ed31 zh4nJW_~T}4xGpE3rK6IXNRE?sC8D_-}uc z3oFnRxGD7K?`l;<`!!mb&M@q9{BeOmgO7b&!;post_type); +} + +get_footer(); diff --git a/wp-content/themes/docker-wordpress-dev/src/acf-json/group_637d587898a29.json b/wp-content/themes/docker-wordpress-dev/src/acf-json/group_637d587898a29.json new file mode 100644 index 0000000..ec49e42 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/acf-json/group_637d587898a29.json @@ -0,0 +1,85 @@ +{ + "key": "group_637d587898a29", + "title": "Cookies and Copyright", + "fields": [ + { + "key": "field_60ec673efed85", + "label": "Cookie Notice", + "name": "cookie_notice", + "aria-label": "", + "type": "textarea", + "instructions": "Basic HTML is allowed.", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "75", + "class": "", + "id": "" + }, + "default_value": "This site uses cookies for analytics. By continuing to browse this site, you agree to this use.", + "placeholder": "This site uses cookies for analytics. By continuing to browse this site, you agree to this use.", + "maxlength": "", + "rows": 3, + "new_lines": "wpautop" + }, + { + "key": "field_60ec6964fc0c2", + "label": "Cookie Accept Button", + "name": "cookie_accept_button", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "25", + "class": "", + "id": "" + }, + "default_value": "Agree", + "placeholder": "Agree", + "prepend": "", + "append": "", + "maxlength": "" + }, + { + "key": "field_6082c24c9b58e", + "label": "Copyright Line", + "name": "copyright", + "aria-label": "", + "type": "text", + "instructions": "Text appearing after the copyright symbol. Use the token %YEAR%<\/code> to insert the current year.", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "CLIENT NAME - %YEAR% All Rights Reserved", + "placeholder": "CLIENT NAME - %YEAR% All Rights Reserved", + "prepend": "©", + "append": "", + "maxlength": "" + } + ], + "location": [ + [ + { + "param": "options_page", + "operator": "==", + "value": "acf-options-footer" + } + ] + ], + "menu_order": 11, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1669159125 +} \ No newline at end of file diff --git a/wp-content/themes/docker-wordpress-dev/src/favicon/favicon.ico b/wp-content/themes/docker-wordpress-dev/src/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..49ecd52f0ef3c29a9644346b828c4c4488e047f8 GIT binary patch literal 606 zcmV-k0-^nhP)jK~#7F)tZe_ z!axv(U#tK-xKu!>KR6sg7cgbDmz>K50OSt`J9vL!@ z?#o-eKN18$Lyzb(BaKOll#xb8meMFE9Z0(bNr_v*MU$4KElGFOp0pq-424tp$)oT# zee`amr^2tbL}>WQn7H*oDuSg!zi2+dQ*RUh%^7?!Eu(L&ZY>o_@!d>tbP*MAHE*jm zX(?XOWsl22CPw3n{xt!p1!3?!6q<;ESeOoffvZ*fnO4V?c;LK2}~iE85_tTmy8XJ zAs5946y!4I53z<^D(MC;Cvy^E0~G`#-9X6(a>(Uu;0U=Kq$iN`zfqo=o*SPl$7V#5Fx$-~3^~#Pf#uc>dS1EN`MlbT+U;7a}pSf)D1j z=2nM%3xq(|$E?MG#q*J_LTCnPsgrlh{J{jLvFW35UC#!F!5CR+zZ3keZ{Z07VET26 sdIYy$xlzuKR7Sk|JDTgKJtp$u8yf{|g)0a=R{#J207*qoM6N<$f literal 0 HcmV?d00001 diff --git a/wp-content/themes/docker-wordpress-dev/src/images/svg/email.svg b/wp-content/themes/docker-wordpress-dev/src/images/svg/email.svg new file mode 100644 index 0000000..3812a6b --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/images/svg/email.svg @@ -0,0 +1 @@ + diff --git a/wp-content/themes/docker-wordpress-dev/src/images/svg/facebook.svg b/wp-content/themes/docker-wordpress-dev/src/images/svg/facebook.svg new file mode 100644 index 0000000..28384d7 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/images/svg/facebook.svg @@ -0,0 +1 @@ + diff --git a/wp-content/themes/docker-wordpress-dev/src/images/svg/instagram.svg b/wp-content/themes/docker-wordpress-dev/src/images/svg/instagram.svg new file mode 100644 index 0000000..48f141e --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/images/svg/instagram.svg @@ -0,0 +1 @@ + diff --git a/wp-content/themes/docker-wordpress-dev/src/images/svg/linkedin.svg b/wp-content/themes/docker-wordpress-dev/src/images/svg/linkedin.svg new file mode 100644 index 0000000..555b211 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/images/svg/linkedin.svg @@ -0,0 +1 @@ + diff --git a/wp-content/themes/docker-wordpress-dev/src/images/svg/pinterest.svg b/wp-content/themes/docker-wordpress-dev/src/images/svg/pinterest.svg new file mode 100644 index 0000000..543aad1 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/images/svg/pinterest.svg @@ -0,0 +1 @@ + diff --git a/wp-content/themes/docker-wordpress-dev/src/images/svg/site-logo.svg b/wp-content/themes/docker-wordpress-dev/src/images/svg/site-logo.svg new file mode 100644 index 0000000..22db2a2 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/images/svg/site-logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/wp-content/themes/docker-wordpress-dev/src/images/svg/twitter.svg b/wp-content/themes/docker-wordpress-dev/src/images/svg/twitter.svg new file mode 100644 index 0000000..5cce3d4 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/images/svg/twitter.svg @@ -0,0 +1 @@ + diff --git a/wp-content/themes/docker-wordpress-dev/src/images/svg/vimeo.svg b/wp-content/themes/docker-wordpress-dev/src/images/svg/vimeo.svg new file mode 100644 index 0000000..f241af3 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/images/svg/vimeo.svg @@ -0,0 +1 @@ + diff --git a/wp-content/themes/docker-wordpress-dev/src/images/svg/youtube.svg b/wp-content/themes/docker-wordpress-dev/src/images/svg/youtube.svg new file mode 100644 index 0000000..64870a7 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/images/svg/youtube.svg @@ -0,0 +1 @@ + diff --git a/wp-content/themes/docker-wordpress-dev/src/js/admin.js b/wp-content/themes/docker-wordpress-dev/src/js/admin.js new file mode 100644 index 0000000..7edc661 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/js/admin.js @@ -0,0 +1,3 @@ +require('../sass/admin.scss'); + +console.log("admin.js"); diff --git a/wp-content/themes/docker-wordpress-dev/src/js/editor.js b/wp-content/themes/docker-wordpress-dev/src/js/editor.js new file mode 100644 index 0000000..968ab53 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/js/editor.js @@ -0,0 +1,12 @@ +/* global wp:true */ + +require("../sass/editor.scss"); + +console.log("editor.js"); + +/* +wp.blocks.registerBlockStyle("core/paragraph", { + name: "intro", + label: "Intro" +}); +*/ diff --git a/wp-content/themes/docker-wordpress-dev/src/js/main.js b/wp-content/themes/docker-wordpress-dev/src/js/main.js new file mode 100644 index 0000000..fbe8f35 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/js/main.js @@ -0,0 +1,9 @@ +/** + * If we import main.scss here, remove it from the entry array in ideasonpurpose.config.js + */ + +// require('../sass/main.scss') +require('../js/modules/share.js'); +require('../js/modules/menu.js'); + +console.log('JS Loaded'); diff --git a/wp-content/themes/docker-wordpress-dev/src/js/modules/menu.js b/wp-content/themes/docker-wordpress-dev/src/js/modules/menu.js new file mode 100644 index 0000000..d846c9f --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/js/modules/menu.js @@ -0,0 +1,48 @@ +import $ from "jquery"; + +const $html = $('html'); +const $body = $('body'); +const $window = $(window); +const menuOpenClass = 'menu-open'; +const menuTriggerClass = '.js-toggle-menu'; + + +/** + * Toggle Menu + * + * Toggles the menuOpenClass on + * + * Prevents from being scrolled + * while the hamburger menu is open + */ + +function toggleMenu() { + var top = $window.scrollTop(); + + // Pin the body and prevent scrolling while the menu is open + if (!$body.is('.' + menuOpenClass)) { + $body.css('top', -1 * top + 'px').attr('data-scroll', top); + } + + $body.toggleClass(menuOpenClass); + + // Scroll the body back to its initial position + if (!$body.is('.' + menuOpenClass)) { + $('body,html').scrollTop($('body').attr('data-scroll')); + } +} + +/** + * Hamburger button class + */ + +$(menuTriggerClass).on('click', toggleMenu); + + +/** + * ESC key toggles the menu + */ + +$html.on('keyup', function (e) { + e.keyCode === 27 && toggleMenu(); +}); diff --git a/wp-content/themes/docker-wordpress-dev/src/js/modules/share.js b/wp-content/themes/docker-wordpress-dev/src/js/modules/share.js new file mode 100644 index 0000000..68b8910 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/js/modules/share.js @@ -0,0 +1,16 @@ +import $ from "jquery"; + +const shareClass = ".js--share"; + +// Share buttons +$("body").on("click", shareClass, function (e) { + e.preventDefault(); + + window + .open( + $(this).attr("href"), + "Share", + "height=500,width=900,top=150,left=150" + ) + .focus(); +}); diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/admin.scss b/wp-content/themes/docker-wordpress-dev/src/sass/admin.scss new file mode 100644 index 0000000..17eb3f1 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/admin.scss @@ -0,0 +1,3 @@ +/** + * Admin styles for everything but the editor + */ diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/base/_base.scss b/wp-content/themes/docker-wordpress-dev/src/sass/base/_base.scss new file mode 100644 index 0000000..0f87339 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/base/_base.scss @@ -0,0 +1,25 @@ +/** + * Base + */ + +html { + scroll-behavior: smooth; // no-js jumplink smooth scroll transition + + // Prevent horizontal scrolling + width: 100%; + overflow-x: hidden; +} + +body { + @extend .sans; + + // Prevent scrolling while the hamburger menu is open + @include mq(lg, "max") { + &.menu-open { + position: fixed; + left: 0; + right: 0; + overflow: hidden; + } + } +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/base/_fonts.scss b/wp-content/themes/docker-wordpress-dev/src/sass/base/_fonts.scss new file mode 100644 index 0000000..2000de0 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/base/_fonts.scss @@ -0,0 +1,12 @@ +/** + * Fonts + * + * Should always default to a system font stack + * https://css-tricks.com/snippets/css/system-font-stack/ + */ + +// @import url("https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200;0,300;0,400;0,600;0,700;0,800;0,900;1,200;1,300;1,400;1,600;1,700;1,800;1,900&display=swap"); + +.sans { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/base/_reset.scss b/wp-content/themes/docker-wordpress-dev/src/sass/base/_reset.scss new file mode 100644 index 0000000..53993ed --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/base/_reset.scss @@ -0,0 +1,88 @@ +* { + box-sizing: border-box; +} + +main { + display: block; +} + +html, body, div, span, applet, object, iframe, p, blockquote, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video, button, pre { + margin: 0; + padding: 0; + border: 0; + background: 0; + font-size: 100%; + font-family: inherit; + vertical-align: baseline; +} + +h1, h2, h3, h4, h5, h6 { + margin: 0; +} + +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + +html { + line-height: 1.15; + -webkit-text-size-adjust: 100%; +} + +a { + color: inherit; + text-decoration: none; + background-color: transparent; +} + +svg { + fill: currentColor; +} + +ol, ul { + list-style: none; +} + +img { + border-style: none; + max-width: 100%; +} + +blockquote, q { + quotes: none; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +[hidden] { + display: none; +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/base/_typography.scss b/wp-content/themes/docker-wordpress-dev/src/sass/base/_typography.scss new file mode 100644 index 0000000..bf26faf --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/base/_typography.scss @@ -0,0 +1,13 @@ +/** + * Typography + */ + +.type- { + &intro { + font-size: 1em; + } +} + +.is-style-intro { + @extend .type-intro; +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/base/_utilities.scss b/wp-content/themes/docker-wordpress-dev/src/sass/base/_utilities.scss new file mode 100644 index 0000000..ad6a97c --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/base/_utilities.scss @@ -0,0 +1,40 @@ +/** + * Utility classes + */ + +.a11y { + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(1px); + border: 0; + padding: 0; + width: 1px; + height: 1px; + margin: -1px; + white-space: nowrap; + overflow: hidden; + display: block; + position: absolute; + background: #000; + color: #fff; +} + +/* + This class can be @extend'ed so that an item + extends its background color to the sides of the screen +*/ + +.extends-bg { + position: relative; + z-index: 1; + + &::before { + content: ""; + position: absolute; + background: inherit; + left: -100vw; + right: -100vw; + top: 0; + bottom: 0; + z-index: -1; + } +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/editor.scss b/wp-content/themes/docker-wordpress-dev/src/sass/editor.scss new file mode 100644 index 0000000..0246585 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/editor.scss @@ -0,0 +1,3 @@ +/** + * Styles for the WordPres block editor + */ diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/main.scss b/wp-content/themes/docker-wordpress-dev/src/sass/main.scss new file mode 100644 index 0000000..c509139 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/main.scss @@ -0,0 +1,38 @@ +@charset "utf-8"; + +@import + // Variables + "variables/colors", + "variables/layout", + + // Mixins + "mixins/breakpoint", + "mixins/columns", + "mixins/rows", + + // Base styles + "base/reset", + "base/fonts", + "base/typography", + "base/utilities", + "base/base", + + // WP specific + "wp/wp-logged-in", + + // Modules + "modules/main", + "modules/wrapper", + "modules/alignfull", + "modules/header", + "modules/header__menu", + "modules/header__menu-button", + "modules/sharebar", + "modules/footer", + "modules/editorial" + + // WP Editor colors. Do not move these styles elsewhere + // MUST be placed at the end of the import list. + // "wp/wp-editor-colors" +; + diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/mixins/_breakpoint.scss b/wp-content/themes/docker-wordpress-dev/src/sass/mixins/_breakpoint.scss new file mode 100644 index 0000000..ad677b5 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/mixins/_breakpoint.scss @@ -0,0 +1,27 @@ +/* + * Media query shorthand, to be used with variables from $site-breakpoints + * Defaults to min-width + * + * Usage: @include mq(lg, min/max(optional) ) { ... } + */ + +@function breakpoint-min($name, $breakpoints: $site-breakpoints) { + $min: map-get($breakpoints, $name); + @return max(0, $min); +} + +@mixin mq($name, $type: min) { + $min: breakpoint-min($name); + + @if ($min > 0) { + @if ($type == max) { + $min: $min - 1px; + } + + @media ( #{$type}-width: $min ) { + @content; + } + } @else { + @content; + } +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/mixins/_columns.scss b/wp-content/themes/docker-wordpress-dev/src/sass/mixins/_columns.scss new file mode 100644 index 0000000..20a39ac --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/mixins/_columns.scss @@ -0,0 +1,46 @@ +@use "sass:math"; + +/* + * Generate grid columns + * + */ + +@mixin grid-col-padding($gutter) { + padding-left: $gutter * 0.5; + padding-right: $gutter * 0.5; + /* + * Default columns align left with smallest width + */ + flex: 0 0 auto; +} + +@mixin grid-col-flex($size) { + width: percentage(math.div($size, $column-count)); + max-width: percentage(math.div($size, $column-count)); + flex: 0 0 percentage(math.div($size, $column-count)); +} + +// generate paddings +@each $breakpoint, $gutter in $column-gutter { + @include mq($breakpoint) { + #{$row-class} > * { + @include grid-col-padding($gutter); + } + } +} + +// generate flex styles +@each $breakpoint, $size in $site-breakpoints { + @include mq($breakpoint) { + $index: index($site-breakpoints, $breakpoint $size); + + @for $i from 1 through $column-count { + // ignore first breakpoint class, e.g. .col instead of .col-sm + $className: if($index > 1, #{$column-class}-#{$breakpoint}-#{$i}, #{$column-class}-#{$i}); + + #{$className} { + @include grid-col-flex($i); + } + } + } +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/mixins/_rows.scss b/wp-content/themes/docker-wordpress-dev/src/sass/mixins/_rows.scss new file mode 100644 index 0000000..78d12bb --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/mixins/_rows.scss @@ -0,0 +1,27 @@ +/* + * Generate grid rows + * + * $row-class defines the row classname. E.G. .row + * $column-gutter sets the negative margins for each defined breakpoint. + * + */ + +@mixin row-gutters($gutter) { + margin-left: ($gutter * -0.5); + margin-right: ($gutter * -0.5); +} + +@mixin row() { + display: flex; + flex-wrap: wrap; + + @each $breakpoint, $gutter in $column-gutter { + @include mq($breakpoint) { + @include row-gutters($gutter); + } + } +} + +#{$row-class} { + @include row(); +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/modules/_alignfull.scss b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_alignfull.scss new file mode 100644 index 0000000..8362796 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_alignfull.scss @@ -0,0 +1,6 @@ +.alignfull { + width: auto; + margin-left: calc(-50vw + 50%); + margin-right: calc(-50vw + 50%); +} + diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/modules/_editorial.scss b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_editorial.scss new file mode 100644 index 0000000..9ba9e07 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_editorial.scss @@ -0,0 +1,13 @@ +/** + * Editorial + */ + +.editorial { + > :first-child { + margin-top: 0; + } + + > :last-child { + margin-bottom: 0; + } +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/modules/_footer.scss b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_footer.scss new file mode 100644 index 0000000..9c5fe5b --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_footer.scss @@ -0,0 +1,6 @@ +/** + * Footer + */ + +.footer { +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/modules/_header.scss b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_header.scss new file mode 100644 index 0000000..fb50f61 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_header.scss @@ -0,0 +1,47 @@ +/** + * Header + */ + +.header { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 1000; + background: $white; + + .wrapper, + &__bar { + @each $breakpoint, $height in $header-heights { + @include mq($breakpoint) { + height: $height; + } + } + } + + .wrapper, + &__bar { + display: flex; + align-items: center; + justify-content: space-between; + } + + &__logo { + display: flex; + align-items: center; + height: 100%; + + svg { + max-height: 100%; + } + } + + @include mq(lg, "max") { + // Places the header bar above the opened hamburger menu + &__bar { + width: 100%; + position: relative; + z-index: 10; + } + } +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/modules/_header__menu-button.scss b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_header__menu-button.scss new file mode 100644 index 0000000..122088b --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_header__menu-button.scss @@ -0,0 +1,93 @@ +@use "sass:math"; + +/** + * Header Menu button config + */ + +$menuBtnSize: 60px; +$menuBtnLineWidth: 28px; +$menuBtnLineThickness: 3px; +$menuBtnLinesSpacing: 6px; +$menuBtnAnimationDuration: 250ms; + +/** + * Menu button styles + */ + +.header__menu-button { + //color: $indigo; + + position: relative; + width: $menuBtnSize; + height: $menuBtnSize; + vertical-align: middle; + margin-left: 25px; + margin-right: math.div(-($menuBtnSize - $menuBtnLineWidth), 2); + background: transparent; + cursor: pointer; + outline: 0; + + &-lines { + margin: ceil(math.div(-$menuBtnLineThickness, 2)) auto 0; + top: 50%; + left: 0; + right: 0; + transition: background $menuBtnAnimationDuration; + + // Transform to X + .menu-open & { + background: transparent; + + &:before { + top: 0; + left: 0; + right: 0; + transform: rotate(45deg); + transition: top $menuBtnAnimationDuration ease 0s, + transform $menuBtnAnimationDuration ease $menuBtnAnimationDuration; + } + + &:after { + bottom: 0; + left: 0; + right: 0; + transform: rotate(-45deg); + transition: bottom $menuBtnAnimationDuration ease 0s, + transform $menuBtnAnimationDuration ease $menuBtnAnimationDuration; + } + } + } + + &-lines, + &-lines:before, + &-lines:after { + background: currentColor; + width: $menuBtnLineWidth; + height: $menuBtnLineThickness; + position: absolute; + } + + &-lines:before, + &-lines:after { + content: ""; + left: 0; + right: 0; + width: auto; + } + + &-lines:before { + top: -1 * ($menuBtnLineThickness + $menuBtnLinesSpacing); + transition: top $menuBtnAnimationDuration ease $menuBtnAnimationDuration, + transform $menuBtnAnimationDuration ease 0s; + } + + &-lines:after { + bottom: -1 * ($menuBtnLineThickness + $menuBtnLinesSpacing); + transition: bottom $menuBtnAnimationDuration ease $menuBtnAnimationDuration, + transform $menuBtnAnimationDuration ease 0s; + } + + @include mq(lg) { + display: none; + } +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/modules/_header__menu.scss b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_header__menu.scss new file mode 100644 index 0000000..617ef41 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_header__menu.scss @@ -0,0 +1,33 @@ +/** + * Header Menu + */ + +.header__menu { + @include mq(lg, "max") { + position: fixed; + top: map-get($map: $header-heights, $key: "sm"); + right: 0; + bottom: 0; + left: 0; + z-index: 0; + + background: $white; + + transform: translateY(-100%); + opacity: 0; + transition: all 250ms; + + .menu-open & { + transform: translateY(0); + opacity: 1; + z-index: 1; + } + } + + @include mq(lg) { + &-list { + display: flex; + align-items: center; + } + } +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/modules/_main.scss b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_main.scss new file mode 100644 index 0000000..4a77f19 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_main.scss @@ -0,0 +1,12 @@ +/** + *
element + * Pushes content below the fixed header + */ + +main { + @each $breakpoint, $height in $header-heights { + @include mq($breakpoint) { + margin-top: $height; + } + } +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/modules/_sharebar.scss b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_sharebar.scss new file mode 100644 index 0000000..557ccdb --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_sharebar.scss @@ -0,0 +1,9 @@ +/** + * Sharebar + */ + +.sharebar { + &__list { + display: flex; + } +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/modules/_wrapper.scss b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_wrapper.scss new file mode 100644 index 0000000..b8c5abd --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/modules/_wrapper.scss @@ -0,0 +1,18 @@ +/** + * Site wrapper + */ + +.wrapper { + position: relative; + margin-left: auto; + margin-right: auto; + width: 100%; + max-width: $wrapper-max-width; + + @each $name, $size in $wrapper-gutter { + @include mq($name) { + padding-left: $size; + padding-right: $size; + } + } +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/variables/_colors.scss b/wp-content/themes/docker-wordpress-dev/src/sass/variables/_colors.scss new file mode 100644 index 0000000..e97091f --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/variables/_colors.scss @@ -0,0 +1,8 @@ +/** + * Colors + * + * Add HEX colors variants for use with rgba(color, opacity) syntax + */ + +$white: var(--wp--preset--color--white); +$black: var(--wp--preset--color--black); diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/variables/_layout.scss b/wp-content/themes/docker-wordpress-dev/src/sass/variables/_layout.scss new file mode 100644 index 0000000..ba80342 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/variables/_layout.scss @@ -0,0 +1,41 @@ +// Breakpoints + +$site-breakpoints: ( + sm: 0px, + md: 768px, + lg: 1024px, + xl: 1440px, +); + +// Columns and Rows + +$row-class: ".row"; +$column-class: ".col"; +$column-count: 12; + +$column-gutter: ( + sm: 12px, + md: 16px, + lg: 32px, + xl: 32px, +); + +// .wrapper container + +$wrapper-max-width: 1440px; + +$wrapper-gutter: ( + sm: 24px, + md: 32px, + lg: 48px, + xl: 106px, +); + +// Header heights + +$header-heights: ( + sm: 60px, + md: 80px, + lg: 80px, + xl: 80px, +); diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/wp/_wp-editor-colors.scss b/wp-content/themes/docker-wordpress-dev/src/sass/wp/_wp-editor-colors.scss new file mode 100644 index 0000000..d3b4635 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/wp/_wp-editor-colors.scss @@ -0,0 +1,24 @@ +/** + * Color map for Gutenberg styles + * Matches functions.php color definitions + * + * These are different from colors.scss + * and MUST be placed at the end of the scss imports list. + */ + +$colorPalette: ( + white: $white, + black: $black, +); + +@each $name, $color in $colorPalette { + .has-#{$name}-color, + /* This overrides Gutenberg color:inherit styles */ + .has-#{$name}-color.wp-block-button__link { + color: $color; + } + + .has-#{$name}-background-color { + background-color: $color; + } +} diff --git a/wp-content/themes/docker-wordpress-dev/src/sass/wp/_wp-logged-in.scss b/wp-content/themes/docker-wordpress-dev/src/sass/wp/_wp-logged-in.scss new file mode 100644 index 0000000..baf3e62 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/src/sass/wp/_wp-logged-in.scss @@ -0,0 +1,24 @@ +/** + * Wordpress logged in state + * Normalizes the Admin Bar and pushes the header & menu down + */ + +#wpadminbar { + position: fixed; +} + +.logged-in { + .header { + top: 46px; + + &__menu { + top: 46px + map-get($map: $header-heights, $key: "sm"); + } + } + + @media (min-width: 783px) { + .header { + top: 32px; + } + } +} diff --git a/wp-content/themes/docker-wordpress-dev/style.css b/wp-content/themes/docker-wordpress-dev/style.css new file mode 100644 index 0000000..d0f9123 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/style.css @@ -0,0 +1,7 @@ +/* +Theme Name: docker-wordpress-dev - v0.0.0 +Description: Docker-based local development environment for WordPress projects +Version: 0.0.0 +Author: Ideas On Purpose +Author URI: https://www.ideasonpurpose.com/ +*/ diff --git a/wp-content/themes/docker-wordpress-dev/template-parts/archive.php b/wp-content/themes/docker-wordpress-dev/template-parts/archive.php new file mode 100644 index 0000000..55a568d --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/template-parts/archive.php @@ -0,0 +1,20 @@ + + +
+
+

+
+ +
+
+ +
+ + +
+
+ + diff --git a/wp-content/themes/docker-wordpress-dev/template-parts/components/card.php b/wp-content/themes/docker-wordpress-dev/template-parts/components/card.php new file mode 100644 index 0000000..303bb4d --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/template-parts/components/card.php @@ -0,0 +1,41 @@ +{$term->name}"; +}, $categories); + +?> + + + + + + diff --git a/wp-content/themes/docker-wordpress-dev/template-parts/components/cookie-notice.php b/wp-content/themes/docker-wordpress-dev/template-parts/components/cookie-notice.php new file mode 100644 index 0000000..59088ae --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/template-parts/components/cookie-notice.php @@ -0,0 +1,30 @@ + + This site uses cookies for analytics. By continuing to browse this site, you agree + to this use. Read our Privacy Policy to learn more. +

+EOF; +$default_button_text = 'I Agree'; + +$cookie_button = get_field('cookie_accept_button', 'options') ?: $default_button_text; +$cookie_text = get_field('cookie_notice', 'options') ?: $default_cookie_text; +?> + + + + + + diff --git a/wp-content/themes/docker-wordpress-dev/template-parts/components/pagination.php b/wp-content/themes/docker-wordpress-dev/template-parts/components/pagination.php new file mode 100644 index 0000000..c340323 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/template-parts/components/pagination.php @@ -0,0 +1,105 @@ +max_num_pages; + +if ($page_count <= 1) { + return; +} +/** + * HTML Snippets + */ +$fillerSnippet = '...'; +$edgeSnippet = ''. $SVG->arrowRight .''; +$edgeSnippetDisabled = ''. $SVG->arrowLeft .''; + +$allLinks = paginate_links([ + 'type' => 'array', + 'show_all' => true, + 'prev_next' => false, + 'prev_text' => 'Prev', + 'next_text' => 'Next' +]); + +/** + * $showLinks is mostly here for possible future re-use, this motif doesn't work with less than 7 visible items + */ +$showLinks = 7; + +/** + * $isEvenOffset shifts even-numbered center values towards the left + */ +$isEvenOffset = intval(!($showLinks & 1)); +$displayMid = $showLinks / 2; + +/** + * Calculate how many slices to show in the center. If $current is close to the edges, include the edge (-2), + * otherwise, omit both edges (-4) + */ +$sliceCount = + $current > $displayMid && $current < $page_count - floor($displayMid) - 1 ? $showLinks - 4 : $showLinks - 2; + +$sliceCount = count($allLinks) <= $showLinks ? count($allLinks) : $sliceCount; + +/** + * Calculate $start based on distance from middle and proximity to edges + */ +if ($current < $displayMid) { + $start = 0; +} elseif ($current > $page_count - $displayMid - 1) { + $start = $page_count - $sliceCount; +} else { + $start = $current - floor($sliceCount / 2) + $isEvenOffset; +} + +$centerLinks = array_slice($allLinks, $start, $sliceCount); + +$first = []; +$last = []; + +/** + * Assemble first/last links including $fillerSnippet if count($allLinks) < $showLinks + */ +if (count($allLinks) > $showLinks) { + if (count($centerLinks) < $showLinks - 2 || $current > $page_count / 2) { + $first = array_slice($allLinks, 0, 1); + $first[] = $fillerSnippet; + } + if (count($centerLinks) < $showLinks - 2 || $current < $page_count / 2) { + $last = array_slice($allLinks, -1); + array_unshift($last, $fillerSnippet); + } +} +/** + * Active/Inactive Previous/Next arrows, these are expected to be Arrays + */ +$prev = + $current + 1 > 1 + ? sprintf($edgeSnippet, 'pagination__first', get_pagenum_link($current - 1 + 1)) + : sprintf($edgeSnippetDisabled, 'pagination__first'); + +$next = + $current + 1 < $page_count + ? sprintf($edgeSnippet, 'pagination__last', get_pagenum_link($current + 1 + 1), '') + : sprintf($edgeSnippetDisabled, 'pagination__last'); + +$prev = [$prev]; +$next = [$next]; + +/** + * Finally, merge all the pieces into a single array to be imploded into the HTML + */ +$display = array_merge($prev, $first, $centerLinks, $last, $next); +?> + + + + + + diff --git a/wp-content/themes/docker-wordpress-dev/template-parts/components/sharebar.php b/wp-content/themes/docker-wordpress-dev/template-parts/components/sharebar.php new file mode 100644 index 0000000..4f71019 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/template-parts/components/sharebar.php @@ -0,0 +1,32 @@ + + + + + diff --git a/wp-content/themes/docker-wordpress-dev/template-parts/favicon.php b/wp-content/themes/docker-wordpress-dev/template-parts/favicon.php new file mode 100644 index 0000000..9ec7929 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/template-parts/favicon.php @@ -0,0 +1,12 @@ + + +/dist/favicon/` + */ +?> + + + diff --git a/wp-content/themes/docker-wordpress-dev/template-parts/footer.php b/wp-content/themes/docker-wordpress-dev/template-parts/footer.php new file mode 100644 index 0000000..501c36b --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/template-parts/footer.php @@ -0,0 +1,67 @@ + $menu_id, + 'menu_class' => "{$menu_key}__menu", + 'items_wrap' => '' . "\n", + 'container' => '', + 'echo' => false, + ]); + } +} + +$copyright = get_field('copyright', 'options'); +if (is_null($copyright) || empty($copyright)) { + $copyright = + '%YEAR% ' . get_bloginfo('name') . ' | ' . get_bloginfo('tagline');')'; +} +$copyright = str_replace('%YEAR%', date('Y'), $copyright); + + +?> + + + +
+
+
+
+

Footer

+ + +
+
+
+ + +
+ + + + + + + diff --git a/wp-content/themes/docker-wordpress-dev/template-parts/header.php b/wp-content/themes/docker-wordpress-dev/template-parts/header.php new file mode 100644 index 0000000..cae7b5b --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/template-parts/header.php @@ -0,0 +1,52 @@ + $menu_id, + 'menu_class' => "{$menu_key}__menu", + 'items_wrap' => '' . "\n", + 'container' => '', + 'echo' => false, + ]); + } +} +?> + + + +
+ +
+ + diff --git a/wp-content/themes/docker-wordpress-dev/template-parts/page.php b/wp-content/themes/docker-wordpress-dev/template-parts/page.php new file mode 100644 index 0000000..a645359 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/template-parts/page.php @@ -0,0 +1,17 @@ + + +
+
+ +
+

+
+ +
+ +
+ +
+
+ + diff --git a/wp-content/themes/docker-wordpress-dev/template-parts/single.php b/wp-content/themes/docker-wordpress-dev/template-parts/single.php new file mode 100644 index 0000000..855564c --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/template-parts/single.php @@ -0,0 +1,20 @@ + + +
+
+ +
+ +

+ + +
+ +
+ +
+ +
+
+ + diff --git a/wp-content/themes/docker-wordpress-dev/theme.json b/wp-content/themes/docker-wordpress-dev/theme.json new file mode 100644 index 0000000..3c44113 --- /dev/null +++ b/wp-content/themes/docker-wordpress-dev/theme.json @@ -0,0 +1,47 @@ +{ + "version": 1, + "settings": { + "color": { + "link": false, + "palette": [ + { "name": "White", "slug": "white", "color": "#fff" }, + { "name": "Black", "slug": "black", "color": "#000" } + ], + "gradients": [ + { + "name": "Blue-Navy", + "gradient": "linear-gradient(0deg, #00f 15%, #004 85%)", + "slug": "blue-navy-gradient" + } + ], + "custom": true, + "customGradient": true + }, + "typography": { + "dropCap": false, + "customFontSize": false + }, + "blocks": { + "core/button": { + "border": { + "customRadius": false, + "customColor": false + } + }, + "core/paragraph": { + "typography": { + "fontSizes": [] + } + } + } + }, + "styles": { + "blocks": { + "core/button": { + "border": { + "radius": "0px" + } + } + } + } +}