From fd25f13a4f95d01f6e150e3219de9c8895d3e306 Mon Sep 17 00:00:00 2001 From: Thuan Bui Date: Tue, 26 Jun 2018 11:09:22 +0700 Subject: [PATCH] Initial --- .csscomb.json | 24 + .editorconfig | 25 + .gitignore | 15 + .jsbeautifyrc | 23 + .jshintrc | 27 + .stylelintignore | 6 + .stylelintscssrc.js | 318 + .vscode/settings.json | 8 + CHANGELOG.md | 190 + Gulpfile.js | 72 + LICENSE.md | 264 + README.md | 190 + assets/fonts/.gitkeep | 0 assets/images/center-content.gif | Bin 0 -> 580 bytes assets/images/favicon.png | Bin 0 -> 3499 bytes assets/images/hero.jpg | Bin 0 -> 332898 bytes assets/images/transparency-grid.png | Bin 0 -> 1545 bytes assets/js/script.js | 87 + assets/scss/common-classes/_avatar.scss | 21 + assets/scss/common-classes/_genesis.scss | 56 + assets/scss/common-classes/_search-form.scss | 21 + assets/scss/common-classes/_titles.scss | 35 + .../common-classes/_wordpress-editor.scss | 26 + assets/scss/common-classes/_wordpress.scss | 68 + assets/scss/common-classes/index.scss | 9 + assets/scss/content-area/_entry-comments.scss | 75 + assets/scss/content-area/_entry-content.scss | 83 + assets/scss/content-area/_entry-meta.scss | 29 + assets/scss/content-area/_pagination.scss | 41 + assets/scss/content-area/index.scss | 7 + assets/scss/defaults/_forms.scss | 76 + assets/scss/defaults/_gallery.scss | 70 + assets/scss/defaults/_headings.scss | 47 + assets/scss/defaults/_objects.scss | 20 + assets/scss/defaults/_screen-reader-text.scss | 30 + assets/scss/defaults/_tables.scss | 35 + .../defaults/_typographical-elements.scss | 107 + assets/scss/defaults/index.scss | 10 + .../scss/footer-widgets/_footer-widgets.scss | 33 + assets/scss/footer-widgets/index.scss | 4 + assets/scss/front-page/_front-page-1.scss | 54 + assets/scss/front-page/_front-page-2.scss | 6 + assets/scss/front-page/_front-page-3.scss | 7 + assets/scss/front-page/_front-page-4.scss | 6 + assets/scss/front-page/_front-page-5.scss | 6 + assets/scss/front-page/_index.scss | 9 + .../scss/html5-reset/_baseline-normalize.scss | 173 + assets/scss/html5-reset/_box-sizing.scss | 12 + assets/scss/html5-reset/_float-clearing.scss | 39 + assets/scss/html5-reset/index.scss | 6 + .../scss/plugins/_genesis-enews-extended.scss | 41 + assets/scss/plugins/_genesis-simple-faq.scss | 66 + assets/scss/plugins/_google-map.scss | 12 + assets/scss/plugins/_jetpack.scss | 7 + assets/scss/plugins/index.scss | 7 + assets/scss/print-styles/_print-styles.scss | 141 + assets/scss/print-styles/index.scss | 1 + assets/scss/sidebar/_sidebar.scss | 16 + assets/scss/sidebar/index.scss | 4 + assets/scss/site-footer/_site-footer.scss | 15 + assets/scss/site-footer/index.scss | 4 + assets/scss/site-header/_hero-section.scss | 43 + assets/scss/site-header/_site-header.scss | 25 + assets/scss/site-header/_title-area.scss | 43 + assets/scss/site-header/index.scss | 6 + assets/scss/site-navigation/_nav-primary.scss | 15 + .../scss/site-navigation/_nav-secondary.scss | 7 + .../site-navigation/_responsive-menu.scss | 178 + .../site-navigation/_site-navigation.scss | 142 + assets/scss/site-navigation/index.scss | 7 + assets/scss/skip-links/_skip-links.scss | 21 + assets/scss/skip-links/index.scss | 4 + .../structure-and-layout/_column-classes.scss | 77 + .../structure-and-layout/_site-container.scss | 78 + .../structure-and-layout/_site-inner.scss | 18 + assets/scss/structure-and-layout/index.scss | 6 + assets/scss/style.scss | 62 + assets/scss/utilities/_mixins.scss | 90 + assets/scss/utilities/_variables.scss | 171 + assets/scss/utilities/index.scss | 2 + assets/scss/widgets/_featured-content.scss | 26 + assets/scss/widgets/_widgets.scss | 44 + assets/scss/widgets/index.scss | 5 + assets/scss/woocommerce/_account-page.scss | 83 + assets/scss/woocommerce/_breadcrumb.scss | 22 + assets/scss/woocommerce/_cart-page.scss | 77 + assets/scss/woocommerce/_checkout.scss | 22 + .../scss/woocommerce/_disabled-buttons.scss | 33 + assets/scss/woocommerce/_forms.scss | 127 + assets/scss/woocommerce/_globals.scss | 48 + assets/scss/woocommerce/_misc.scss | 29 + assets/scss/woocommerce/_payment.scss | 22 + assets/scss/woocommerce/_product-gallery.scss | 24 + assets/scss/woocommerce/_product-tabs.scss | 99 + assets/scss/woocommerce/_product.scss | 40 + assets/scss/woocommerce/_reviews.scss | 27 + assets/scss/woocommerce/_shop-page.scss | 84 + assets/scss/woocommerce/_widgets.scss | 116 + assets/scss/woocommerce/index.scss | 19 + composer.json | 49 + config/config.php | 689 ++ customizer.dat | 1 + functions.php | 28 + lib/.gitattributes | 8 + lib/LICENSE.md | 264 + lib/README.md | 177 + lib/admin/customizer-output.php | 82 + lib/admin/customizer-settings.php | 142 + lib/autoload.php | 194 + lib/classes/class-rgba-customizer-control.php | 141 + lib/classes/class-tgm-plugin-activation.php | 3853 ++++++++ lib/composer.json | 38 + lib/css/customizer.css | 128 + lib/css/load-styles.php | 51 + lib/functions/attributes.php | 174 + lib/functions/defaults.php | 56 + lib/functions/demo.php | 82 + lib/functions/general.php | 73 + lib/functions/hero.php | 254 + lib/functions/layout.php | 142 + lib/functions/markup.php | 105 + lib/functions/plugins.php | 255 + lib/functions/setup.php | 123 + lib/functions/templates.php | 117 + lib/functions/upgrade.php | 53 + lib/functions/utilities.php | 253 + lib/init.php | 63 + lib/js/customizer.js | 311 + lib/js/load-scripts.php | 91 + lib/js/menu.js | 452 + lib/languages/child-theme-library.pot | 86 + lib/shortcodes/footer.php | 52 + lib/structure/footer.php | 36 + lib/structure/header.php | 36 + lib/structure/menu.php | 39 + lib/views/page-blog.php | 31 + lib/views/page-boxed.php | 43 + lib/views/page-contact.php | 63 + lib/views/page-full.php | 41 + lib/views/page-landing.php | 64 + lib/views/page-sitemap.php | 49 + lib/widgets/widget-areas.php | 188 + lib/widgets/widgets.php | 55 + package.json | 30 + phpcs.xml.dist | 44 + sample.xml | 3224 +++++++ screenshot.png | Bin 0 -> 267490 bytes setup.sh | 230 + style.css | 2212 +++++ style.css.map | 1 + stylelint.config.js | 330 + widgets.wie | 1 + woocommerce.css | 794 ++ yarn.lock | 7996 +++++++++++++++++ 154 files changed, 28820 insertions(+) create mode 100644 .csscomb.json create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .jsbeautifyrc create mode 100644 .jshintrc create mode 100644 .stylelintignore create mode 100755 .stylelintscssrc.js create mode 100644 .vscode/settings.json create mode 100644 CHANGELOG.md create mode 100755 Gulpfile.js create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 assets/fonts/.gitkeep create mode 100644 assets/images/center-content.gif create mode 100644 assets/images/favicon.png create mode 100644 assets/images/hero.jpg create mode 100644 assets/images/transparency-grid.png create mode 100644 assets/js/script.js create mode 100644 assets/scss/common-classes/_avatar.scss create mode 100644 assets/scss/common-classes/_genesis.scss create mode 100644 assets/scss/common-classes/_search-form.scss create mode 100644 assets/scss/common-classes/_titles.scss create mode 100644 assets/scss/common-classes/_wordpress-editor.scss create mode 100644 assets/scss/common-classes/_wordpress.scss create mode 100644 assets/scss/common-classes/index.scss create mode 100644 assets/scss/content-area/_entry-comments.scss create mode 100644 assets/scss/content-area/_entry-content.scss create mode 100644 assets/scss/content-area/_entry-meta.scss create mode 100644 assets/scss/content-area/_pagination.scss create mode 100644 assets/scss/content-area/index.scss create mode 100644 assets/scss/defaults/_forms.scss create mode 100644 assets/scss/defaults/_gallery.scss create mode 100644 assets/scss/defaults/_headings.scss create mode 100644 assets/scss/defaults/_objects.scss create mode 100644 assets/scss/defaults/_screen-reader-text.scss create mode 100644 assets/scss/defaults/_tables.scss create mode 100644 assets/scss/defaults/_typographical-elements.scss create mode 100644 assets/scss/defaults/index.scss create mode 100644 assets/scss/footer-widgets/_footer-widgets.scss create mode 100644 assets/scss/footer-widgets/index.scss create mode 100644 assets/scss/front-page/_front-page-1.scss create mode 100644 assets/scss/front-page/_front-page-2.scss create mode 100644 assets/scss/front-page/_front-page-3.scss create mode 100644 assets/scss/front-page/_front-page-4.scss create mode 100644 assets/scss/front-page/_front-page-5.scss create mode 100644 assets/scss/front-page/_index.scss create mode 100644 assets/scss/html5-reset/_baseline-normalize.scss create mode 100644 assets/scss/html5-reset/_box-sizing.scss create mode 100644 assets/scss/html5-reset/_float-clearing.scss create mode 100644 assets/scss/html5-reset/index.scss create mode 100644 assets/scss/plugins/_genesis-enews-extended.scss create mode 100644 assets/scss/plugins/_genesis-simple-faq.scss create mode 100644 assets/scss/plugins/_google-map.scss create mode 100644 assets/scss/plugins/_jetpack.scss create mode 100644 assets/scss/plugins/index.scss create mode 100644 assets/scss/print-styles/_print-styles.scss create mode 100644 assets/scss/print-styles/index.scss create mode 100644 assets/scss/sidebar/_sidebar.scss create mode 100644 assets/scss/sidebar/index.scss create mode 100644 assets/scss/site-footer/_site-footer.scss create mode 100644 assets/scss/site-footer/index.scss create mode 100644 assets/scss/site-header/_hero-section.scss create mode 100644 assets/scss/site-header/_site-header.scss create mode 100644 assets/scss/site-header/_title-area.scss create mode 100644 assets/scss/site-header/index.scss create mode 100644 assets/scss/site-navigation/_nav-primary.scss create mode 100644 assets/scss/site-navigation/_nav-secondary.scss create mode 100644 assets/scss/site-navigation/_responsive-menu.scss create mode 100644 assets/scss/site-navigation/_site-navigation.scss create mode 100644 assets/scss/site-navigation/index.scss create mode 100644 assets/scss/skip-links/_skip-links.scss create mode 100644 assets/scss/skip-links/index.scss create mode 100644 assets/scss/structure-and-layout/_column-classes.scss create mode 100644 assets/scss/structure-and-layout/_site-container.scss create mode 100644 assets/scss/structure-and-layout/_site-inner.scss create mode 100644 assets/scss/structure-and-layout/index.scss create mode 100644 assets/scss/style.scss create mode 100644 assets/scss/utilities/_mixins.scss create mode 100644 assets/scss/utilities/_variables.scss create mode 100644 assets/scss/utilities/index.scss create mode 100644 assets/scss/widgets/_featured-content.scss create mode 100644 assets/scss/widgets/_widgets.scss create mode 100644 assets/scss/widgets/index.scss create mode 100644 assets/scss/woocommerce/_account-page.scss create mode 100644 assets/scss/woocommerce/_breadcrumb.scss create mode 100644 assets/scss/woocommerce/_cart-page.scss create mode 100644 assets/scss/woocommerce/_checkout.scss create mode 100644 assets/scss/woocommerce/_disabled-buttons.scss create mode 100644 assets/scss/woocommerce/_forms.scss create mode 100644 assets/scss/woocommerce/_globals.scss create mode 100644 assets/scss/woocommerce/_misc.scss create mode 100644 assets/scss/woocommerce/_payment.scss create mode 100644 assets/scss/woocommerce/_product-gallery.scss create mode 100644 assets/scss/woocommerce/_product-tabs.scss create mode 100644 assets/scss/woocommerce/_product.scss create mode 100644 assets/scss/woocommerce/_reviews.scss create mode 100644 assets/scss/woocommerce/_shop-page.scss create mode 100644 assets/scss/woocommerce/_widgets.scss create mode 100644 assets/scss/woocommerce/index.scss create mode 100644 composer.json create mode 100644 config/config.php create mode 100644 customizer.dat create mode 100644 functions.php create mode 100644 lib/.gitattributes create mode 100644 lib/LICENSE.md create mode 100644 lib/README.md create mode 100644 lib/admin/customizer-output.php create mode 100644 lib/admin/customizer-settings.php create mode 100644 lib/autoload.php create mode 100644 lib/classes/class-rgba-customizer-control.php create mode 100644 lib/classes/class-tgm-plugin-activation.php create mode 100644 lib/composer.json create mode 100644 lib/css/customizer.css create mode 100644 lib/css/load-styles.php create mode 100644 lib/functions/attributes.php create mode 100644 lib/functions/defaults.php create mode 100644 lib/functions/demo.php create mode 100644 lib/functions/general.php create mode 100644 lib/functions/hero.php create mode 100644 lib/functions/layout.php create mode 100644 lib/functions/markup.php create mode 100644 lib/functions/plugins.php create mode 100644 lib/functions/setup.php create mode 100644 lib/functions/templates.php create mode 100644 lib/functions/upgrade.php create mode 100644 lib/functions/utilities.php create mode 100644 lib/init.php create mode 100644 lib/js/customizer.js create mode 100644 lib/js/load-scripts.php create mode 100644 lib/js/menu.js create mode 100644 lib/languages/child-theme-library.pot create mode 100644 lib/shortcodes/footer.php create mode 100644 lib/structure/footer.php create mode 100644 lib/structure/header.php create mode 100644 lib/structure/menu.php create mode 100644 lib/views/page-blog.php create mode 100644 lib/views/page-boxed.php create mode 100644 lib/views/page-contact.php create mode 100644 lib/views/page-full.php create mode 100644 lib/views/page-landing.php create mode 100644 lib/views/page-sitemap.php create mode 100644 lib/widgets/widget-areas.php create mode 100644 lib/widgets/widgets.php create mode 100755 package.json create mode 100755 phpcs.xml.dist create mode 100644 sample.xml create mode 100644 screenshot.png create mode 100644 setup.sh create mode 100644 style.css create mode 100644 style.css.map create mode 100755 stylelint.config.js create mode 100644 widgets.wie create mode 100644 woocommerce.css create mode 100644 yarn.lock diff --git a/.csscomb.json b/.csscomb.json new file mode 100644 index 0000000..faf2117 --- /dev/null +++ b/.csscomb.json @@ -0,0 +1,24 @@ +{ + "remove-empty-rulesets": true, + "always-semicolon": true, + "color-case": "lower", + "block-indent": "\t", + "color-shorthand": false, + "element-case": "lower", + "eof-newline": true, + "leading-zero": true, + "quotes": "single", + "space-before-colon": "", + "space-after-colon": " ", + "space-before-combinator": " ", + "space-after-combinator": " ", + "space-between-declarations": "\n", + "space-before-opening-brace": " ", + "space-after-opening-brace": "\n", + "space-after-selector-delimiter": "\n", + "space-before-selector-delimiter": "", + "space-before-closing-brace": "\n", + "strip-spaces": true, + "unitless-zero": true, + "vendor-prefix-align": true +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..626ddc8 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,25 @@ +# This file is for unifying the coding style for different editors and IDEs +# editorconfig.org + +# WordPress Coding Standards +# http://make.wordpress.org/core/handbook/coding-standards/ + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = tab +indent_size = 4 + +[{.*rc,*.json,*.yml}] +indent_style = space +indent_size = 2 + +[*.txt] +end_of_line = crlf + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2895cbf --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Ignore OS generated files. +.DS_Store + +# Ignore node_modules. +node_modules + +# Ignore vendor directory. +vendor + +# Ignore auto-generated lock files. +package-lock.json +composer.lock + +# Ignore editor files. +.idea diff --git a/.jsbeautifyrc b/.jsbeautifyrc new file mode 100644 index 0000000..9f6f9a3 --- /dev/null +++ b/.jsbeautifyrc @@ -0,0 +1,23 @@ +{ + "indent_size": 4, + "indent_char": " ", + "indent_with_tabs": true, + "eol": "\n", + "end_with_newline": true, + "indent_level": 0, + "preserve_newlines": true, + "max_preserve_newlines": 10, + "space_in_paren": true, + "space_in_empty_paren": false, + "jslint_happy": true, + "space_after_anon_function": true, + "brace_style": "collapse", + "unindent_chained_methods": true, + "break_chained_methods": false, + "keep_array_indentation": true, + "unescape_strings": false, + "wrap_line_length": 0, + "e4x": false, + "comma_first": false, + "operator_position": "before-newline" +} \ No newline at end of file diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..901343b --- /dev/null +++ b/.jshintrc @@ -0,0 +1,27 @@ +{ + "boss": true, + "curly": true, + "eqeqeq": true, + "eqnull": true, + "es3": true, + "expr": true, + "immed": true, + "noarg": true, + "nonbsp": true, + "onevar": true, + "quotmark": "single", + "trailing": true, + "undef": true, + "unused": true, + "browser": true, + "globals": { + "_": false, + "Backbone": false, + "jQuery": false, + "JSON": false, + "wp": false, + "export": false, + "module": false, + "require": false + } +} diff --git a/.stylelintignore b/.stylelintignore new file mode 100644 index 0000000..7a02d51 --- /dev/null +++ b/.stylelintignore @@ -0,0 +1,6 @@ +# Ignore vendor directories. +node_modules/* +vendor/* + +# Ignore minified styles. +*.min.css diff --git a/.stylelintscssrc.js b/.stylelintscssrc.js new file mode 100755 index 0000000..269a2f2 --- /dev/null +++ b/.stylelintscssrc.js @@ -0,0 +1,318 @@ +'use strict'; + +module.exports = { + extends: ['stylelint-config-wordpress/scss', 'prettier-stylelint/index.js'], + plugins: 'stylelint-order', + rules: { + 'max-line-length': 255, + 'declaration-block-no-duplicate-properties': [ + true, + { + ignore: ['consecutive-duplicates-with-different-values'] + } + ], + 'order/order': [ + 'at-variables', + 'dollar-variables', + 'custom-properties', + 'declarations' + ], + 'order/properties-order': [ + 'display', + 'visibility', + 'float', + 'clear', + 'overflow', + 'overflow-x', + 'overflow-y', + '-ms-overflow-x', + '-ms-overflow-y', + 'clip', + 'zoom', + 'flex-direction', + 'flex-order', + 'flex-pack', + 'flex-align', + + 'position', + 'z-index', + 'top', + 'right', + 'bottom', + 'left', + + '-webkit-box-sizing', + '-moz-box-sizing', + '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', + 'border', + 'border-width', + 'border-style', + 'border-color', + 'border-top', + 'border-top-width', + 'border-top-style', + 'border-top-color', + 'border-right', + 'border-right-width', + 'border-right-style', + 'border-right-color', + 'border-bottom', + 'border-bottom-width', + 'border-bottom-style', + 'border-bottom-color', + 'border-left', + 'border-left-width', + 'border-left-style', + 'border-left-color', + '-webkit-border-radius', + '-moz-border-radius', + 'border-radius', + '-webkit-border-top-left-radius', + '-moz-border-radius-topleft', + 'border-top-left-radius', + '-webkit-border-top-right-radius', + '-moz-border-radius-topright', + 'border-top-right-radius', + '-webkit-border-bottom-right-radius', + '-moz-border-radius-bottomright', + 'border-bottom-right-radius', + '-webkit-border-bottom-left-radius', + '-moz-border-radius-bottomleft', + 'border-bottom-left-radius', + '-webkit-border-image', + '-moz-border-image', + '-o-border-image', + 'border-image', + '-webkit-border-image-source', + '-moz-border-image-source', + '-o-border-image-source', + 'border-image-source', + '-webkit-border-image-slice', + '-moz-border-image-slice', + '-o-border-image-slice', + 'border-image-slice', + '-webkit-border-image-width', + '-moz-border-image-width', + '-o-border-image-width', + 'border-image-width', + '-webkit-border-image-outset', + '-moz-border-image-outset', + '-o-border-image-outset', + 'border-image-outset', + '-webkit-border-image-repeat', + '-moz-border-image-repeat', + '-o-border-image-repeat', + 'border-image-repeat', + 'table-layout', + 'empty-cells', + 'caption-side', + 'border-spacing', + 'border-collapse', + + 'outline', + 'outline-width', + 'outline-style', + 'outline-color', + 'outline-offset', + 'opacity', + 'filter:progid:DXImageTransform.Microsoft.Alpha(Opacity', + "-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha", + '-ms-interpolation-mode', + 'color', + 'background', + 'filter:progid:DXImageTransform.Microsoft.AlphaImageLoader', + 'background-color', + 'background-image', + 'background-repeat', + 'background-attachment', + 'background-position', + 'background-position-x', + '-ms-background-position-x', + 'background-position-y', + '-ms-background-position-y', + '-webkit-background-clip', + '-moz-background-clip', + 'background-clip', + 'background-origin', + '-webkit-background-size', + '-moz-background-size', + '-o-background-size', + 'background-size', + 'box-decoration-break', + '-webkit-box-shadow', + '-moz-box-shadow', + 'box-shadow', + 'filter:progid:DXImageTransform.Microsoft.gradient', + "-ms-filter:\\'progid:DXImageTransform.Microsoft.gradient", + 'text-shadow', + 'font', + 'font-family', + 'src', + 'font-size', + 'font-weight', + 'font-style', + 'font-variant', + 'font-size-adjust', + 'font-stretch', + 'font-effect', + 'font-emphasize', + 'font-emphasize-position', + 'font-emphasize-style', + '-webkit-font-smoothing', + '-moz-osx-font-smoothing', + 'font-smooth', + 'line-height', + 'text-align', + '-webkit-text-align-last', + '-moz-text-align-last', + '-ms-text-align-last', + 'text-align-last', + 'vertical-align', + 'white-space', + 'text-decoration', + 'text-emphasis', + 'text-emphasis-color', + 'text-emphasis-style', + 'text-emphasis-position', + 'text-indent', + '-ms-text-justify', + 'text-justify', + 'letter-spacing', + 'word-spacing', + '-ms-writing-mode', + 'text-outline', + 'text-transform', + 'text-wrap', + 'text-overflow', + '-ms-text-overflow', + 'text-overflow-ellipsis', + 'text-overflow-mode', + '-ms-word-wrap', + 'word-wrap', + 'word-break', + '-ms-word-break', + '-moz-tab-size', + '-o-tab-size', + 'tab-size', + '-webkit-hyphens', + '-moz-hyphens', + 'hyphens', + + 'list-style', + 'list-style-position', + 'list-style-type', + 'list-style-image', + 'content', + 'quotes', + 'counter-reset', + 'counter-increment', + 'resize', + 'cursor', + '-webkit-user-select', + '-moz-user-select', + '-ms-user-select', + 'user-select', + 'nav-index', + 'nav-up', + 'nav-right', + 'nav-down', + 'nav-left', + '-webkit-transition', + '-moz-transition', + '-ms-transition', + '-o-transition', + 'transition', + '-webkit-transition-delay', + '-moz-transition-delay', + '-ms-transition-delay', + '-o-transition-delay', + 'transition-delay', + '-webkit-transition-timing-function', + '-moz-transition-timing-function', + '-ms-transition-timing-function', + '-o-transition-timing-function', + 'transition-timing-function', + '-webkit-transition-duration', + '-moz-transition-duration', + '-ms-transition-duration', + '-o-transition-duration', + 'transition-duration', + '-webkit-transition-property', + '-moz-transition-property', + '-ms-transition-property', + '-o-transition-property', + 'transition-property', + '-webkit-transform', + '-moz-transform', + '-ms-transform', + '-o-transform', + 'transform', + '-webkit-transform-origin', + '-moz-transform-origin', + '-ms-transform-origin', + '-o-transform-origin', + 'transform-origin', + '-webkit-animation', + '-moz-animation', + '-ms-animation', + '-o-animation', + 'animation', + '-webkit-animation-name', + '-moz-animation-name', + '-ms-animation-name', + '-o-animation-name', + 'animation-name', + '-webkit-animation-duration', + '-moz-animation-duration', + '-ms-animation-duration', + '-o-animation-duration', + 'animation-duration', + '-webkit-animation-play-state', + '-moz-animation-play-state', + '-ms-animation-play-state', + '-o-animation-play-state', + 'animation-play-state', + '-webkit-animation-timing-function', + '-moz-animation-timing-function', + '-ms-animation-timing-function', + '-o-animation-timing-function', + 'animation-timing-function', + '-webkit-animation-delay', + '-moz-animation-delay', + '-ms-animation-delay', + '-o-animation-delay', + 'animation-delay', + '-webkit-animation-iteration-count', + '-moz-animation-iteration-count', + '-ms-animation-iteration-count', + '-o-animation-iteration-count', + 'animation-iteration-count', + '-webkit-animation-direction', + '-moz-animation-direction', + '-ms-animation-direction', + '-o-animation-direction', + 'animation-direction', + '-webkit-backface-visibility', + '-moz-backface-visibility', + 'backface-visibility', + 'text-rendering', + 'pointer-events' + ] + } +}; diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3117d23 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{"files.exclude": { + "**/.git": false, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true + } +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d452d40 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,190 @@ +# Genesis Starter Theme Changelog + +## [3.0.0-beta] - 2018-06-01 +* Switch to Child Theme Library +* Switch to Gulp WP Toolkit + +## [2.2.7] - 2018-02-09 +* Add and run PostCSS auto focus gulp function +* Add support for search and 404 page settings +* Move widget area functions to own file +* Update README.md for postcss-focus gulp function +* Fix home page hero height at bigger breakpoints +* Fix date typo in changelog +* Fix Task 'i18n' is not in your gulpfile + +## [2.2.6] - 2018-02-01 +* Add basic support and styling for Gutenberg +* Add support for WooCommerce gallery features +* Add asset concatenation gulp task/combine front-end JS into single file +* Add Blank Page page template +* Add sourcemaps for WooCommerce styles +* Add Customizer data and jsbeautify config +* Fix hero-section removal in all page templates +* Fix hero-section CSS being output when no header image is set +* Fix strings in functions for gulp rename issue +* Fix hero-section height when nav-secondary is active +* Remove theme support for title-tag to fix SEO settings conflict +* Remove Gravity Forms CSS override + +## [2.2.5] - 2017-01-12 +* Add secondary color to Customizer +* Change default HTTP connection method for BrowserSync + +## [2.2.4] - 2017-12-28 +* Fix incorrect schema when title moved outside of entry + +## [2.2.3] - 2017-10-08 +* Add support for fixed header +* Add gulp rename task +* Add gulp bump task +* Update gulp build task +* Remove aws.json file from gulp publish task + +## [2.2.2] - 2017-09-30 +* Add support for fixed header +* Add theme.js file +* Add LICENSE.md file +* Update README.md +* Remove /inludes/header.php - moved to /includes/helpers.php and /functions.php +* Remove editor styles + +## [2.2.1] - 2017-09-11 +* Add structural wrap hooks function +* Improve styling for accessibility +* Update front page template + +## [2.2.0] - 2017-09-10 +* Add hero-section section +* Add custom 404 template +* Avoid hijacking the genesis flow on front page template +* Add custom header callback +* Add function to prevent updates +* Add editor style CSS +* Add column class variable to utilities.scss +* Update standards and restructure helper functions +* Remove gravity forms json file +* Fix responsive menu margin + +## [2.1.0] - 2017-07-18 +* Add RGBA customizer color settings +* Add custom page layout +* Add support for default structural wraps (removed custom) +* Improve support for Simple Social Icons +* Separate WooCommerce CSS from style.css +* Bring responsive menu script current with Genesis Sample +* Enable shortcodes in widgets by default +* Rename navigation menus to defaults +* Remove front page and footer customizer settings +* Remove complex functions from front-page.php +* Remove menus.php and sidebars.php +* Remove 'all' (*) selectors from stylesheet +* Remove postMessage customizer support (in favor of RGBA) +* Remove Cleaner Gallery from recommended plugins + + +## [2.0.1] - 2017-06-14 +* Add custom nav menu function +* Add customize partial refresh support for site title and tagline +* Add `role="navigation"` to all menus +* Add `includes/menus.php` to organize menu related functions +* Menus, site title and tagline now have edit icons in customizer +* Combine Superfish with theme menu script to reduce requests +* Remove hoverIntent script +* Clean up gulp file +* Make front-page-1 full-screen with fix to prevent mobile jump + +## [2.0.0] - 2017-06-13 +* Add compatibility for WordPress 4.8 & Genesis 2.6 +* Add support for new media widgets +* Add support for Superfish accessible menus +* Add CSS only menu and sub-menu toggle buttons +* Add Gravity Forms reset styles +* Add support for footer navigation menu +* Add support for no JavaScript menus +* Add Simple Social Icons CSS to theme and remove plugin CSS output for easy overwriting and to remove !important styles +* Add .gitignore for node modules, xml & wie files +* Add better support for WP Featherlight jQuery lightbox +* Switch everything to flexbox based CSS/SCSS where possible +* Switch to Genesis Sample style design for consistency +* Switch to Genesis Sample menu script for combining menus on mobile +* Upgrade all customizer settings to use postMessage +* Update to normalize.css v7.0.0 and combine selectors +* Rename `templates/` to `views/` for better organization (so it can contain more than templates) +* Move front-page.php to `views/` subfolder +* Move .pot file out of subfolder until translations are submitted +* Replace superfish args for nicer drop-down menus +* Replace all px with rem or em +* Remove Cleaner Gallery script and add theme support for plugin instead +* Remove 'Flexible Widget' functions, using flexbox CSS instead +* Reduce style.css from ~40kb to ~25kb, even with plugin styles + +## [1.6.0] - 2017-06-02 +* NEW: Add front-page, landing-page and page-builder templates +* NEW: Added front-page widgets and footer widgets customizer settings +* NEW: Added front-page customizer settings +* NEW: Added accessible 'read more' links with descriptive text +* Added 'dynamic widgets' functionality +* Added some helper functions +* Improved gulp configuration +* Move theme functionality back to functions.php +* Rename `lib/` to `includes/` +* Remove 'Hero' section on inner pages - use plugin instead +* Remove Kirki customizer support +* Remove Easy Widget Columns support +* Remove WP Page Widget support +* Remove WooCommerce support +* Remove optimizations class + +## [1.5.0] - 2017-04-02 +* Add video background feature +* Add WooCommerce support +* Add customizer colors +* Add customizer fonts +* Add sticky header customizer option +* Add one-click demo import +* Add new page templates +* Add 'i18n' gulp task +* Add back to top scroll button +* Add cleaner-gallery +* Add cleaner-body classes +* Add jquery cdn with local fallback +* Add support for Genesis Testimonials plugin +* Add support for Easy Widget Columns plugin +* Add custom logo schema microdata +* Update clean-up functions +* Update hero-section class +* Update gulp (postcss, cssnano & mqpacker) +* Update Sass, split-up partials +* Update assets, moved to /assets/ direcrory +* Update list of recommended plugins +* Remove front-page.php (now uses widgetized template) +* Remove front page widget areas (now uses Easy Widget Columns) +* Remove backstretch +* Remove compression class to avoid plugin conflicts +* Other minor improvements + +## [1.4.0] - 2017-03-03 +* Add backstretch +* Add autoprefix for more browsers +* Add 'zip' task to gulpfile +* Convert all custom functionality into theme features +* Move everything out of functions.php into correct file in /lib. +* Combine customize.php and output.php into custom-colors.php +* Rename theme-compression and plugin-activation classes + +## [1.3.1] - 2017-02-26 +* Add readme & changelog +* Update Gulpfile.js to enable theme packaging +* Remove font variables in functions.php + +## [1.3.0] - 2017-02-26 +* Remove WP-SCSS support +* Remove register-plugins.php (moved to class-plugin-activation.php) +* Remove Google Fonts Customizer support +* Add helper-functions.php +* Add output.php +* Add theme-defaults.php + +## [1.2.0] - 2017-02-21 +* Fix header image issues diff --git a/Gulpfile.js b/Gulpfile.js new file mode 100755 index 0000000..0374ad9 --- /dev/null +++ b/Gulpfile.js @@ -0,0 +1,72 @@ +/** + * Gulp task config file. + * + * @package SEOThemes\GenesisStarter + */ + +'use strict'; + +var gulp = require( 'gulp' ), + toolkit = require( 'gulp-wp-toolkit' ), + pkg = require( './package.json' ); + +toolkit.extendConfig( + { + theme: { + name: pkg.theme.name, + themeuri: pkg.theme.uri, + description: pkg.description, + author: pkg.author, + authoruri: pkg.theme.authoruri, + version: pkg.version, + license: pkg.license, + licenseuri: pkg.theme.licenseuri, + tags: pkg.theme.tags, + textdomain: pkg.theme.textdomain, + domainpath: pkg.theme.domainpath, + template: pkg.theme.template, + notes: pkg.theme.notes + }, + src: { + php: ['**/*.php', '!vendor/**'], + images: 'assets/images/**/*', + scss: 'assets/scss/**/*.scss', + css: ['**/*.css', '!node_modules/**', '!develop/vendor/**'], + js: ['assets/js/**/*.js', '!node_modules/**'], + json: ['**/*.json', '!node_modules/**'], + i18n: 'lib/languages/' + }, + css: { + basefontsize: 10, // Used by postcss-pxtorem. + remmediaquery: false, + scss: { + 'style': { + src: 'assets/scss/style.scss', + dest: './', + outputStyle: 'expanded' + }, + 'woocommerce': { + src: 'assets/scss/woocommerce/index.scss', + dest: './', + outputStyle: 'expanded' + } + } + }, + dest: { + i18npo: './lib/languages/', + i18nmo: './lib/languages/', + images: './assets/images/', + js: './assets/js/' + }, + server: { + proxy: 'https://yeuchaybo.test', + port: '8000', + https: { + 'key': '/Users/thuanbui/.valet/Certificates/yeuchaybo.test.key', + 'cert': '/Users/thuanbui/.valet/Certificates/yeuchaybo.test.crt' + } + } + } +); + +toolkit.extendTasks( gulp ); diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..a983462 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,264 @@ +The GNU General Public License, Version 2, June 1991 (GPLv2) +============================================================ + +> 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. + + +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. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0e8ea5d --- /dev/null +++ b/README.md @@ -0,0 +1,190 @@ +# Yeu Chay Bo v6.0 + +This is a developer-friendly starter theme used for creating commercial child themes for the Genesis Framework. + +It uses the Child Theme Library to control all of the theme's logic which can be customized from the child theme's configuration file. Styling is based on the latest version of the Genesis Sample Theme. This theme uses Gulp WP Toolkit to automate mundane build tasks like compiling SCSS and minifying images. + +Check out the live demo here. + +### Requirements + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RequirementHow to CheckHow to Install
PHP >= 5.3php -vphp.net
Node.js 6.xnode -vnodejs.org
Yarn 0.2.xyarn -vyarnpkg.com
Gulp CLIgulp -vgulpjs.com
WordPress >= 4.8Admin Footerwordpress.org
Genesis >= 2.6Theme Pagestudiopress.com
+ +## Installation + +### Composer (recommended) + +Install the Yeu Chay Bo v6.0 using Composer from your WordPress themes directory (replace `your-theme-name` below with the name of your theme): + +```shell +composer create-project seothemes/genesis-starter-theme your-theme-name dev-master +``` + +Navigate into the theme root directory: + +```shell +cd your-theme-name +``` + +Run the setup script to rename the theme: + +```shell +sh setup.sh +``` + +Run default Gulp task to kick-off development: + +```shell +gulp +``` + +### Git + +Do a "recursive" Git clone so that the child theme library will be added as a sub-module (replace `your-theme-name` below with the name of your theme): + +```shell +git clone --recurse-submodules https://github.com/seothemes/genesis-starter-theme.git your-theme-name +``` + +Navigate into the theme root directory: + +```shell +cd your-theme-name +``` + +Run the setup script to rename the theme: + +```shell +sh setup.sh +``` + +Install node modules with yarn: + +```shell +yarn install +``` + +Run default Gulp task to kick-off development: + +```shell +gulp +``` + +### Manual + +Download the zip file and upload to your WordPress installation. + +Replace any occurrences of 'Yeu Chay Bo v6.0' with your theme name and 'genesis-starter-theme' with your theme's ID. + +Open the theme in your Terminal and run `gulp` to kick off the build process. + +## Structure + +```shell +theme/ +├── assets/ +│ ├── fonts/ +│ ├── images/ +│ ├── js/ +│ └── scss/ +├── config/ +│ └── config.php +├── [lib/](https://github.com/seothemes/child-theme-library.git) +├── .csscomb.json +├── .editorconfig +├── .gitignore +├── .gitmodules +├── .jsbeautifyrc +├── .jshintrc +├── .stylelintignore +├── .stylelintscssrc.js +├── CHANGELOG.md +├── composer.json +├── composer.lock +├── customizer.dat +├── functions.php +├── Gulpfile.js +├── LICENSE.md +├── package.json +├── package.lock.json +├── phpcs.xml.dist +├── README.md +├── sample.xml +├── screenshot.png +├── setup.sh +├── style.css +├── stylelint.config.js +├── widgets.wie +├── woocommerce.css +└── yarn.lock +``` + +## Support + +Please visit https://github.com/seothemes/genesis-starter-theme/issues/ to open a new issue. + +## Authors + +Lee Anthony + +See also the list of contributors who participated in this project. + +## License + +This project is licensed under the GNU General Public License - see the LICENSE.md file for details. + +## Acknowledgments + +A shout out to anyone who's code was used: + +Gary Jones, +Craig Simpson, +Christoph Herr, +Tim Jensen, +Bill Erickson, +Sridhar Katakam, +Chinmoy Paul, +Calvin Koepke, +Nathan Rice, +Jen Baumann, +Brian Gardner diff --git a/assets/fonts/.gitkeep b/assets/fonts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/assets/images/center-content.gif b/assets/images/center-content.gif new file mode 100644 index 0000000000000000000000000000000000000000..20cc11ef03a6154a6ef4745efd6df637a5ecae4c GIT binary patch literal 580 zcmV-K0=xZ3Nk%w1VTb^F0HOc@oSvS;!^5?;wX3eK|NsAylal}d00000EC2ui0Ehs3 z000C3NV?qqFv>}*y*TU5yYImuj$~<`XsWJk>%MBh3`K3l_UJ2Q*c-;Ml$>{XbtZuu9?6-WLi_`CNJAR+m^Z#W=fP-9q zgojLqh>J&xjE_H#kdr!+l$SM@n3S5Eke!~4prMGPq=crYfT^l{tgU#juynGsd4jf| zxVfUcyrsUss0;!C#>dFX%FE2n&d<=%($mfYAJ^E~+S}aS-rv{7)Z^sk(bnJ?XTmpM z=@jeineP|z^6vBz_U!oi5BtLU`D+01m%xEfjJhlQ!Poyf6?@XRTnNB4smf&25g85CRCz{@DZo=73CnlcUd|m>&O(-XZ`V`hd z3c=_kqS~D5V(LKZBdFP|_M%EqDGsdIv@QaBO)N03!4#7HVD`{j4{e8`P3YCe+YWID z-Q|#X)m*xD3+&y{_s?Jrg}uZ2|Qh))ideD!p2DVA$|X&z1cK_XOTUE~s(RA;s{PcIE;mM3odvCka^?;qbS3AG`a{2eU*XOrCpydz|Fa#*z SfGx;i*?|Zqs31KF002ASIXsI1 literal 0 HcmV?d00001 diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..831a6ccc727b7353fb6b4663989b38998675aaf9 GIT binary patch literal 3499 zcmV;c4OH@pP)Z9I%i_0Y9h9YmQ+|kWJ^RWd!4W(VwWQk!%*>@00{O7 z#nnCHUWfodRv@H7$W{?pCW7r8yTr$kh~f(Z z5WG(;f`%aqG60Gs(joXvMAbH}PDoZ58H(jXsA?cV)zGaBV6KTUYQ%81<=_pVTO3r( zo27#ga|9uh+pb{;u@Dfd`x8_J2=lfG)c(+`RIww=7HY2%Rv3eM0jSw5cGh%@vk(Ql zZ4g{RNER6W5+OQ(RKsit00QeK=sE5fJ^b`ET@&Rg6iejPOPD~+LY+AQsM#czL(>oe zL|Ph%?o1$TOJj?lM5t2D2a$kUW`0ea#`nKZCuh#mE%@05_|y7mre4?F2R8=`ZZN;O=r15DK#c z*eFH;ffQ|Wk&i?K-5_KDQHlEyO91Y#zLz8MwG)c@&(55q*1>&rJN`eo;{w}k147gj zK+Q&>6aXe6Qlx+oWCMWdelzZ^AY>JSYyu%GOCv+UWajH&{!aY=4P87jPEC;qUl%=vwH0>HWc9%{NQ&5Q;fF6i+d4brNKZt6m5oT^i z~oUBlwvC%Nw&Zrx>WAbKnSYVQ>bps~=sCIBV~a|NOr zYC<0{Z#_?KJNMBCAD&5@KW~^ndFm{Rq@)ze>R!op*DxkfDKiM~U1JOo3Jd`2#UKC> zQ%KVWcNqDC2twiB1l_onqmH5d^wGy(=;pPx&#wQRc$dDpdV(6aOTL<_tfP45R0ItG zox)IUCjhKZL$JV500jU)p*_6KKHRIaTfA#f~R0v3{ zM&vhdm`Cxfr&OE*pmv>52BiRjED&rULT-uhQ6nPQ{=T~`P7gkMkiI;3-eKOX2lgJM zGAxmLJbmATSFgXp%Ow#hKqw2;b%?EX9WcL6l^sIHL}afKk^3b2-jX;y{P+~js&TiQ z*Pi~{?|n)?S<6#hk3@4ffoh4!*h{oB05OO(86brGK&UVx-7w!8r@c=dahP=j@WkJf z^nEOoFlt56_XK)@qj;Yb3)HO@M+^XhE-MIu{M3jVs21kKn=#ZZiqjuq%8z+g6q{ju zK^J}=;Bp$gEc1rsa}?KmiIG74Jt7APq^QFzA*Vzz2(=s13N(z-U!FheY2N(x7y19v zm3aD#wAul0L-KT7&1TzHW;D}gaM%r5JH`45YLYtqmR(hxjk(+ zr7!~=PR`J8M-I~hBSZb!2v*D8p`r;rXkbPh;-qP#n-OAD^Az9PSEyWyhi*h$LaLv=Q0{6 z+xB?&i&@%t-~{a&{tw-_ic=b?U^LsjA^89ynRgBazzjr+0HR?{W*AlwE_Ff$5rWu~ zU?7?h>6=$@R1}HRir#(n*B9QV4^E!(0O5r3CdT6@o_$lP3&H3Go>Ey8F~a~P72~T+ z(h{-8nFdS2bkqoIB0_2+8UdksBc?FGyKeCW&2Q&vOdK8HO(3 zAS`WmGSJX2aCY-Lkc=R-r6IV05M6r-2BRLSSkj%Kt6Jjp%nL`ow@B0d76n3u+CKZ$VPHNsd5r7-jRKOgaB{@EAbrmr=RQzH!4 zF{2xNOrTk7gk%O0V*pwi0E^r}tadIFZxDhb4Na&A^OkayeCHEa0Oo%``P^Idb!?~M zsHC*lHFI$|<7}#01C1+%GMG+zLTJxiBhny5mp($YbeBzt|NLbf?fm5d&$gK94^O{A z-+}q&XabFuH20@eX%HzuC{qqZ0D*%@kqd}Mw;GW#5u&3`utYQiKygEy#8*CWjK$jh zc|aI`;xJv=%*;zUkK&=+mIkMv2sN$XhniNX0Nfy`%33212 z^2D{R?p*3T{rq>Y(^cpfTCin?^fp__0zz;c(D3vF31 z(bcu%^vpkwx|%<8c9wSi>HuAf*e^o!l&Q`3KCTmTO@whM+O(W6Xj(3er2+6x5cwuT z-9DKrmh*J{#OFEy&HQJl&(YQgC+Yf#YTndxUyM^KRbxmdf*mD1g7q6jWzL z9>pCntcjQefKtylNB}?-BEX<<8w|IZ09X={Vb@S$G$8@?*!m)9lC;yI!*86TDuAtQ z z-PSTeK>%oBrrNV_pYDkevV(9x#2p2QLSJu^0)TR88lp4^O&Jog+*u7T@2~zhAD!_tpapOGKtE)PSJ&5EhyG3Il|!LXd68b+T$+ zHfb>LcZx<@`J%`Yei$IgfZ&!0A)N?QonR2E7jqPbX{N?JdkO!8m#JVHi5Lceq6>Pn zG$0g1dm{{jCQlFsga{0WEd|qOo1N1r?tVfA?FES9IeEK$WU&Ha7$R>F=AA>U6M{=G zk$-pT^KfPu0E*}I0~3Hy1PubhtUnOEQ7qedYoXM44VR`Wmqa*6@mYWv1c0K8_K_Jt z=!B*f2stG}uq7god86G{G_8r4hB`0Fho%6a92$kl9|-gIX|5Cb4_>xJj6&s?^kZ`{ zUl_TIkK#J%AB3Moc(mEhL`*_aKq&mmJ~#;or2r6vrtBahSwZk>v9vW)mR-ZOMog*4 z`K6c5M`vNa1TcDV9m^erdDrl0u~!IVXtR3&qU5su@H8M406-8Lf;cGU4+L*ZgaRN1 zakyuPw(Q)p;IjYpxJxq1pjKs>wDKc>z(GlXm;r#4Dt4a?FXMQmVFZeyMzjLNMgREx Z{{aYQtO;?-sbl~E002ovPDHLkV1hx@JSPAE literal 0 HcmV?d00001 diff --git a/assets/images/hero.jpg b/assets/images/hero.jpg new file mode 100644 index 0000000000000000000000000000000000000000..59a689a9e50d7a8ccc1020bdaaa1e8e0bedd7799 GIT binary patch literal 332898 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

98xFfwTzw|6~iXt(%veVC)d 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

L^n{DVtll-XoW0wDe#{%yvI+ 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 E152Ln_y7O^ literal 0 HcmV?d00001 diff --git a/assets/images/transparency-grid.png b/assets/images/transparency-grid.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7cc479bc126d7be37e30145996876b4c360688 GIT binary patch literal 1545 zcmV+k2KM=hP)(%Qv3?qEHi`VEjU8&usYj_!>KjH^P0+O41Zob5}B#KWE3jSs=BJTI+|IXlb^^CaQ z8Rrqtbq24i3_j1_V}76R=b!J_Oy|z$dc^tM=kdFGK66~3_TRJbJlFN(O!J@bz5Rar z9M>1~|KzFjTqBP2l_Afy7dh_h$0+$TPtwnsH1*rB__t>*zkh$vk5?lY+~fYXMFb+h zFbs*{bsxd!^F4-T%6Zo|-%mt?R5)esI6*?+9aG~V@&<-jMv5lol67AiIl#m+Z6@m}yW@^Nw&of{ z{EMw6x9sO3lAZTNUx)65gULozYV;Xn1P~~wJwEs}24gByg-M_lvY-_g%3_8^z^MGe zHa24%k!61HNL84cBv1_f4ZV%YPi+|~+AshQn8@%+8Un;ciaSamqS32zVHyXcO`<3g zE4TJ;*ENUSwlpV1#2uvyf7WC}8Rl!@AhN(L5yGg71|g1-hGNL<*&Hx(o(ZYaQ8Yi* zoqU0Dvd1SguCg8{4bHQhH%d8y%OSP`q1;(gU8O_X7;x+9CWoTqrA&8dh@Q>lRq`6i zkbNsmS>nP}4y18`jEmm3mKqdZRc1nqW6GvQry3X)v-EKsngosAD zLtUpDOlK=B(DMrKqgkZRg*mM`+Jz}vQ|WXDpCDM1imlPA2n93BLUN)de@glj1tqKM*pV|Qkgs#s_`q1H zip;_b*rsih%!^KqY|vn3CQa09K^<{{4}hb>2`qa+RPaBzPNn`S&50r#BsQHNb*v66 z!uI9w`lUc^qE&{WtQ2A8`@F2CImY7#Nx)&^DIl zQ~~94U4eXmaT5(IKXHjLCoVKcL>RhA$dsla%ZlKKEEAa0@0mNQY0;YjR+VGnfFR}P z+#4n|>c|oI=BD&3{|vR1t%l8;X)e{By_S;A?R5#I8G%jeJ*puZ1(fwUoQlBGpdB^z z!b8(V&hS1L$=4AtAG?e(O20HDAqitl7!Qb}HP}W3rjo~m_hm_pjM*6@T0_DQG2>Gn zBqxrEW@ez0=1{{ySFzVkKx-Ow3(I+O(GFwMZ9$Uu5bTcPqQ0EIx`c^^(Xhn(GzW5! zY}ML5wBveW5akdf#>5NjMfwmN4G5uNNL?AZY=XSGV4D}13fiGQKDTNd4igl=<)91= z&qdkTD9K@d1)=Cqc6c=YV*v`-}MHD9`Xi&dzA!Mb}%3+&>1rMY2cd(Uy#>;9c zA=)&@NOM8yuh0l5`9k*PZeGGLrUe7tMtQbE5kLK`RjH$<(u$5D vf0(A(t'); + } ); + + /** + * Add shrink class to header on scroll. + */ + $( window ).scroll( function() { + var scroll = $( window ).scrollTop(); + var header = $( '.site-header' ).outerHeight(); + if ( scroll >= header ) { + $( '.site-header' ).addClass( 'shrink' ); + } else { + $( '.site-header' ).removeClass( 'shrink' ); + } + }); + + /** + * Smooth scrolling. + */ + // Select all links with hashes + $( 'a[href*="#"]' ) + + // Remove links that don't actually link to anything + .not( '[href="#"]' ) + .not( '[href="#0"]' ) + + // Remove WooCommerce tabs + .not( '[href*="#tab-"]' ) + .click( function( event ) { + + // On-page links + if ( + location.pathname.replace( /^\//, '' ) == + this.pathname.replace( /^\//, '' ) && + location.hostname == this.hostname + ) { + + // Figure out element to scroll to + var target = $( this.hash ); + target = target.length ? + target : + $( '[name=' + this.hash.slice( 1 ) + ']' ); + + // Does a scroll target exist? + if ( target.length ) { + + // Only prevent default if animation is actually gonna happen + event.preventDefault(); + $( 'html, body' ).animate( + { + scrollTop: target.offset().top + }, + 1000, + function() { + + // Callback after animation, must change focus! + var $target = $( target ); + $target.focus(); + + // Checking if the target was focused + if ( $target.is( ':focus' ) ) { + return false; + } else { + + // Adding tabindex for elements not focusable + $target.attr( 'tabindex', '-1' ); + + // Set focus again + $target.focus(); + } + } + ); + } + } + }); +}( document, jQuery ) ); diff --git a/assets/scss/common-classes/_avatar.scss b/assets/scss/common-classes/_avatar.scss new file mode 100644 index 0000000..68840f4 --- /dev/null +++ b/assets/scss/common-classes/_avatar.scss @@ -0,0 +1,21 @@ +/* ## Avatar +--------------------------------------------- */ + +.avatar { + float: left; + border-radius: 50%; + + .author-box &, + .alignleft & { + margin-right: 20px; + } + + .alignright & { + margin-left: 20px; + } + + .comment & { + margin: 0 15px 20px 0; + } + +} diff --git a/assets/scss/common-classes/_genesis.scss b/assets/scss/common-classes/_genesis.scss new file mode 100644 index 0000000..e645806 --- /dev/null +++ b/assets/scss/common-classes/_genesis.scss @@ -0,0 +1,56 @@ +/* ## Genesis +--------------------------------------------- */ + +.after-entry { + margin-bottom: 40px; + padding: 20px 30px; + box-shadow: $box-shadow; + + @include breakpoint( sm ) { + margin-bottom: 60px; + padding: 40px 60px; + } + + .widget:last-of-type { + margin-bottom: 0; + } +} + +.breadcrumb { + margin-bottom: 40px; + padding-bottom: 10px; + border-bottom: $border; + font-size: $breadcrumb--font-size; +} + +.archive-description { + margin-bottom: 40px; + + @include breakpoint( sm ) { + margin-bottom: 60px; + } + + p:last-child { + margin-bottom: 0; + } + + .entry-title { + margin-bottom: 10px; + font-size: $archive-description__entry-title--font-size; + font-weight: $font-weight--semibold; + } +} + +.author-box { + margin-bottom: 40px; + + @include breakpoint( sm ) { + margin-bottom: 60px; + padding: 30px; + background-color: $author-box--background-color; + } + + p:last-child { + margin-bottom: 0; + } +} diff --git a/assets/scss/common-classes/_search-form.scss b/assets/scss/common-classes/_search-form.scss new file mode 100644 index 0000000..462f04f --- /dev/null +++ b/assets/scss/common-classes/_search-form.scss @@ -0,0 +1,21 @@ +/* ## Search Form +--------------------------------------------- */ + +.search-form { + overflow: hidden; + + .entry-content & { + width: 50%; + margin-bottom: 40px; + } +} + +.post-password-form input[type="submit"], +.search-form input[type="submit"] { + margin-top: 10px; +} + +.widget_search input[type="submit"] { + + @include screen-reader-text; +} diff --git a/assets/scss/common-classes/_titles.scss b/assets/scss/common-classes/_titles.scss new file mode 100644 index 0000000..07b6b0c --- /dev/null +++ b/assets/scss/common-classes/_titles.scss @@ -0,0 +1,35 @@ +/* ## Titles +--------------------------------------------- */ + +.author-box-title { + margin-bottom: 10px; + font-size: $author-box-title--font-size; + font-weight: $font-weight--semibold; +} + +.entry-title { + margin-bottom: 10px; + font-size: $entry-title--font-size; + + a { + color: $entry-title__link--font-color; + text-decoration: none; + + &:focus, + &:hover { + color: $entry-title__link--font-color-hover; + } + } + +} + +.widget-title { + margin-bottom: 20px; + font-size: $widget-title--font-size; + font-weight: $font-weight--semibold; + + .sidebar & a { + color: $sidebar__widget-title--font-color; + text-decoration: none; + } +} diff --git a/assets/scss/common-classes/_wordpress-editor.scss b/assets/scss/common-classes/_wordpress-editor.scss new file mode 100644 index 0000000..4d86c42 --- /dev/null +++ b/assets/scss/common-classes/_wordpress-editor.scss @@ -0,0 +1,26 @@ +/* WordPress Editor +--------------------------------------------- */ + +.has-light-gray-background-color { + background-color: $lightest-grey; +} + +.has-light-gray-color { + color: $lightest-grey; +} + +.has-medium-gray-background-color { + background-color: $medium-grey; +} + +.has-medium-gray-color { + color: $medium-grey; +} + +.has-dark-gray-background-color { + background-color: $dark-grey; +} + +.has-dark-gray-color { + color: $dark-grey; +} diff --git a/assets/scss/common-classes/_wordpress.scss b/assets/scss/common-classes/_wordpress.scss new file mode 100644 index 0000000..7fb2d8a --- /dev/null +++ b/assets/scss/common-classes/_wordpress.scss @@ -0,0 +1,68 @@ +/* ## WordPress +--------------------------------------------- */ + +a.aligncenter img { + display: block; + margin: 0 auto; +} + +a.alignnone { + display: inline-block; +} + +.alignleft { + float: left; + text-align: left; +} + +.alignright { + float: right; + text-align: right; +} + +a.alignleft, +a.alignnone, +a.alignright { + max-width: 100%; +} + +img.centered, +.aligncenter { + display: block; + margin: 0 auto 30px; +} + +img.alignnone, +.alignnone { + margin-bottom: 15px; +} + +a.alignleft, +img.alignleft, +.wp-caption.alignleft { + margin: 0 20px 20px 0; +} + +a.alignright, +img.alignright, +.wp-caption.alignright { + margin: 0 0 20px 20px; +} + +.gallery-caption, +.wp-caption-text { + margin: 0; + font-size: $entry-content__caption--font-size; + font-weight: $font-weight--semibold; + text-align: center; +} + +.entry-content p.wp-caption-text { + margin-bottom: 0; +} + +.entry-content .wp-audio-shortcode, +.entry-content .wp-playlist, +.entry-content .wp-video { + margin: 0 0 30px; +} diff --git a/assets/scss/common-classes/index.scss b/assets/scss/common-classes/index.scss new file mode 100644 index 0000000..50ab209 --- /dev/null +++ b/assets/scss/common-classes/index.scss @@ -0,0 +1,9 @@ +/* # Common Classes +---------------------------------------------------------------------------------------------------- */ + +@import "avatar"; +@import "genesis"; +@import "search-form"; +@import "titles"; +@import "wordpress-editor"; +@import "wordpress"; diff --git a/assets/scss/content-area/_entry-comments.scss b/assets/scss/content-area/_entry-comments.scss new file mode 100644 index 0000000..165e56a --- /dev/null +++ b/assets/scss/content-area/_entry-comments.scss @@ -0,0 +1,75 @@ +/* ## Entry Comments +--------------------------------------------- */ + +.entry-comments { + margin-bottom: 40px; + font-size: $comments--font-size; + + @include breakpoint( sm ) { + margin-bottom: 60px; + } +} + +.comment-list { + + li { + padding: 40px 0 0 30px; + } + + .depth-1 { + padding-left: 0; + } + + .bypostauthor { + font-size: inherit; + } +} + +.comment-header { + margin-bottom: 30px; +} + +.comment-content { + clear: both; + + ul > li { + list-style-type: disc; + } +} + +.comment-respond { + margin-bottom: 40px; + font-size: $comments--font-size; + + @include breakpoint( sm ) { + margin-bottom: 60px; + } + + input[type="email"], + input[type="text"], + input[type="url"] { + width: 50%; + } + + label { + display: block; + margin-right: 12px; + } +} + +.comment-header p { + margin-bottom: 0; +} + +.entry-pings { + margin-bottom: 40px; + font-size: $comments--font-size; + + @include breakpoint( sm ) { + margin-bottom: 60px; + } + + .reply { + display: none; + } +} diff --git a/assets/scss/content-area/_entry-content.scss b/assets/scss/content-area/_entry-content.scss new file mode 100644 index 0000000..cbed268 --- /dev/null +++ b/assets/scss/content-area/_entry-content.scss @@ -0,0 +1,83 @@ +/* ## Entry Content +--------------------------------------------- */ + +.entry { + margin-bottom: 40px; + + @include breakpoint(sm) { + margin-bottom: 60px; + } + + .page &:last-of-type { + margin-bottom: 0; + } +} + +.entry-content { + + p { + + &.has-background { + padding: 25px 30px; + + &.box-shadow { + box-shadow: 0 0 20px rgba(0, 0, 0, 0.1); + } + + &.light-text { + + a { + color: $white; + text-decoration: underline; + + &:focus, + &:hover { + text-decoration: none; + } + } + + } + } + } + + ol, + ul { + margin-bottom: 30px; + margin-left: 40px; + } + + ol > li { + list-style-type: decimal; + } + + ul > li { + list-style-type: disc; + } + + ol ol, + ul ul { + margin-bottom: 0; + } + + code { + background-color: $code--background-color; + } + + .caption { + margin-top: -20px; + font-size: $entry-content__caption--font-size; + font-weight: $font-weight--semibold; + text-align: center; + } +} + +.entry-image-link { + display: block; + + @include clearfix; +} + +.content .sticky { + padding: 30px; + background-color: $sticky--background-color; +} diff --git a/assets/scss/content-area/_entry-meta.scss b/assets/scss/content-area/_entry-meta.scss new file mode 100644 index 0000000..28df499 --- /dev/null +++ b/assets/scss/content-area/_entry-meta.scss @@ -0,0 +1,29 @@ +/* ## Entry Meta +--------------------------------------------- */ + +.entry-meta { + + p { + margin-bottom: 0; + font-size: $entry-meta--font-size; + } + + .entry-header & { + margin-bottom: 20px; + } + + .entry-footer & { + padding-top: 20px; + border-top: $border; + } +} + +.entry-categories, +.entry-tags { + display: block; +} + +.entry-comments-link:before { + margin: 0 6px 0 2px; + content: "\2014"; +} diff --git a/assets/scss/content-area/_pagination.scss b/assets/scss/content-area/_pagination.scss new file mode 100644 index 0000000..50c9362 --- /dev/null +++ b/assets/scss/content-area/_pagination.scss @@ -0,0 +1,41 @@ +/* ## Pagination +--------------------------------------------- */ + +.pagination { + clear: both; + margin: 60px 0; +} + +.adjacent-entry-pagination { + margin-bottom: 0; +} + +.archive-pagination { + + li { + display: inline; + + a { + display: inline-block; + margin-bottom: 4px; + padding: 8px 12px; + color: $archive-pagination--font-color; + background-color: $archive-pagination--background-color; + font-size: $archive-pagination--font-size; + font-weight: $font-weight--semibold; + text-decoration: none; + cursor: pointer; + + } + + a:focus, + a:hover, + &.active a { + color: $archive-pagination--font-color-hover; + background-color: $archive-pagination--background-color-hover; + } + + } + +} + diff --git a/assets/scss/content-area/index.scss b/assets/scss/content-area/index.scss new file mode 100644 index 0000000..38f3566 --- /dev/null +++ b/assets/scss/content-area/index.scss @@ -0,0 +1,7 @@ +/* # Content Area +---------------------------------------------------------------------------------------------------- */ + +@import "entry-content"; +@import "entry-meta"; +@import "pagination"; +@import "entry-comments"; diff --git a/assets/scss/defaults/_forms.scss b/assets/scss/defaults/_forms.scss new file mode 100644 index 0000000..68fa9b3 --- /dev/null +++ b/assets/scss/defaults/_forms.scss @@ -0,0 +1,76 @@ +/* ## Forms +--------------------------------------------- */ + +input, +select, +textarea { + width: 100%; + padding: 15px; + border: $border-width $border-style $light-grey; + color: $form--font-color; + background-color: $forms__background-color; + font-size: $form--font-size; + font-weight: $font-weight--regular; + + &:focus, + &:focus { + border: $border-width $border-style $medium-grey; + outline: none; + } +} + +input[type="checkbox"], +input[type="image"], +input[type="radio"] { + width: auto; +} + +::-moz-placeholder { + opacity: 1; + color: $dark-grey; +} + +::-webkit-input-placeholder { + color: $dark-grey; +} + +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +.button { + display: inline-block; + width: auto; + padding: 15px 30px; + border: 0; + color: $button--font-color; + background-color: $button--background-color; + font-size: $button--font-size; + font-weight: $font-weight--semibold; + white-space: normal; + text-decoration: none; + cursor: pointer; + + &:focus, + &:hover { + color: $button--font-color-hover; + background-color: $button--background-color-hover; + } + + &.small { + padding: 8px 16px; + } + + .entry-content { + + &:focus, + &:hover { + color: $button--font-color-hover; + } + } +} + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-results-button { + display: none; +} diff --git a/assets/scss/defaults/_gallery.scss b/assets/scss/defaults/_gallery.scss new file mode 100644 index 0000000..c9857c3 --- /dev/null +++ b/assets/scss/defaults/_gallery.scss @@ -0,0 +1,70 @@ +/* ## Gallery +--------------------------------------------- */ + +.gallery { + overflow: hidden; + + img { + height: auto; + padding: 4px; + + &:focus, + &:hover { + border: $border-width $border-style $medium-grey; + outline: none; + } + } +} + +.gallery-item { + float: left; + margin: 0; + text-align: center; + + .gallery-columns-1 & { + width: 100%; + } + + .gallery-columns-2 & { + width: 50%; + } + + .gallery-columns-3 & { + width: 33%; + } + + .gallery-columns-4 & { + width: 25%; + } + + .gallery-columns-5 & { + width: 20%; + } + + .gallery-columns-6 & { + width: 16.6666%; + } + + .gallery-columns-7 & { + width: 14.2857%; + } + + .gallery-columns-8 & { + width: 12.5%; + } + + .gallery-columns-9 & { + width: 11.1111%; + } +} + +.gallery-columns-2 .gallery-item:nth-child(2n + 1), +.gallery-columns-3 .gallery-item:nth-child(3n + 1), +.gallery-columns-4 .gallery-item:nth-child(4n + 1), +.gallery-columns-5 .gallery-item:nth-child(5n + 1), +.gallery-columns-6 .gallery-item:nth-child(6n + 1), +.gallery-columns-7 .gallery-item:nth-child(7n + 1), +.gallery-columns-8 .gallery-item:nth-child(8n + 1), +.gallery-columns-9 .gallery-item:nth-child(9n + 1) { + clear: left; +} diff --git a/assets/scss/defaults/_headings.scss b/assets/scss/defaults/_headings.scss new file mode 100644 index 0000000..7904684 --- /dev/null +++ b/assets/scss/defaults/_headings.scss @@ -0,0 +1,47 @@ +/* ## Headings +--------------------------------------------- */ + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0 0 20px; + font-family: $heading--font-family; + font-weight: $font-weight--regular; + line-height: $line-height--small; +} + +h1 { + font-size: $h1--font-size; +} + +h2 { + font-size: $h2--font-size; +} + +h3 { + font-size: $h3--font-size; + + .entry-content & { + font-weight: $font-weight--semibold; + } +} + +h4 { + font-size: $h4--font-size; + + .entry-content & { + margin-top: 4rem; + font-weight: $font-weight--semibold; + } +} + +h5 { + font-size: $h5--font-size; +} + +h6 { + font-size: $h6--font-size; +} diff --git a/assets/scss/defaults/_objects.scss b/assets/scss/defaults/_objects.scss new file mode 100644 index 0000000..e676ea0 --- /dev/null +++ b/assets/scss/defaults/_objects.scss @@ -0,0 +1,20 @@ +/* ## Objects +--------------------------------------------- */ + +embed, +iframe, +img, +object, +video, +.wp-caption { + max-width: 100%; +} + +img { + height: auto; + vertical-align: top; +} + +figure { + margin: 0; +} diff --git a/assets/scss/defaults/_screen-reader-text.scss b/assets/scss/defaults/_screen-reader-text.scss new file mode 100644 index 0000000..cc0054f --- /dev/null +++ b/assets/scss/defaults/_screen-reader-text.scss @@ -0,0 +1,30 @@ +/* ## Screen Reader Text +--------------------------------------------- */ + +.screen-reader-shortcut, +.screen-reader-text, +.screen-reader-text span { + + @include screen-reader-text; +} + +.screen-reader-shortcut:focus, +.screen-reader-text:focus, +.widget_search input[type="submit"]:focus { + display: block; + clip: auto !important; + z-index: 100000; /* Above WP toolbar. */ + width: auto; + height: auto; + padding: 15px 23px 14px; + color: $body--font-color; + background: $body--background-color; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + font-size: $screen-reader--font-size-focus; + font-weight: $font-weight--bold; + text-decoration: none; +} + +.more-link { + position: relative; +} diff --git a/assets/scss/defaults/_tables.scss b/assets/scss/defaults/_tables.scss new file mode 100644 index 0000000..5b647ab --- /dev/null +++ b/assets/scss/defaults/_tables.scss @@ -0,0 +1,35 @@ +/* ## Tables +--------------------------------------------- */ + +table { + width: 100%; + margin-bottom: 40px; + border-spacing: 0; + border-collapse: collapse; + line-height: $line-height--big; + word-break: break-all; +} + +tbody { + border-bottom: $border; +} + +td { + padding: 6px; + border-top: $border; + text-align: left; + + &:first-child { + padding-left: 0; + } +} + +th { + padding: 0 6px; + font-weight: $font-weight--regular; + text-align: left; + + &:first-child { + padding-left: 0; + } +} diff --git a/assets/scss/defaults/_typographical-elements.scss b/assets/scss/defaults/_typographical-elements.scss new file mode 100644 index 0000000..240457e --- /dev/null +++ b/assets/scss/defaults/_typographical-elements.scss @@ -0,0 +1,107 @@ +/* ## Typographical Elements +--------------------------------------------- */ + +html { + font-size: 62.5%; /* 10px browser default */ + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +/* Chrome fix */ +body > div { + font-size: $body--font-size; +} + +body { + margin: 0; + color: $body--font-color; + background-color: $body--background-color; + font-family: $body--font-family; + font-size: $body--font-size; + font-weight: $font-weight--regular; + line-height: $line-height--normal; + + &.page-boxed { + max-width: map_get($breakpoints, md); + margin: 0 auto; + background-color: $page-boxed--background-color; + box-shadow: $box-shadow; + } +} + +button, +input:focus, +input[type="button"], +input[type="reset"], +input[type="submit"], +textarea:focus, +.button, +.gallery img { + transition: all $transition; +} + +a { + color: $link--font-color; + text-decoration: underline; + transition: color $transition, background-color $transition; + + &:focus, + &:hover { + color: $link--font-color-hover; + text-decoration: none; + } +} + + +p { + margin: 0 0 30px; + padding: 0; +} + +ol, +ul { + margin: 0; + padding: 0; +} + +li { + list-style-type: none; +} + +hr { + clear: both; + margin: 30px 0; + border: 0; + border-top: $border; + border-collapse: collapse; +} + +b, +strong { + font-weight: $font-weight--bold; +} + +blockquote, +cite, +em, +i { + font-style: italic; +} + +mark { + background: $mark--background-color; +} + +blockquote { + margin: 30px; + + &:before { + display: block; + position: relative; + top: -10px; + left: -20px; + height: 0; + font-size: $blockquote__before--font-size; + content: "\201C"; + } +} diff --git a/assets/scss/defaults/index.scss b/assets/scss/defaults/index.scss new file mode 100644 index 0000000..bf772e4 --- /dev/null +++ b/assets/scss/defaults/index.scss @@ -0,0 +1,10 @@ +/* # Defaults +---------------------------------------------------------------------------------------------------- */ + +@import "typographical-elements"; +@import "headings"; +@import "objects"; +@import "gallery"; +@import "forms"; +@import "tables"; +@import "screen-reader-text"; diff --git a/assets/scss/footer-widgets/_footer-widgets.scss b/assets/scss/footer-widgets/_footer-widgets.scss new file mode 100644 index 0000000..a3a8711 --- /dev/null +++ b/assets/scss/footer-widgets/_footer-widgets.scss @@ -0,0 +1,33 @@ +.footer-widgets { + clear: both; + padding: 60px 0; + border-bottom: $border; + font-size: $footer-widgets--font-size; + text-align: left; + + .wrap { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + + @include flexfix; + } + + .widget:last-child { + margin-bottom: 0; + } +} + +.footer-widget-area { + margin-bottom: 4rem; + + @include breakpoint( sm ) { + float: left; + width: $one-third; + margin-bottom: 0; + } + + &:last-child { + margin-bottom: 0; + } +} diff --git a/assets/scss/footer-widgets/index.scss b/assets/scss/footer-widgets/index.scss new file mode 100644 index 0000000..b7dcedf --- /dev/null +++ b/assets/scss/footer-widgets/index.scss @@ -0,0 +1,4 @@ +/* # Footer Widgets +---------------------------------------------------------------------------------------------------- */ + +@import "footer-widgets"; diff --git a/assets/scss/front-page/_front-page-1.scss b/assets/scss/front-page/_front-page-1.scss new file mode 100644 index 0000000..ee297b3 --- /dev/null +++ b/assets/scss/front-page/_front-page-1.scss @@ -0,0 +1,54 @@ +/* ## Front Page 1 +--------------------------------------------- */ + +.front-page-1 { + + @include breakpoint(sm) { + padding: 26rem 0 20rem; + } +} + +.wp-custom-header { + overflow: hidden; + position: absolute; + width: 100%; + height: 100%; + pointer-events: none; + object-fit: cover; + object-position: center; + + @include center; + + .woocommerce & img, + img, + video, + iframe { + width: 100%; + height: 100%; + object-fit: cover; + object-position: center center; + } + + iframe { + position: absolute; + top: -20%; + right: -20%; + bottom: -20%; + left: -20%; + width: 140%; + min-width: 100%; + max-width: 140%; + height: 140%; + min-height: 56.25vw; // 16:9 aspect ratio. + max-height: none; + margin: auto; + } + + img { + display: none; + } +} + +.wp-custom-header-video-button { + display: none; +} diff --git a/assets/scss/front-page/_front-page-2.scss b/assets/scss/front-page/_front-page-2.scss new file mode 100644 index 0000000..56da0ee --- /dev/null +++ b/assets/scss/front-page/_front-page-2.scss @@ -0,0 +1,6 @@ +/* ## Front Page 2 +--------------------------------------------- */ + +.front-page-2 { + padding: 6rem 0; +} diff --git a/assets/scss/front-page/_front-page-3.scss b/assets/scss/front-page/_front-page-3.scss new file mode 100644 index 0000000..f570b0d --- /dev/null +++ b/assets/scss/front-page/_front-page-3.scss @@ -0,0 +1,7 @@ +/* ## Front Page 3 +--------------------------------------------- */ + +.front-page-3 { + padding: 6rem 0; + border-top: $border; +} diff --git a/assets/scss/front-page/_front-page-4.scss b/assets/scss/front-page/_front-page-4.scss new file mode 100644 index 0000000..6213d4a --- /dev/null +++ b/assets/scss/front-page/_front-page-4.scss @@ -0,0 +1,6 @@ +/* ## Front Page 4 +--------------------------------------------- */ + +.front-page-4 { + padding: 6rem 0; +} diff --git a/assets/scss/front-page/_front-page-5.scss b/assets/scss/front-page/_front-page-5.scss new file mode 100644 index 0000000..593a976 --- /dev/null +++ b/assets/scss/front-page/_front-page-5.scss @@ -0,0 +1,6 @@ +/* ## Front Page 5 +--------------------------------------------- */ + +.front-page-5 { + padding: 6rem 0; +} diff --git a/assets/scss/front-page/_index.scss b/assets/scss/front-page/_index.scss new file mode 100644 index 0000000..4013cfd --- /dev/null +++ b/assets/scss/front-page/_index.scss @@ -0,0 +1,9 @@ +/* # Front Page +---------------------------------------------------------------------------------------------------- */ + +@import "front-page-1"; +@import "front-page-2"; +@import "front-page-3"; +@import "front-page-4"; +@import "front-page-5"; + diff --git a/assets/scss/html5-reset/_baseline-normalize.scss b/assets/scss/html5-reset/_baseline-normalize.scss new file mode 100644 index 0000000..8df6adb --- /dev/null +++ b/assets/scss/html5-reset/_baseline-normalize.scss @@ -0,0 +1,173 @@ +/* ## Baseline Normalize +--------------------------------------------- */ + +/* normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */ + +button, +hr, +input { + overflow: visible; +} + +progress, +sub, +sup { + vertical-align: baseline; +} + +[type="checkbox"], +[type="radio"], +legend { + box-sizing: border-box; + padding: 0; +} + +html { + line-height: 1.15; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +h1 { + margin: 0.67em 0; + font-size: 2em; +} + +hr { + box-sizing: content-box; + height: 0; +} + +code, +kbd, +pre, +samp { + font-family: monospace; + font-size: 1em; +} + +a { + background-color: transparent; +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +img { + border-style: none; +} + +button, +input, +optgroup, +select, +textarea { + margin: 0; + font-family: inherit; + font-size: 100%; + line-height: 1.15; +} + +button, +select { + text-transform: none; +} + +[type="button"], +[type="reset"], +[type="submit"], +button { + -webkit-appearance: button; +} + +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner, +button::-moz-focus-inner { + padding: 0; + border-style: none; +} + +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring, +button:-moz-focusring { + outline: ButtonText dotted 1px; +} + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +legend { + display: table; + max-width: 100%; + color: inherit; + white-space: normal; +} + +textarea { + overflow: auto; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +details { + display: block; +} + +summary { + display: list-item; +} + +[hidden], +template { + display: none; +} diff --git a/assets/scss/html5-reset/_box-sizing.scss b/assets/scss/html5-reset/_box-sizing.scss new file mode 100644 index 0000000..d9f4729 --- /dev/null +++ b/assets/scss/html5-reset/_box-sizing.scss @@ -0,0 +1,12 @@ +/* ## Box Sizing +--------------------------------------------- */ + +html { + box-sizing: border-box; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} diff --git a/assets/scss/html5-reset/_float-clearing.scss b/assets/scss/html5-reset/_float-clearing.scss new file mode 100644 index 0000000..c716528 --- /dev/null +++ b/assets/scss/html5-reset/_float-clearing.scss @@ -0,0 +1,39 @@ +/* ## Float Clearing +--------------------------------------------- */ + +.author-box:before, +.clearfix:before, +.entry:before, +.entry-content:before, +.footer-widgets:before, +.nav-primary:before, +.nav-secondary:before, +.pagination:before, +.site-container:before, +.site-footer:before, +.site-header:before, +.site-inner:before, +.widget:before, +.wrap:before { + display: table; + content: " "; +} + +.author-box:after, +.clearfix:after, +.entry:after, +.entry-content:after, +.footer-widgets:after, +.nav-primary:after, +.nav-secondary:after, +.pagination:after, +.site-container:after, +.site-footer:after, +.site-header:after, +.site-inner:after, +.widget:after, +.wrap:after { + display: table; + clear: both; + content: " "; +} diff --git a/assets/scss/html5-reset/index.scss b/assets/scss/html5-reset/index.scss new file mode 100644 index 0000000..605e5d3 --- /dev/null +++ b/assets/scss/html5-reset/index.scss @@ -0,0 +1,6 @@ +/* # HTML5 Reset +---------------------------------------------------------------------------------------------------- */ + +@import "baseline-normalize"; +@import "box-sizing"; +@import "float-clearing"; diff --git a/assets/scss/plugins/_genesis-enews-extended.scss b/assets/scss/plugins/_genesis-enews-extended.scss new file mode 100644 index 0000000..8d1054e --- /dev/null +++ b/assets/scss/plugins/_genesis-enews-extended.scss @@ -0,0 +1,41 @@ +/* ## Genesis eNews Extended +--------------------------------------------- */ + +.enews { + + form + p { + margin-top: 20px; + } + + .after-entry & { + padding: 10px; + text-align: center; + + @include breakpoint(sm) { + padding-right: 30px; + padding-left: 30px; + } + } + + .sidebar & { + padding: 30px; + background-color: $enews__sidebar--background-color; + } +} + +.enews-widget { + + input { + margin-bottom: 10px; + font-size: $enews-widget__input--font-size; + + &[type="submit"] { + width: 100%; + margin: 0; + } + + .after-entry & { + text-align: center; + } + } +} diff --git a/assets/scss/plugins/_genesis-simple-faq.scss b/assets/scss/plugins/_genesis-simple-faq.scss new file mode 100644 index 0000000..892681f --- /dev/null +++ b/assets/scss/plugins/_genesis-simple-faq.scss @@ -0,0 +1,66 @@ +/* ## Genesis Simple FAQ +--------------------------------------------- */ + +.gs-faq { + padding: 5px 0; +} + +.gs-faq__answer { + + p:last-of-type { + margin-bottom: 0; + } + + .js & { + display: none; + padding: 5px; + } + + &.no-animation.gs-faq--expanded { + display: block; + } +} + +.gs-faq__question { + display: none; + width: 100%; + margin-top: 10px; + padding-right: 0; + padding-left: 0; + border-bottom: $border; + color: $gs-faq__question--font-color; + background: $gs-faq__question--background-color; + text-align: left; + white-space: normal; + justify-content: space-between; + + &:focus, + &:hover { + color: $gs-faq__question--font-color-hover; + background: $gs-faq__question--background-color-hover; + } + + &:after { + content: "+"; + } + + &:first-of-type { + margin-top: 0; + } + + &.gs-faq--expanded:after { + content: "−"; + } + + .js & { + display: flex; + } +} + +.gs-faq__answer__heading { + + .js & { + + display: none; + } +} diff --git a/assets/scss/plugins/_google-map.scss b/assets/scss/plugins/_google-map.scss new file mode 100644 index 0000000..790ac0f --- /dev/null +++ b/assets/scss/plugins/_google-map.scss @@ -0,0 +1,12 @@ +/* ## Google Map +--------------------------------------------- */ + +.agm-canvas { + + .hero-section & { + position: absolute; + height: 100% !important; + + @include center; + } +} diff --git a/assets/scss/plugins/_jetpack.scss b/assets/scss/plugins/_jetpack.scss new file mode 100644 index 0000000..f83f4aa --- /dev/null +++ b/assets/scss/plugins/_jetpack.scss @@ -0,0 +1,7 @@ +/* ## Jetpack +--------------------------------------------- */ + +#wpstats { + display: none; +} + diff --git a/assets/scss/plugins/index.scss b/assets/scss/plugins/index.scss new file mode 100644 index 0000000..e75f1ef --- /dev/null +++ b/assets/scss/plugins/index.scss @@ -0,0 +1,7 @@ +/* # Plugins +---------------------------------------------------------------------------------------------------- */ + +@import "genesis-enews-extended"; +@import "genesis-simple-faq"; +@import "google-map"; +@import "jetpack"; diff --git a/assets/scss/print-styles/_print-styles.scss b/assets/scss/print-styles/_print-styles.scss new file mode 100644 index 0000000..92e13bc --- /dev/null +++ b/assets/scss/print-styles/_print-styles.scss @@ -0,0 +1,141 @@ +/* # Print Styles +---------------------------------------------------------------------------------------------------- */ + +@media print { + + *, + *:before, + *:after { + color: #333 !important; + background: transparent !important; + box-shadow: none !important; + text-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + a[href^="javascript:"]:after, + a[href^="#"]:after, + .site-title > a:after { + content: ""; + } + + thead { + display: table-header-group; + } + + img, + tr { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + @page { + margin: 2cm 0.5cm; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + blockquote, + pre { + border: 1px solid #999; + page-break-inside: avoid; + } + + .content, + .content-sidebar { + width: 100%; + } + + button, + input, + select, + textarea, + .breadcrumb, + .comment-edit-link, + .comment-form, + .comment-list .reply a, + .comment-reply-title, + .edit-link, + .entry-comments-link, + .entry-footer, + .genesis-box, + .header-widget-area, + .hidden-print, + .home-top, + .nav-primary, + .nav-secondary, + .post-edit-link, + .sidebar { + display: none !important; + } + + .title-area { + width: 100%; + text-align: center; + } + + .site-title > a { + margin: 0; + text-decoration: none; + text-indent: 0; + } + + .site-inner { + position: relative; + top: -100px; + padding-top: 0; + } + + .author-box { + margin-bottom: 0; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + orphans: 3; + page-break-after: avoid; + page-break-inside: avoid; + widows: 3; + } + + img { + page-break-after: avoid; + page-break-inside: avoid; + } + + blockquote, + pre, + table { + page-break-inside: avoid; + } + + dl, + ol, + ul { + page-break-before: avoid; + } +} diff --git a/assets/scss/print-styles/index.scss b/assets/scss/print-styles/index.scss new file mode 100644 index 0000000..3027dea --- /dev/null +++ b/assets/scss/print-styles/index.scss @@ -0,0 +1 @@ +@import "print-styles"; diff --git a/assets/scss/sidebar/_sidebar.scss b/assets/scss/sidebar/_sidebar.scss new file mode 100644 index 0000000..becd12e --- /dev/null +++ b/assets/scss/sidebar/_sidebar.scss @@ -0,0 +1,16 @@ +.sidebar { + font-size: $sidebar--font-size; + line-height: $line-height--medium; + + @include breakpoint( sm ) { + width: 30%; + } + + .widget { + margin-bottom: 40px; + } + + p { + margin-bottom: 20px; + } +} diff --git a/assets/scss/sidebar/index.scss b/assets/scss/sidebar/index.scss new file mode 100644 index 0000000..0f646fb --- /dev/null +++ b/assets/scss/sidebar/index.scss @@ -0,0 +1,4 @@ +/* # Sidebar +---------------------------------------------------------------------------------------------------- */ + +@import "sidebar"; diff --git a/assets/scss/site-footer/_site-footer.scss b/assets/scss/site-footer/_site-footer.scss new file mode 100644 index 0000000..11a33b4 --- /dev/null +++ b/assets/scss/site-footer/_site-footer.scss @@ -0,0 +1,15 @@ +.site-footer { + border-top: $border; + font-size: $site-footer--font-size; + line-height: $line-height--medium; + text-align: center; + + > .wrap { + margin: 3rem auto; + } + + p { + margin-bottom: 0; + } +} + diff --git a/assets/scss/site-footer/index.scss b/assets/scss/site-footer/index.scss new file mode 100644 index 0000000..b28e0cc --- /dev/null +++ b/assets/scss/site-footer/index.scss @@ -0,0 +1,4 @@ +/* # Site Footer +---------------------------------------------------------------------------------------------------- */ + +@import "site-footer"; diff --git a/assets/scss/site-header/_hero-section.scss b/assets/scss/site-header/_hero-section.scss new file mode 100644 index 0000000..8ddd52e --- /dev/null +++ b/assets/scss/site-header/_hero-section.scss @@ -0,0 +1,43 @@ +/* ## Hero Section +--------------------------------------------- */ + +.hero-section { + position: relative; + padding: 12rem 0 6rem; + color: $hero-section--background-color; + background-position: center; + background-size: cover; + text-align: center; + + @include overlay; + + @include breakpoint(sm) { + padding: 16rem 0 10rem; + } + + .has-nav-secondary & { + + @include breakpoint(sm) { + padding: 21rem 0 10rem; + } + } + + .wrap { + position: relative; + z-index: 1; + } + + h1 { + max-width: map-get($breakpoints, sm); + margin: 0 auto 0.382em; + + @include breakpoint(sm) { + font-size: $hero-section__h1--font-size; + } + } + + p { + max-width: map-get($breakpoints, sm); + margin: 0 auto; + } +} diff --git a/assets/scss/site-header/_site-header.scss b/assets/scss/site-header/_site-header.scss new file mode 100644 index 0000000..e8c3fc4 --- /dev/null +++ b/assets/scss/site-header/_site-header.scss @@ -0,0 +1,25 @@ +.site-header { + position: absolute; + z-index: 9999; + width: 100%; + background-color: $site-header--background-color; + box-shadow: $box-shadow; + + .has-sticky-header & { + position: fixed; + } + + .page-boxed & { + max-width: map_get($breakpoints, md); + } + + > .wrap { + display: flex; + flex-wrap: wrap; + height: 100%; + justify-content: space-between; + align-items: center; + + @include flexfix; + } +} diff --git a/assets/scss/site-header/_title-area.scss b/assets/scss/site-header/_title-area.scss new file mode 100644 index 0000000..c40c32c --- /dev/null +++ b/assets/scss/site-header/_title-area.scss @@ -0,0 +1,43 @@ +/* ## Title Area +--------------------------------------------- */ + +.title-area { + display: flex; + align-items: center; + height: 6.2rem; + + .wp-custom-logo & { + width: 100%; + max-width: 350px; + padding-top: 5px; + padding-bottom: 5px; + + img { + width: auto; + } + } +} + +.site-title { + margin-bottom: 0; + font-size: $site-title--font-size; + font-weight: $font-weight--semibold; + line-height: $line-height--smaller; + + a, + a:focus, + a:hover { + color: $site-title__link--font-color; + text-decoration: none; + } + + .wp-custom-logo & { + + @include screen-reader-text; + } +} + +.site-description { + + @include screen-reader-text; +} diff --git a/assets/scss/site-header/index.scss b/assets/scss/site-header/index.scss new file mode 100644 index 0000000..8d4e57d --- /dev/null +++ b/assets/scss/site-header/index.scss @@ -0,0 +1,6 @@ +/* # Site Header +---------------------------------------------------------------------------------------------------- */ + +@import "site-header"; +@import "title-area"; +@import "hero-section"; diff --git a/assets/scss/site-navigation/_nav-primary.scss b/assets/scss/site-navigation/_nav-primary.scss new file mode 100644 index 0000000..19e7bf2 --- /dev/null +++ b/assets/scss/site-navigation/_nav-primary.scss @@ -0,0 +1,15 @@ +/* ## Primary Navigation +--------------------------------------------- */ + +.nav-primary { + width: 100%; + background-color: $nav-primary--background-color; + + @include breakpoint( sm ) { + position: relative; + top: auto; + left: auto; + width: auto; + background-color: transparent; + } +} diff --git a/assets/scss/site-navigation/_nav-secondary.scss b/assets/scss/site-navigation/_nav-secondary.scss new file mode 100644 index 0000000..2769a96 --- /dev/null +++ b/assets/scss/site-navigation/_nav-secondary.scss @@ -0,0 +1,7 @@ +/* ## Secondary Navigation +--------------------------------------------- */ + +.nav-secondary { + border-top: $border; + background-color: $nav-secondary--background-color; +} diff --git a/assets/scss/site-navigation/_responsive-menu.scss b/assets/scss/site-navigation/_responsive-menu.scss new file mode 100644 index 0000000..6f6e7e2 --- /dev/null +++ b/assets/scss/site-navigation/_responsive-menu.scss @@ -0,0 +1,178 @@ +/* ## Responsive Menu +--------------------------------------------- */ + +.menu { + + .menu-item:focus { + position: static; + } + + .menu-item > a:focus + ul.sub-menu, + .menu-item.sfHover > ul.sub-menu { + left: auto; + opacity: 1; + } +} + +.genesis-responsive-menu { + display: none; + position: relative; + + @include breakpoint(sm) { + display: block; + } + + .genesis-nav-menu { + + .menu-item:hover > .sub-menu, + .menu-item:focus > .sub-menu { + display: none; + } + + .sub-menu { + display: none; + clear: both; + position: static; + z-index: 99; + left: -9999px; + width: 100%; + margin: 0; + padding-left: 15px; + opacity: 1; + + @include breakpoint(sm) { + position: absolute; + width: 180px; + padding-left: 0; + border-top: $border; + opacity: 0; + transition: opacity 0.4s ease-in-out; + } + } + } +} + +.menu-toggle { + display: block; + visibility: visible; + position: relative; + z-index: 1000; + padding: 1.25em 0 1.25em 1.25em; + border-width: 0; + color: $menu-toggle--font-color; + background-color: $menu-toggle--background-color; + line-height: $line-height--smaller; + text-align: center; + + @include breakpoint(sm) { + display: none; + } + + &:focus, + &:hover { + border-width: 0; + color: $menu-toggle--font-color-hover; + background-color: $menu-toggle--background-color; + + span, + span:before, + span:after { + background-color: $link--font-color; + } + } + + span, + span:before, + span:after { + display: block; + position: absolute; + width: 15px; + height: 2px; + background-color: $dark-grey; + content: ""; + transition: background-color $transition; + } + + span { + top: 1px; + bottom: 0; + left: 0; + margin: auto; + + &:before { + top: -4px; + } + + &:after { + bottom: -4px; + } + } + + &.activated { + + span { + background-color: transparent; + + &:before { + top: 0; + transform: rotate(45deg); + } + + &:after { + bottom: 0; + transform: rotate(-45deg); + } + } + } +} + +.sub-menu-toggle { + position: relative; + width: 3.6rem; + height: 3.6rem; + padding: 0; + background: $sub-menu-toggle--background-color; + + @include breakpoint(sm) { + display: none; + } + + &:hover, + &:focus { + background: none; + } + + &:before, + &:after { + display: block; + position: absolute; + width: 0.8rem; + height: 2px; + background-color: $dark-grey; + content: ""; + } + + &:before { + left: 1.2rem; + transform: rotate(45deg); + } + + &:after { + right: 1.2rem; + transform: rotate(-45deg); + } + + &.activated { + + &:before { + left: 1.2rem; + transform: rotate(-45deg); + } + + &:after { + right: 1.2rem; + transform: rotate(45deg); + } + + } +} diff --git a/assets/scss/site-navigation/_site-navigation.scss b/assets/scss/site-navigation/_site-navigation.scss new file mode 100644 index 0000000..1d39ea1 --- /dev/null +++ b/assets/scss/site-navigation/_site-navigation.scss @@ -0,0 +1,142 @@ +.genesis-nav-menu { + clear: both; + width: 100%; + line-height: 1; + + .menu-item { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + position: relative; + + @include breakpoint(sm) { + display: inline-block; + } + + &:focus, + &:hover { + position: relative; + + @include breakpoint(sm) { + + .sub-menu:focus, + .sub-menu:hover { + z-index: 100; + } + } + + > .sub-menu { + display: block; + left: auto; + opacity: 1; + } + } + } + + > .menu-item { + + &:first-of-type { + + > a { + + @include breakpoint(sm) { + padding-left: 0; + } + } + } + } + + > .menu-bold > a { + + @include breakpoint(sm) { + font-weight: $font-weight--bold; + } + } + + > .menu-highlight > a { + + @include breakpoint(sm) { + margin-left: 15px; + padding-right: 20px; + padding-left: 20px; + border-radius: 3px; + color: $menu-highlight__link--font-color; + background-color: $menu-highlight__link--background-color; + font-weight: $font-weight--semibold; + + &:focus, + &:hover { + background-color: $menu-highlight__link--background-color-hover; + } + } + } + + a { + display: block; + padding: 1em 0; + outline-offset: -1px; + color: $genesis-nav-menu--font-color; + font-size: $genesis-nav-menu--font-size; + font-weight: $font-weight--regular; + text-decoration: none; + + @include breakpoint(sm) { + padding: 1.2em 0.8em; + } + } + + a:focus, + a:hover, + .current-menu-item > a, + .sub-menu .current-menu-item > a:focus, + .sub-menu .current-menu-item > a:hover { + color: $genesis-nav-menu--font-color-hover; + text-decoration: none; + } + + .sub-menu { + display: block; + clear: both; + position: static; + z-index: 99; + width: 100%; + margin: 0; + padding-left: 15px; + opacity: 1; + + @include breakpoint(sm) { + position: absolute; + width: 180px; + padding-left: 0; + border-top: $border; + opacity: 0; + transition: opacity $transition; + } + + &:focus-within { + opacity: 1; + } + + a { + position: relative; + background-color: $genesis-nav-menu__sub-menu__link--background-color; + font-size: $genesis-nav-menu__sub-menu__link--font-size; + word-wrap: break-word; + + @include breakpoint(sm) { + width: 180px; + padding: 1em; + border: $border; + border-top: 0; + } + } + + .sub-menu { + + @include breakpoint(sm) { + margin: -46px 0 0 179px; + } + } + } +} diff --git a/assets/scss/site-navigation/index.scss b/assets/scss/site-navigation/index.scss new file mode 100644 index 0000000..f7d9c33 --- /dev/null +++ b/assets/scss/site-navigation/index.scss @@ -0,0 +1,7 @@ +/* # Site Navigation +---------------------------------------------------------------------------------------------------- */ + +@import "site-navigation"; +@import "responsive-menu"; +@import "nav-primary"; +@import "nav-secondary"; diff --git a/assets/scss/skip-links/_skip-links.scss b/assets/scss/skip-links/_skip-links.scss new file mode 100644 index 0000000..5509ef5 --- /dev/null +++ b/assets/scss/skip-links/_skip-links.scss @@ -0,0 +1,21 @@ +.genesis-skip-link { + margin: 0; + + .skip-link-hidden { + display: none; + visibility: hidden; + } + + li { + width: 0; + height: 0; + list-style: none; + } +} + +/* Display outline on focus */ + +:focus { + outline: #ccc solid 1px; + color: $body--font-color; +} diff --git a/assets/scss/skip-links/index.scss b/assets/scss/skip-links/index.scss new file mode 100644 index 0000000..93647aa --- /dev/null +++ b/assets/scss/skip-links/index.scss @@ -0,0 +1,4 @@ +/* # Skip Links +---------------------------------------------------------------------------------------------------- */ + +@import "skip-links"; diff --git a/assets/scss/structure-and-layout/_column-classes.scss b/assets/scss/structure-and-layout/_column-classes.scss new file mode 100644 index 0000000..a13a99d --- /dev/null +++ b/assets/scss/structure-and-layout/_column-classes.scss @@ -0,0 +1,77 @@ +/* ## Column Classes +--------------------------------------------- */ + +@include breakpoint(sm) { + + .one-half, + .one-third, + .one-fourth, + .one-fifth, + .one-sixth, + .two-thirds, + .two-fourths, + .two-fifths, + .two-sixths, + .three-fourths, + .three-fifths, + .three-sixths, + .four-fifths, + .four-sixths, + .five-sixths { + float: left; + margin-left: $margin-left; + } + + .one-half, + .three-sixths, + .two-fourths { + width: $one-half; + } + + .one-third, + .two-sixths { + width: $one-third; + } + + .four-sixths, + .two-thirds { + width: $two-thirds; + } + + .one-fourth { + width: $one-fourth; + } + + .three-fourths { + width: $three-fourths; + } + + .one-fifth { + width: $one-fifth; + } + + .two-fifths { + width: $two-fifths; + } + + .three-fifths { + width: $three-fifths; + } + + .four-fifths { + width: $four-fifths; + } + + .one-sixth { + width: $one-sixth; + } + + .five-sixths { + width: $five-sixths; + } + + .first { + clear: both; + margin-left: 0; + } +} diff --git a/assets/scss/structure-and-layout/_site-container.scss b/assets/scss/structure-and-layout/_site-container.scss new file mode 100644 index 0000000..43145fa --- /dev/null +++ b/assets/scss/structure-and-layout/_site-container.scss @@ -0,0 +1,78 @@ +/* ## Site Container +--------------------------------------------- */ + +.site-container { + background-color: $site-container--background-color; + word-wrap: break-word; + -webkit-animation: fadein 1s; + animation: fadein 1s; + + button:disabled, + button:disabled:hover, + input:disabled, + input:disabled:hover, + input[type="button"]:disabled, + input[type="button"]:disabled:hover, + input[type="reset"]:disabled, + input[type="reset"]:disabled:hover, + input[type="submit"]:disabled, + input[type="submit"]:disabled:hover { + border-width: 0; + color: $disabled--font-color; + background-color: $disabled--background-color; + cursor: not-allowed; + } +} + +@keyframes fadein { + + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@-webkit-keyframes fadein { + + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +.wrap, +.content-sidebar-wrap { + width: 90%; + max-width: map_get($breakpoints, xl); + margin: 0 auto; + + .wrap { + width: 100%; + min-width: 100%; + } +} + +.content-sidebar-wrap { + margin: 6rem auto; + + @include breakpoint(sm) { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + + .sidebar-content & { + flex-direction: row-reverse; + } + + .center-content &, + .full-width-content & { + justify-content: center; + } + } +} diff --git a/assets/scss/structure-and-layout/_site-inner.scss b/assets/scss/structure-and-layout/_site-inner.scss new file mode 100644 index 0000000..729b2e5 --- /dev/null +++ b/assets/scss/structure-and-layout/_site-inner.scss @@ -0,0 +1,18 @@ +/* ## Site Inner +--------------------------------------------- */ + +.site-inner { + clear: both; + margin: 0 auto; +} + +.content { + + @include breakpoint(sm) { + width: 65%; + } + + .full-width-content & { + width: 100%; + } +} diff --git a/assets/scss/structure-and-layout/index.scss b/assets/scss/structure-and-layout/index.scss new file mode 100644 index 0000000..180dbd3 --- /dev/null +++ b/assets/scss/structure-and-layout/index.scss @@ -0,0 +1,6 @@ +/* # Structure and Layout +---------------------------------------------------------------------------------------------------- */ + +@import "site-container"; +@import "site-inner"; +@import "column-classes"; diff --git a/assets/scss/style.scss b/assets/scss/style.scss new file mode 100644 index 0000000..a81048b --- /dev/null +++ b/assets/scss/style.scss @@ -0,0 +1,62 @@ +/* Table of Contents +- HTML5 Reset + - Baseline Normalize + - Box Sizing + - Float Clearing +- Defaults + - Typographical Elements + - Headings + - Objects + - Gallery + - Forms + - Tables + - Screen Reader Text +- Structure and Layout + - Site Container + - Site Inner +- Common Classes + - Avatar + - Genesis + - Search Form + - Titles + - WordPress +- Widgets + - Featured Content +- Plugins + - Genesis eNews Extended + - Genesis Simple FAQ + - Jetpack +- Skip Links +- Site Header + - Title Area +- Site Navigation + - Responsive Menu + - Header Menu + - Footer Menu +- Content Area + - Entry Content + - Entry Meta + - Pagination + - Entry Comments +- Sidebar +- Footer Widgets +- Site Footer +- Print Styles +*/ + +@import "utilities/index"; +@import "html5-reset/index"; +@import "defaults/index"; +@import "structure-and-layout/index"; +@import "common-classes/index"; +@import "widgets/index"; +@import "plugins/index"; +@import "skip-links/index"; +@import "site-header/index"; +@import "site-navigation/index"; +@import "content-area/index"; +@import "sidebar/index"; +@import "front-page/index"; +@import "footer-widgets/index"; +@import "site-footer/index"; +@import "print-styles/index"; diff --git a/assets/scss/utilities/_mixins.scss b/assets/scss/utilities/_mixins.scss new file mode 100644 index 0000000..f59685b --- /dev/null +++ b/assets/scss/utilities/_mixins.scss @@ -0,0 +1,90 @@ +// Media Queries. +@mixin breakpoint( $breakpoint ) { + + @if map-has-key($breakpoints, $breakpoint) { + + @media (min-width: #{ map-get($breakpoints, $breakpoint) }) { + + @content; + } + + } @else if type_of( $breakpoint ) == number and unit( $breakpoint ) == px or unit( $breakpoint ) == em or unit( $breakpoint ) == rem { + + @media (min-width: $breakpoint) { + + @content; + } + + } @else { + + @warn "No value could be retrieved from `#{$breakpoint}`. " + + "Please make sure it is defined in `$breakpoints` map, or it is a valid number with supported unit of px, em or rem."; + } +} + +// Clearfix. +@mixin clearfix { + clear: both; + + &:before, + &:after { + display: block; + clear: both; + content: ""; + } +} + +// Flexfix. +@mixin flexfix { + + &:before, + &:after { + position: absolute; + } +} + +// Transitions. +@mixin transition { + -webkit-transition: all $transition; + -moz-transition: all $transition; + -o-transition: all $transition; + transition: all $transition; +} + +// Overlay. +@mixin overlay { + position: relative; + + &:before { + display: block; + position: absolute; + z-index: 1; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: $overlay; + content: ""; + pointer-events: none; + } +} + +// Center. +@mixin center { + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; +} + +// Screen reader text. +@mixin screen-reader-text { + overflow: hidden; + clip: rect(0, 0, 0, 0); + position: absolute !important; + width: 1px; + height: 1px; + border: 0; + word-wrap: normal !important; +} diff --git a/assets/scss/utilities/_variables.scss b/assets/scss/utilities/_variables.scss new file mode 100644 index 0000000..8d0384c --- /dev/null +++ b/assets/scss/utilities/_variables.scss @@ -0,0 +1,171 @@ +// Breakpoints. +$breakpoints: ( + xs: 512px, + sm: 896px, + md: 1024px, + lg: 1152px, + xl: 1280px +); + +// Base Colors. +$black: #000; +$dark-grey: #333; +$mid-grey: #777; +$medium-grey: #999; +$light-grey: #ddd; +$blue: #0073e5; +$lighter-grey: #eee; +$lightest-grey: #f5f5f5; +$white: #fff; +$overlay: rgba($dark-grey, 0.2); + +// Base Fonts. +$base-font: "Source Sans Pro", sans-serif; + +// Transitions. +$transition: 0.2s ease-in-out; + +// Border styles. +$border-width: 1px; +$border-style: solid; +$border-color: $lighter-grey; +$border: $border-width $border-style $border-color; + +// Box Shadow. +$box-shadow-blur-radius: 20px; +$box-shadow-opacity: 0.075; +$box-shadow: 0 0 $box-shadow-blur-radius rgba($dark-grey, $box-shadow-opacity); + +// Genesis Column Classes. +$margin-left: 2.564102564102564%; +$one-half: 48.71794871794871%; +$one-third: 31.62393162393162%; +$one-fifth: 17.94871794871794%; +$one-fourth: 23.07692307692307%; +$one-sixth: 14.52991452991453%; +$one-seventh: 12.08791208791208%; +$one-eighth: 10.25641025641025%; +$one-ninth: 8.831908831908832%; +$two-thirds: 65.81196581196582%; +$two-fourths: 48.71794871794871%; +$two-fifths: 38.46153846153846%; +$two-sixths: 31.62393162393162%; +$three-fourths: 74.35897435897436%; +$three-fifths: 58.97435897435897%; +$three-sixths: 48.71794871794871%; +$four-fifths: 79.48717948717948%; +$four-sixths: 65.81196581196582%; +$five-sixths: 82.90598290598291%; + +// Font sizes. +$body--font-size: 1.8rem; +$h1--font-size: 3rem; +$h2--font-size: 2.7rem; +$h3--font-size: 2.4rem; +$h4--font-size: 2rem; +$h5--font-size: 1.8rem; +$h6--font-size: 1.6rem; +$button--font-size: 1.6rem; +$hero-section__h1--font-size: $h1--font-size * 1.5; +$archive-description__entry-title--font-size: 2rem; +$author-box-title--font-size: $archive-description__entry-title--font-size; +$breadcrumb--font-size: 1.6rem; +$entry-title--font-size: 3rem; +$featured-content__entry-title--font-size: 1.6rem; +$enews-widget__input--font-size: 1.6rem; +$site-title--font-size: 2rem; +$genesis-nav-menu--font-size: 1.5rem; +$genesis-nav-menu__sub-menu__link--font-size: 1.4rem; +$sidebar--font-size: 1.6rem; +$entry-content__caption--font-size: 1.4rem; +$entry-meta--font-size: 1.6rem; +$comments--font-size: 1.8rem; +$footer-widgets--font-size: 1.8rem; +$site-footer--font-size: 1.5rem; +$form--font-size: 1.8rem; +$widget-title--font-size: 1.8rem; +$archive-pagination--font-size: 1.6rem; +$blockquote__before--font-size: 3rem; +$after-entry__breadcrumb--font-size: 1.6rem; +$screen-reader--font-size-focus: 1em; + +// Font families. +$body--font-family: $base-font; +$heading--font-family: $base-font; + +// Font weights. +$font-weight--regular: 400; +$font-weight--semibold: 600; +$font-weight--bold: 700; + +// Line heights. +$line-height--big: 2; +$line-height--large: 1.75; +$line-height--normal: 1.625; +$line-height--medium: 1.5; +$line-height--medium-small: 1.4; +$line-height--small: 1.2; +$line-height--smaller: 1; + +// Font colors. +$body--font-color: $dark-grey; +$link--font-color: $blue; +$link--font-color-hover: $dark-grey; +$button--font-color: $white; +$button--font-color-hover: $white; +$entry-title__link--font-color: $dark-grey; +$entry-title__link--font-color-hover: $blue; +$site-title__link--font-color: $dark-grey; +$genesis-nav-menu--font-color: $dark-grey; +$genesis-nav-menu--font-color-hover: $blue; +$menu-toggle--font-color: $dark-grey; +$menu-toggle--font-color-hover: $blue; +$sub-menu-toggle--font-color: $dark-grey; +$sub-menu-toggle--font-color-hover: $blue; +$menu-highlight__link--font-color: $white; +$sidebar__widget-title--font-color: $dark-grey; +$form--font-color: $dark-grey; +$archive-pagination--font-color: $dark-grey; +$archive-pagination--font-color-hover: $white; +$gs-faq__question--font-color: $dark-grey; +$gs-faq__question--font-color-hover: $blue; +$disabled--font-color: $mid-grey; + +// Background colors. +$body--background-color: $white; +$page-boxed--background-color: $lightest-grey; +$site-container--background-color: $white; +$site-header--background-color: $white; +$mark--background-color: $light-grey; +$button--background-color: $dark-grey; +$button--background-color-hover: $blue; +$genesis-nav-menu__sub-menu__link--background-color: $white; +$nav-primary--background-color: $white; +$nav-secondary--background-color: $white; +$menu-toggle--background-color: transparent; +$sub-menu-toggle--background-color: transparent; +$hero-section--background-color: $white; +$footer-widgets--background-color: $white; +$site-footer--background-color: $white; +$menu-highlight__link--background-color: $dark-grey; +$menu-highlight__link--background-color-hover: $blue; +$forms__background-color: $white; +$sticky--background-color: $lightest-grey; +$author-box--background-color: $lightest-grey; +$code--background-color: $lightest-grey; +$archive-pagination--background-color: $lightest-grey; +$archive-pagination--background-color-hover: $dark-grey; +$enews__sidebar--background-color: $lightest-grey; +$disabled--background-color: $lighter-grey; +$gs-faq__question--background-color: transparent; +$gs-faq__question--background-color-hover: $gs-faq__question--background-color; + +// WooCommerce. +$shop-page-navigation-link--font-size: 1.6rem; +$cart-table-td--font-size: 1.8rem; +$form-button--font-size: 1.6rem; +$form-quantity-qty--font-size: 2rem; +$account-page-address-title-h3--font-size: 2.6rem; +$breadcrumb-breadcrumb--font-size: 1.8rem; +$widgets-price-filter-price-slider-amount-button--font-size: 1.6rem; +$widgets-recent-reviews-reviewer--font-size: 1.2rem; diff --git a/assets/scss/utilities/index.scss b/assets/scss/utilities/index.scss new file mode 100644 index 0000000..8cc02d6 --- /dev/null +++ b/assets/scss/utilities/index.scss @@ -0,0 +1,2 @@ +@import "variables"; +@import "mixins"; diff --git a/assets/scss/widgets/_featured-content.scss b/assets/scss/widgets/_featured-content.scss new file mode 100644 index 0000000..553b9e6 --- /dev/null +++ b/assets/scss/widgets/_featured-content.scss @@ -0,0 +1,26 @@ +/* ## Featured Content +--------------------------------------------- */ + +.featured-content { + + .entry { + margin-bottom: 20px; + border-bottom: $border; + + &:last-of-type { + margin-bottom: 0; + border-bottom: none; + } + } + + .entry-image { + width: 75px; + height: 75px; + } + + .entry-title { + margin-top: 10px; + margin-bottom: 5px; + font-size: $featured-content__entry-title--font-size; + } +} diff --git a/assets/scss/widgets/_widgets.scss b/assets/scss/widgets/_widgets.scss new file mode 100644 index 0000000..f83a559 --- /dev/null +++ b/assets/scss/widgets/_widgets.scss @@ -0,0 +1,44 @@ +.widget { + + .sidebar & { + margin-bottom: 40px; + + p:last-child, + ul > li:last-of-type { + margin-bottom: 0; + } + + ul > li { + margin-bottom: 10px; + + &:last-of-type { + padding-bottom: 0; + } + } + + ol > li { + padding-left: 20px; + text-indent: -20px; + list-style-position: inside; + list-style-type: decimal; + } + + li li { + margin: 0 0 0 30px; + padding: 0; + border: 0; + } + } +} + +.widget_calendar { + + table { + width: 100%; + } + + td, + th { + text-align: center; + } +} diff --git a/assets/scss/widgets/index.scss b/assets/scss/widgets/index.scss new file mode 100644 index 0000000..d3bff84 --- /dev/null +++ b/assets/scss/widgets/index.scss @@ -0,0 +1,5 @@ +/* # Widgets +---------------------------------------------------------------------------------------------------- */ + +@import "widgets"; +@import "featured-content"; diff --git a/assets/scss/woocommerce/_account-page.scss b/assets/scss/woocommerce/_account-page.scss new file mode 100644 index 0000000..031b97c --- /dev/null +++ b/assets/scss/woocommerce/_account-page.scss @@ -0,0 +1,83 @@ +/* # WooCommerce Account Page +---------------------------------------------------------------------------------------------------- */ + +.woocommerce-account { + + .woocommerce-Address-title h3 { + font-size: 26px; + font-size: 2.6rem; + } + + .woocommerce-Address { + margin-bottom: 20px; + } + + table.order_details th.product-total { + min-width: 110px; + } + + .woocommerce-MyAccount-navigation ul { + text-align: center; + + li { + display: inline-block; + margin: 0 10px; + } + } + + .woocommerce-MyAccount-content, + .woocommerce-MyAccount-navigation { + width: 100%; + margin-right: 0; + } +} + +.woocommerce-MyAccount-navigation { + margin-bottom: 40px; + padding: 20px; + border: 1px solid #eee; + + ul { + margin-bottom: 0; + margin-left: 0; + + li { + margin-bottom: 15px; + line-height: 1.2; + list-style-type: none; + + &:last-child { + margin-bottom: 0; + } + + &.is-active > a { + color: #333; + font-weight: 700; + } + } + } +} + +.content-sidebar.woocommerce-account, +.sidebar-content.woocommerce-account { + + .woocommerce-MyAccount-navigation { + + ul { + text-align: center; + } + + li { + display: inline-block; + margin: 0 10px; + } + } + + .woocommerce-MyAccount-content { + width: 100%; + } +} + +.woocommerce table.my_account_orders .button { + margin: 5px; +} diff --git a/assets/scss/woocommerce/_breadcrumb.scss b/assets/scss/woocommerce/_breadcrumb.scss new file mode 100644 index 0000000..7ecf631 --- /dev/null +++ b/assets/scss/woocommerce/_breadcrumb.scss @@ -0,0 +1,22 @@ +/* # WooCommerce Breadcrumb +---------------------------------------------------------------------------------------------------- */ + +.woocommerce .woocommerce-breadcrumb { + margin-bottom: 40px; + font-size: 18px; + font-size: 1.8rem; + + &, + a { + color: #000; + } + + a { + text-decoration: none; + + &:focus, + &:hover { + color: #0073e5; + } + } +} diff --git a/assets/scss/woocommerce/_cart-page.scss b/assets/scss/woocommerce/_cart-page.scss new file mode 100644 index 0000000..63acec6 --- /dev/null +++ b/assets/scss/woocommerce/_cart-page.scss @@ -0,0 +1,77 @@ +/* # WooCommerce Cart Page +---------------------------------------------------------------------------------------------------- */ + +.woocommerce table.shop_table { + + &, + td { + border-color: #eee; + border-radius: 0; + line-height: 1.75; + word-break: normal; + } + + .order-number { + min-width: 75px; + } + + td.actions { + padding-top: 15px; + } +} + +.woocommerce-cart table.cart { + line-height: 1.75; + + td { + padding: 10px 12px; + font-size: 18px; + font-size: 1.8rem; + + &.actions .coupon .input-text { + width: 100% !important; + margin-bottom: 10px; + font-size: 18px; + font-size: 1.8rem; + + @include breakpoint( xs ) { + margin-bottom: 0; + } + } + } + + .product-thumbnail { + min-width: 56px; + } + + th { + + &.product-name { + + min-width: 140px; + } + + &.product-price, + &.product-quantity, + &.product-subtotal { + min-width: 110px; + } + } + + img { + vertical-align: middle; + } +} + +.woocommerce-cart td.product-name dl.variation dd { + margin-left: 20px; +} + +.woocommerce-checkout-review-order-table th.product-total { + min-width: 110px; +} + +.woocommerce-checkout table.cart img, +#add_payment_method table.cart img { + vertical-align: middle; +} diff --git a/assets/scss/woocommerce/_checkout.scss b/assets/scss/woocommerce/_checkout.scss new file mode 100644 index 0000000..4af410f --- /dev/null +++ b/assets/scss/woocommerce/_checkout.scss @@ -0,0 +1,22 @@ +/* # WooCommerce Checkout +---------------------------------------------------------------------------------------------------- */ + +.woocommerce-cart, +.woocommerce-checkout, +#add_payment_method { + + #payment { + + ul.payment_methods li { + list-style-type: none; + } + + div.form-row { + margin-bottom: 0; + } + } + + table.cart td.actions .coupon input.input-text { + width: auto; + } +} diff --git a/assets/scss/woocommerce/_disabled-buttons.scss b/assets/scss/woocommerce/_disabled-buttons.scss new file mode 100644 index 0000000..641c3c5 --- /dev/null +++ b/assets/scss/woocommerce/_disabled-buttons.scss @@ -0,0 +1,33 @@ +/* # WooCommerce Disabled Buttons +---------------------------------------------------------------------------------------------------- */ + +.woocommerce { + + a.button, + button.button, + input.button, + #respond input#submit { + + &.disabled, + &:disabled, + &:disabled[disabled] { + padding: 16px 24px; + color: #fff; + background-color: #000; + } + + &.alt { + + &.disabled, + &.disabled:hover, + &:disabled, + &:disabled:hover, + &[disabled]:disabled, + &[disabled]:disabled:hover { + padding: 16px 24px; + color: #fff; + background-color: #000; + } + } + } +} diff --git a/assets/scss/woocommerce/_forms.scss b/assets/scss/woocommerce/_forms.scss new file mode 100644 index 0000000..5f041b8 --- /dev/null +++ b/assets/scss/woocommerce/_forms.scss @@ -0,0 +1,127 @@ +/* # WooCommerce Forms +---------------------------------------------------------------------------------------------------- */ + +.woocommerce { + + a.button, + a.button.alt, + button.button, + button.button.alt, + input.button, + input.button.alt, + input.button[type="submit"], + #respond input#submit, + #respond input#submit.alt { + width: auto; + padding: 15px 20px; + border: 0; + border-radius: 0; + color: #fff; + background-color: #333; + font-size: 16px; + font-size: 1.6rem; + font-weight: 600; + text-align: center; + white-space: normal; + text-decoration: none; + cursor: pointer; + + &:hover, + &:focus { + color: #fff; + background-color: #0073e5; + } + } + + #reviews #comment { + height: 150px; + } + + .quantity .qty { + width: 70px; + margin-right: 5px; + padding: 12px 5px; + font-size: 20px; + font-size: 2rem; + line-height: 1.5; + } + + form { + + .form-row input.input-text, + .form-row textarea { + padding: 8px 20px; + line-height: 1.5; + } + + &.checkout_coupon, + &.login, + &.register, + .form-row .select2-container, + .form-row.woocommerce-validated input.input-text, + .form-row.woocommerce-validated select, + .form-row.woocommerce-validated .select2-container { + border-color: #eee; + border-radius: 0; + } + } + + .coupon { + line-height: 1; + + .input-text { + height: 48px; + } + } + + input.button, + input.button[type="submit"] { + width: 100% !important; + } +} + +@include breakpoint( xs ) { + + .woocommerce form .form-row-first, + .woocommerce-page form .form-row-first, + .woocommerce #reviews #comments .star-rating { + float: left; + width: 47%; + } + + .woocommerce form .form-row-last, + .woocommerce-page form .form-row-last { + float: right; + width: 47%; + } + + .woocommerce input.button, + .woocommerce input.button[type="submit"], + .woocommerce-cart table.cart td.actions .coupon .input-text { + width: auto !important; + } +} + +.woocommerce-cart table.cart, +.woocommerce-checkout table.cart, +#add_payment_method table.cart { + + td.actions .coupon .input-text { + width: 150px; + padding: 5px 20px; + border-color: #eee; + } + + input { + vertical-align: top; + } +} + +.woocommerce form .form-row-first, +.woocommerce form .form-row-last, +.woocommerce #reviews #comments .star-rating, +.woocommerce-page form .form-row-first, +.woocommerce-page form .form-row-last { + float: none; + width: 100%; +} diff --git a/assets/scss/woocommerce/_globals.scss b/assets/scss/woocommerce/_globals.scss new file mode 100644 index 0000000..3b60bda --- /dev/null +++ b/assets/scss/woocommerce/_globals.scss @@ -0,0 +1,48 @@ +/* # WooCommerce Globals +---------------------------------------------------------------------------------------------------- */ + +.woocommerce { + + .entry.product { + padding: 0; + } + + abbr.required, + ins { + text-decoration: none; + } + + span.onsale { + min-height: auto; + border-radius: 0; + background-color: #0073e5; + line-height: 1.75; + } + + fieldset { + margin-bottom: 20px; + } + + .products .star-rating { + padding: 10px; + } + + p.stars { + + a, + a:focus, + a:hover { + outline: 0; + } + } + + .woocommerce-LoopProduct-link { + display: block; + } +} + +.woocommerce.full-width-content .content, +.woocommerce-page.full-width-content .content { + width: 100%; + max-width: map_get($breakpoints, lg); +} diff --git a/assets/scss/woocommerce/_misc.scss b/assets/scss/woocommerce/_misc.scss new file mode 100644 index 0000000..abe44bb --- /dev/null +++ b/assets/scss/woocommerce/_misc.scss @@ -0,0 +1,29 @@ +/* # WooCommerce Misc +---------------------------------------------------------------------------------------------------- */ + +.woocommerce-error, +.woocommerce-info, +.woocommerce-message { + border-top-color: #0073e5; + background-color: #f5f5f5; + + &:before, + &:before, + &:before { + color: #0073e5; + } +} + +div.woocommerce-info.wc-memberships-restriction-message.wc-memberships-restricted-content-message { + width: 48%; +} + +.woocommerce-message .button.wc-forward { + width: 100%; + margin-bottom: 20px; + + @include breakpoint( xs ) { + width: auto; + margin-bottom: 0; + } +} diff --git a/assets/scss/woocommerce/_payment.scss b/assets/scss/woocommerce/_payment.scss new file mode 100644 index 0000000..ca25c5e --- /dev/null +++ b/assets/scss/woocommerce/_payment.scss @@ -0,0 +1,22 @@ +/* # WooCommerce Payment +---------------------------------------------------------------------------------------------------- */ + +.woocommerce-cart #payment, +.woocommerce-checkout #payment, +#add_payment_method #payment { + padding: 30px; + border-radius: 0; + background-color: #f5f5f5; + + div.payment_box { + background-color: #eee; + } + + div.payment_box:before { + display: none; + } + + ul.payment_methods { + border-color: #eee; + } +} diff --git a/assets/scss/woocommerce/_product-gallery.scss b/assets/scss/woocommerce/_product-gallery.scss new file mode 100644 index 0000000..14ebb86 --- /dev/null +++ b/assets/scss/woocommerce/_product-gallery.scss @@ -0,0 +1,24 @@ +/* # WooCommerce Product Gallery +---------------------------------------------------------------------------------------------------- */ + +.woocommerce { + + .woocommerce-product-gallery__wrapper { + margin: 0; + } + + .woocommerce-product-gallery__trigger { + border-width: 0; + } + + .woocommerce-product-gallery { + overflow: hidden; + + .flex-control-nav { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + } +} diff --git a/assets/scss/woocommerce/_product-tabs.scss b/assets/scss/woocommerce/_product-tabs.scss new file mode 100644 index 0000000..f0affd0 --- /dev/null +++ b/assets/scss/woocommerce/_product-tabs.scss @@ -0,0 +1,99 @@ +/* # WooCommerce Product Tabs +---------------------------------------------------------------------------------------------------- */ + +.woocommerce div.product .woocommerce-tabs ul.tabs { + padding: 0; + + &:before, + li { + border-color: #eee; + } + + li { + display: block; + margin: 0; + padding: 0; + border: 1px solid #eee; + border-bottom: 0; + border-radius: 0; + background-color: #fff; + + &:after, + &:before { + display: none; + } + + &:last-child { + border-bottom: 1px solid #eee; + } + + &.active { + border-bottom-color: #eee; + } + + a { + display: block; + padding: 0.5em 1em; + color: #000; + + &:focus, + &:hover { + color: #0073e5; + } + } + + &.active a:after { + display: block; + float: right; + font-family: dashicons; + content: "\f147"; + } + } +} + + +@include breakpoint( sm ) { + + .full-width-content.woocommerce div.product .woocommerce-tabs ul.tabs { + padding: 0 0 0 1em; + } + + .full-width-content.woocommerce div.product .woocommerce-tabs ul.tabs li { + display: inline-block; + margin: 0 -5px; + background-color: #f5f5f5; + } + + .full-width-content.woocommerce div.product .woocommerce-tabs ul.tabs li.active { + border-bottom: 1px solid #fff; + background-color: #fff; + } + + .full-width-content.woocommerce div.product .woocommerce-tabs ul.tabs li.active a:after { + display: none; + } + +} + +@include breakpoint(map_get($breakpoints,lg)) { + + .woocommerce div.product .woocommerce-tabs ul.tabs { + padding: 0 0 0 1em; + } + + .woocommerce div.product .woocommerce-tabs ul.tabs li { + display: inline-block; + margin: 0 -5px; + background-color: #f5f5f5; + } + + .woocommerce div.product .woocommerce-tabs ul.tabs li.active { + border-bottom: 1px solid #fff; + background-color: #fff; + } + + .woocommerce div.product .woocommerce-tabs ul.tabs li.active a:after { + display: none; + } + +} diff --git a/assets/scss/woocommerce/_product.scss b/assets/scss/woocommerce/_product.scss new file mode 100644 index 0000000..02cf52a --- /dev/null +++ b/assets/scss/woocommerce/_product.scss @@ -0,0 +1,40 @@ +/* # WooCommerce Product +---------------------------------------------------------------------------------------------------- */ + +.woocommerce { + + div.product { + + p.price, + span.price { + color: #0073e5; + line-height: 1.5; + } + + form.cart { + + .button { + line-height: 1.5; + } + + .variations { + table-layout: fixed; + } + } + } + + .woocommerce-variation-price { + margin-bottom: 20px; + } +} + +@include breakpoint( xs ) { + + .woocommerce ul.products li.product .button, + .woocommerce .woocommerce-ordering, + .woocommerce-page ul.products li.product .button, + .woocommerce-page .woocommerce-ordering { + width: auto; + margin-right: auto; + } +} diff --git a/assets/scss/woocommerce/_reviews.scss b/assets/scss/woocommerce/_reviews.scss new file mode 100644 index 0000000..dd30da8 --- /dev/null +++ b/assets/scss/woocommerce/_reviews.scss @@ -0,0 +1,27 @@ +/* # WooCommerce Reviews +---------------------------------------------------------------------------------------------------- */ + +.woocommerce { + + #reviews #comments ol.commentlist li { + + img.avatar { + position: relative; + width: 60px; + margin: 0 16px 24px 0; + padding: 0; + border: 0; + background: transparent; + } + + .comment-text { + margin-left: 80px; + border-color: #eee; + border-radius: 0; + } + } + + .entry-content #reviews ol > li { + list-style-type: none; + } +} diff --git a/assets/scss/woocommerce/_shop-page.scss b/assets/scss/woocommerce/_shop-page.scss new file mode 100644 index 0000000..208462c --- /dev/null +++ b/assets/scss/woocommerce/_shop-page.scss @@ -0,0 +1,84 @@ +/* # WooCommerce Shop Page +---------------------------------------------------------------------------------------------------- */ + +.woocommerce { + + .content .entry { + border-bottom: 0; + } + + a.added_to_cart { + line-height: 1; + } + + a.button.loading:after, + button.button.loading:after, + input.button.loading:after, + #respond input#submit.loading:after { + top: 1em; + } + + ul.products li.product { + + h3, + .price .from { + color: #000; + } + + h3:hover, + .price { + color: #0073e5; + } + + /* MS Edge Bug Fix */ + a { + -webkit-transition: color 0.1s ease-in-out, background 0.1s ease-in-out; + -ms-transition: color 0.1s ease-in-out, background 0.1s ease-in-out; + transition: color 0.1s ease-in-out, background 0.1s ease-in-out; + } + } + + nav.woocommerce-pagination { + clear: both; + margin: 40px 0; + + ul, + ul li { + border: none; + } + + ul li { + margin-right: 2px; + margin-left: 2px; + + a, + span { + display: inline-block; + padding: 8px 12px; + color: #333; + background-color: #f5f5f5; + font-size: 16px; + font-size: 1.6rem; + font-weight: 600; + line-height: 1.625; + text-decoration: none; + cursor: pointer; + } + + a:focus, + a:hover, + span.current { + color: #fff; + background-color: #333; + } + } + } +} + +.woocommerce ul.products li.product .button, +.woocommerce .woocommerce-ordering, +.woocommerce-page ul.products li.product .button, +.woocommerce-page .woocommerce-ordering { + width: 100%; + margin-right: 0; +} diff --git a/assets/scss/woocommerce/_widgets.scss b/assets/scss/woocommerce/_widgets.scss new file mode 100644 index 0000000..64da35f --- /dev/null +++ b/assets/scss/woocommerce/_widgets.scss @@ -0,0 +1,116 @@ +/* # WooCommerce Widgets +---------------------------------------------------------------------------------------------------- */ + +/* Woo Search +-------------------------------------------------- */ + +.woocommerce-product-search { + overflow: hidden; + width: 100%; + + input[type="submit"] { + clip: rect(0, 0, 0, 0); + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + border: 0; + } +} + +/* Woo Shopping Cart +-------------------------------------------------- */ + +.woocommerce .widget_shopping_cart, +.woocommerce.widget_shopping_cart { + + ul.cart_list li { + padding-top: 15px; + } + + .cart_list li a.remove { + top: 15px; + } + + .total { + border-top: 1px solid #eee; + } + + .buttons a { + margin-bottom: 5px; + } + + .cart_list li.empty { + padding-left: 0; + } +} + +/* Woo Product Lists +-------------------------------------------------- */ + +.woocommerce ul.cart_list li img, +.woocommerce ul.product_list_widget li img { + width: 60px; +} + +.sidebar ul.product_list_widget li { + margin-bottom: 15px; + padding: 15px 0 0; + line-height: 1.4; + + &:last-child { + margin-bottom: 0; + padding-bottom: 15px; + } +} + +/* Woo Filter +-------------------------------------------------- */ + +.woocommerce .widget_price_filter, +.woocommerce.widget_price_filter { + + .price_slider_wrapper .ui-widget-content { + background-color: #eee; + } + + .ui-slider .ui-slider-range { + background-color: #0073e5; + } + + .ui-slider .ui-slider-handle { + top: -0.28em; + } + + .price_slider_amount .button { + font-size: 16px; + font-size: 1.6rem; + } +} + +.woocommerce { + + .widget_layered_nav ul li.chosen a:before, + .widget_layered_nav_filters ul li a:before, + .widget_rating_filter ul li.chosen a:before { + color: #0073e5; + } +} + +/* Woo Active Filters +-------------------------------------------------- */ + +.woocommerce.widget_layered_nav_filters ul li { + margin: 0 20px 20px 0; +} + +/* Woo Recent Reviews +-------------------------------------------------- */ + +.woocommerce.widget_recent_reviews .reviewer { + font-size: 12px; + font-size: 1.2rem; + letter-spacing: 1px; + text-transform: uppercase; +} diff --git a/assets/scss/woocommerce/index.scss b/assets/scss/woocommerce/index.scss new file mode 100644 index 0000000..91f75ad --- /dev/null +++ b/assets/scss/woocommerce/index.scss @@ -0,0 +1,19 @@ +/* Genesis Sample WooCommerce +Loaded on WooCommerce pages */ + +@import "../utilities/_variables.scss"; +@import "../utilities/_mixins.scss"; +@import "globals"; +@import "shop-page"; +@import "product"; +@import "product-tabs"; +@import "checkout"; +@import "cart-page"; +@import "payment"; +@import "forms"; +@import "disabled-buttons"; +@import "account-page"; +@import "breadcrumb"; +@import "reviews"; +@import "misc"; +@import "widgets"; diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..43ce71d --- /dev/null +++ b/composer.json @@ -0,0 +1,49 @@ +{ + "name": "seothemes/genesis-starter-theme", + "type": "wordpress-theme", + "description": + "A starter theme for the Genesis Framework with modern build tools.", + "keywords": ["WordPress", "wordpress-theme-development", "genesis-framework"], + "license": "GPL-2.0", + "authors": [ + { + "name": "SEO Themes", + "homepage": "https://seothemes.com", + "role": "Developer" + } + ], + "support": { + "issues": "https://github.com/seothemes/genesis-starter/issues", + "source": "https://github.com/seothemes/genesis-starter" + }, + "require": { + "seothemes/child-theme-library": "dev-master", + "mnsami/composer-custom-directory-installer": "1.1.*" + }, + "require-dev": {}, + "suggest": {}, + "config": { + "sort-order": true + }, + "minimum-stability": "dev", + "prefer-stable": true, + "extra":{ + "installer-paths":{ + "./lib/": ["seothemes/child-theme-library"] + } + }, + "scripts": { + "post-create-project-cmd": [ + "yarn install" + ], + "post-install-cmd": [ + "yarn install" + ], + "post-update-cmd": [ + "yarn install" + ], + "stylelint": [ + "stylelint './assets/scss/**/*.scss' --fix" + ] + } +} diff --git a/config/config.php b/config/config.php new file mode 100644 index 0000000..88dfc64 --- /dev/null +++ b/config/config.php @@ -0,0 +1,689 @@ + [ + '/lib/functions', + '/lib/structure', + '/lib/shortcodes', + '/lib/widgets', + '/lib/admin', + '/lib/css', + '/lib/js', + ], + + /* + |-------------------------------------------------------------------------- + | Colors + |-------------------------------------------------------------------------- + | + | Custom color config to be consumed by the Child Theme Library's logic + | for the Customizer. Each color needs a name, value and an optional + | array of CSS rules which are output on the frontend of the site. + | + */ + 'colors' => [ + 'background' => [ + 'value' => 'rgba(255,255,255,1)', + 'css' => [ + 'rule' => [ + 'selectors' => [ + 'body', + ], + 'properties' => [ + 'background-color', + ], + ], + ], + ], + 'link' => [ + 'value' => 'rgba(0,115,229,1)', + 'css' => [ + 'rule' => [ + 'selectors' => [ + 'a', + '.entry-title a:focus', + '.entry-title a:hover', + '.genesis-nav-menu a:focus', + '.genesis-nav-menu a:hover', + '.genesis-nav-menu .current-menu-item > a', + '.genesis-nav-menu .sub-menu .current-menu-item > a:focus', + '.genesis-nav-menu .sub-menu .current-menu-item > a:hover', + '.menu-toggle:focus', + '.menu-toggle:hover', + '.sub-menu-toggle:focus', + '.sub-menu-toggle:hover', + ], + 'properties' => [ + 'color', + ], + ], + ], + ], + 'accent' => [ + 'value' => '#0073e5', + 'css' => [ + 'rule' => [ + 'selectors' => [ + 'button:focus', + 'button:hover', + 'input[type="button"]:focus', + 'input[type="button"]:hover', + 'input[type="reset"]:focus', + 'input[type="reset"]:hover', + 'input[type="submit"]:focus', + 'input[type="submit"]:hover', + 'input[type="reset"]:focus', + 'input[type="reset"]:hover', + 'input[type="submit"]:focus', + 'input[type="submit"]:hover', + '.button:focus', + '.button:hover', + '.genesis-nav-menu > .menu-highlight > a:hover', + '.genesis-nav-menu > .menu-highlight > a:focus', + '.genesis-nav-menu > .menu-highlight.current-menu-item > a', + ], + 'properties' => [ + 'background-color', + ], + ], + ], + ], + ], + + /* + |-------------------------------------------------------------------------- + | Default Headers + |-------------------------------------------------------------------------- + | + | Defines the default header settings to be registered in the Customizer + | Header Media section. This theme includes an example hero.jpg image + | located in the theme's ./assets/images/ directory to be replaced. + | + */ + 'default-headers' => [ + 'child' => [ + 'url' => '%2$s/assets/images/hero.jpg', + 'thumbnail_url' => '%2$s/assets/images/hero.jpg', + 'description' => __( 'Hero Image', 'child-theme-library' ), + ], + ], + + /* + |-------------------------------------------------------------------------- + | Demo Import + |-------------------------------------------------------------------------- + | + | These settings are passed to the One Click Demo Import plugin to tell + | it where to look for the theme's sample content files - sample.xml, + | widgets.wie and customizer.dat which are in the root by default. + | + */ + 'demo-import' => [ + 'local_import_file' => CHILD_THEME_DIR . '/sample.xml', + 'local_import_widget_file' => CHILD_THEME_DIR . '/widgets.wie', + 'local_import_customizer_file' => CHILD_THEME_DIR . '/customizer.dat', + 'import_file_name' => 'Demo Import', + 'categories' => false, + 'local_import_redux' => false, + 'import_preview_image_url' => false, + 'import_notice' => false, + ], + + /* + |-------------------------------------------------------------------------- + | Genesis Settings + |-------------------------------------------------------------------------- + | + | Controls the Genesis default settings. The commented out settings below + | are the default settings currently in Genesis. To override a setting, + | uncomment the setting's line and change the value to your liking. + | + */ + 'genesis-settings' => [ + // 'update' => 1, + // 'update_email' => 0, + // 'update_email_address' => '', + // 'blog_title' => 'text', + // 'style_selection' => '', + // 'site_layout' => genesis_get_default_layout(), + // 'superfish' => 0, + // 'nav_extras' => '', + // 'nav_extras_twitter_id' => '', + // 'nav_extras_twitter_text' => __( 'Follow me on Twitter', 'genesis' ), + // 'feed_uri' => '', + // 'redirect_feed' => 0, + // 'comments_feed_uri' => '', + // 'redirect_comments_feed' => 0, + // 'adsense_id' => '', + // 'comments_pages' => 0, + // 'comments_posts' => 1, + // 'trackbacks_pages' => 0, + // 'trackbacks_posts' => 1, + // 'breadcrumb_home' => 0, + // 'breadcrumb_front_page' => 0, + // 'breadcrumb_posts_page' => 0, + // 'breadcrumb_single' => 0, + // 'breadcrumb_page' => 0, + // 'breadcrumb_archive' => 0, + // 'breadcrumb_404' => 0, + // 'breadcrumb_attachment' => 0, + 'content_archive' => 'excerpt', + 'content_archive_thumbnail' => 1, + 'image_size' => 'large', + 'image_alignment' => 'alignnone', + // 'posts_nav' => 'numeric', + // 'blog_cat' => '', + // 'blog_cat_exclude' => '', + // 'blog_cat_num' => 10, + // 'header_scripts' => '', + // 'footer_scripts' => '', + // 'theme_version' => PARENT_THEME_VERSION, + // 'db_version' => PARENT_DB_VERSION, + // 'first_version' => genesis_first_version(), + ], + + /* + |-------------------------------------------------------------------------- + | Google Fonts + |-------------------------------------------------------------------------- + | + | Provides an easy way to load Google Fonts on the front-end of the site. + | Multiple fonts can be added by creating additional array keys below. + | Define font weights after the font family, e.g 'Lato:400,600,700; + | + */ + 'google-fonts' => [ + 'Source+Sans+Pro:400,600,700', + ], + + /* + |-------------------------------------------------------------------------- + | Image Sizes + |-------------------------------------------------------------------------- + | + | Provides an easy way to add custom image sizes to your WordPress site. + | Each item in this array will create a new custom image size, based + | on the 'height', 'width' and 'crop' parameters specified below. + | + */ + 'image-sizes' => [ + 'featured' => [ + 'width' => 620, + 'height' => 380, + 'crop' => true, + ], + 'hero' => [ + 'width' => 1280, + 'height' => 720, + 'crop' => true, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Layouts + |-------------------------------------------------------------------------- + | + | Enable or disable the built in Genesis Framework layouts with this array. + | If a custom layout is defined, such as narrow-content, the theme will + | search for assets/images/narrow-content.gif as the thumbnail image. + | + */ + 'layouts' => [ + 'full-width-content', + 'content-sidebar', + 'sidebar-content', + 'center-content', + // 'content-sidebar-sidebar', + // 'sidebar-sidebar-content', + // 'sidebar-content-sidebar', + ], + + /* + |-------------------------------------------------------------------------- + | Map Style + |-------------------------------------------------------------------------- + | + | Allows users to register custom map styles with the Google Map plugin + | by providing an id, name and path to a JSON file containing custom + | styles. http://snazzymaps.com/style/151/ultra-light-with-labels + | + */ + 'map-style' => [ + 'id' => '123456789', + 'name' => 'Ultra Light', + 'style' => CHILD_THEME_DIR . '/map.json', + ], + + /* + |-------------------------------------------------------------------------- + | Page Templates + |-------------------------------------------------------------------------- + | + | Custom page templates can be defined here. To register a custom page + | template, create an additional key => value pair with your file's + | full extension and the name, and add the file to ./templates/. + | + */ + 'page-templates' => [ + 'page-blog.php' => __( 'Blog', 'child-theme-library' ), + 'page-contact.php' => __( 'Contact Page', 'child-theme-library' ), + 'page-boxed.php' => __( 'Boxed Template', 'child-theme-library' ), + 'page-full.php' => __( 'Full Width', 'child-theme-library' ), + 'page-landing.php' => __( 'Landing Page', 'child-theme-library' ), + 'page-sitemap.php' => __( 'Sitemap', 'child-theme-library' ), + ], + + /* + |-------------------------------------------------------------------------- + | Plugins + |-------------------------------------------------------------------------- + | + | Contains the configuration for an array of plugins to be installed and + | activated by the TGM plugin activation script. Each plugin requires + | values for the name, slug and if the theme depends on the plugin. + | + */ + 'plugins' => [ + [ + 'name' => 'Genesis eNews Extended', + 'slug' => 'genesis-enews-extended', + 'required' => false, + ], + [ + 'name' => 'Genesis Simple FAQ', + 'slug' => 'genesis-simple-faq', + 'required' => false, + ], + [ + 'name' => 'Genesis Widget Column Classes', + 'slug' => 'genesis-widget-column-classes', + 'required' => false, + ], + [ + 'name' => 'Google Map', + 'slug' => 'ank-google-map', + 'required' => false, + ], + [ + 'name' => 'Simple Social Icons', + 'slug' => 'simple-social-icons', + 'required' => false, + ], + [ + 'name' => 'Widget Importer & Exporter', + 'slug' => 'widget-importer-exporter', + 'required' => false, + ], + [ + 'name' => 'WordPress Importer', + 'slug' => 'wordpress-importer', + 'required' => false, + ], + [ + 'name' => 'WP Featherlight', + 'slug' => 'wp-featherlight', + 'required' => false, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Post Type Supports + |-------------------------------------------------------------------------- + | + | Registers support of certain feature(s) for a given post type. Default + | features enabled are excerpts on pages and portfolio post types, to + | be used as subtitles in the theme's hero section below the title. + | + */ + 'post-type-supports' => [ + 'page' => 'excerpt', + 'portfolio' => 'excerpt', + ], + + /* + |-------------------------------------------------------------------------- + | Responsive Menu + |-------------------------------------------------------------------------- + | + | Sets the responsive menu settings used for the Genesis Responsive Menu + | script. This allows users to change the menu toggle button text and + | choose which menu to combine into one when using a mobile device. + | + */ + 'responsive-menu' => [ + 'mainMenu' => __( 'Menu', 'child-theme-library' ), + 'subMenu' => __( 'Menu', 'child-theme-library' ), + 'menuIconClass' => null, + 'subMenuIconClass' => null, + 'menuClasses' => [ + 'combine' => [ + '.nav-primary', + '.nav-secondary', + ], + ], + ], + + /* + |-------------------------------------------------------------------------- + | Scripts + |-------------------------------------------------------------------------- + | + | Defines a list of scripts to enqueue. Each script requires a handle, + | source URL, array of dependencies, version and whether or not to + | load the script inside the header or the footer of your theme. + | + */ + 'scripts' => [ + 'menu' => [ + 'src' => CHILD_THEME_URI . '/lib/js/menu.js', + 'deps' => 'jquery', + 'ver' => CHILD_THEME_VERSION, + 'in_footer' => true, + ], + 'script' => [ + 'src' => CHILD_THEME_ASSETS . '/js/script.js', + 'deps' => 'jquery', + 'ver' => CHILD_THEME_VERSION, + 'in_footer' => true, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Simple Social Icons + |-------------------------------------------------------------------------- + | + | Sets the default values for widgets created by the Simple Social Icons + | plugin. Uncomment then set a value to override the default settings + | created by the plugin, e.g 'background_color_hover' => '#333333'. + | + */ + 'simple-social-icons' => [ + // 'title' => '', + 'new_window' => 1, + 'size' => 40, + // 'border_radius' => 3, + // 'border_width' => 0, + // 'border_color' => '#ffffff', + // 'border_color_hover' => '#ffffff', + 'icon_color' => '#333333', + // 'icon_color_hover' => '#ffffff', + 'background_color' => '#f5f5f5', + 'background_color_hover' => '#333333', + // 'alignment' => 'alignleft', + // 'behance' => '', + // 'bloglovin' => '', + // 'dribbble' => '', + // 'email' => '', + // 'facebook' => '#', + // 'flickr' => '', + // 'github' => '', + // 'gplus' => '#', + // 'instagram' => '', + // 'linkedin' => '#', + // 'medium' => '', + // 'periscope' => '', + // 'phone' => '', + // 'pinterest' => '', + // 'rss' => '', + // 'snapchat' => '', + // 'stumbleupon' => '', + // 'tumblr' => '', + // 'twitter' => '#', + // 'vimeo' => '', + // 'xing' => '', + // 'youtube' => '#', + ], + + /* + |-------------------------------------------------------------------------- + | Styles + |-------------------------------------------------------------------------- + | + | Loads additional stylesheets similar to the scripts config above. Each + | style requires a handle, source URL, array of dependencies, version + | and an optional media query for which the style has been defined. + | + */ + 'styles' => [ + 'woocommerce' => [ + 'src' => CHILD_THEME_URI . '/woocommerce.css', + 'deps' => [], + 'ver' => CHILD_THEME_VERSION, + 'media' => null, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Testimonial Slider + |-------------------------------------------------------------------------- + | + | Defines the default settings for the Genesis Testimonial Slider plugin. + | Included in the theme config by default since most themes recommend + | this plugin during the plugin activation step in the theme setup. + | + */ + 'testimonial-slider' => [ + 'gts_autoplay' => 'yes', + 'gts_column' => 'three', + 'gts_controls' => 'yes', + 'gts_loop' => 'yes', + 'gts_effect' => 'slide', + 'gts_pause' => 'yes', + 'gts_speed' => '6000', + ], + + /* + |-------------------------------------------------------------------------- + | Text Domain + |-------------------------------------------------------------------------- + | + | Small config for defining the child theme's text domain. By default it + | uses the child-theme-library handle which allows one translation to + | be used by every child theme that shares the library's functions. + | + */ + 'textdomain' => [ + 'domain' => 'child-theme-library', + 'path' => apply_filters( 'child_theme_textdomain', CHILD_THEME_LIB . '/languages', 'child-theme-library' ), + ], + + /* + |-------------------------------------------------------------------------- + | Theme Supports + |-------------------------------------------------------------------------- + | + | Registers theme support for given features. Each item accepts the name + | of the feature and extra arguments for the feature. If no arguments + | are required by the feature then no value is required by the key. + | + */ + 'theme-supports' => [ + 'align-wide', + 'automatic-feed-links', + 'custom-background' => [ + 'default-color' => 'ffffff', + ], + 'custom-logo' => [ + 'height' => 100, + 'width' => 300, + 'flex-height' => true, + 'flex-width' => true, + 'header-text' => [ + '.site-title', + '.site-description', + ], + ], + 'custom-header' => [ + 'header-selector' => '.hero-section', + 'default_image' => CHILD_THEME_DIR . '/assets/images/hero.jpg', + 'width' => 1280, + 'height' => 720, + 'flex-height' => true, + 'flex-width' => true, + 'uploads' => true, + 'video' => true, + 'wp-head-callback' => 'child_theme_custom_header', + ], + 'genesis-accessibility' => [ + '404-page', + 'drop-down-menu', + 'headings', + 'rems', + 'search-form', + 'skip-links', + ], + 'genesis-after-entry-widget-area', + 'genesis-menus' => [ + 'primary' => __( 'Header Menu', 'child-theme-library' ), + 'secondary' => __( 'After Header Menu', 'child-theme-library' ), + ], + 'genesis-responsive-viewport', + 'genesis-structural-wraps' => [ + 'header', + 'menu-secondary', + 'footer-widgets', + 'footer', + ], + 'gutenberg' => [ + 'wide-images' => true, + ], + 'hero-section', + 'html5' => [ + 'caption', + 'comment-form', + 'comment-list', + 'gallery', + 'search-form', + ], + 'post-formats' => [ + 'aside', + 'audio', + 'chat', + 'gallery', + 'image', + 'link', + 'quote', + 'status', + 'video', + ], + 'post-thumbnails', + 'woocommerce', + 'wc-product-gallery-zoom', + 'wc-product-gallery-lightbox', + 'wc-product-gallery-slider', + 'wp-block-styles', + ], + + /* + |-------------------------------------------------------------------------- + | Widget Areas + |-------------------------------------------------------------------------- + | + | Provides an easy way to register and display widget areas. Adding a new + | key will register the widget area, and if a value is entered for the + | key, then it will be hooked to and display in that theme location. + | + */ + 'widget-areas' => [ + // 'header-right' => null, + 'sidebar' => null, + // 'sidebar-alt' => null, + 'after-entry' => null, + 'footer-1' => null, + 'footer-2' => null, + 'footer-3' => null, + 'before-header' => 'genesis_before_header_wrap', + 'before-footer' => 'genesis_before_footer_wrap', + 'footer-credits' => 'genesis_footer', + 'front-page-1' => 'front_page_widgets', + 'front-page-2' => 'front_page_widgets', + 'front-page-3' => 'front_page_widgets', + 'front-page-4' => 'front_page_widgets', + 'front-page-5' => 'front_page_widgets', + ], + + /* + |-------------------------------------------------------------------------- + | Remove Widgets + |-------------------------------------------------------------------------- + | + | Provides an easy way to remove unused widgets from the dashboard. This + | config is not used in premium Genesis child themes but is left here + | as an example for developers who might find this function useful. + | + */ + 'widgets' => [ + // 'Genesis_Featured_Page', + // 'Genesis_Featured_Post', + // 'Genesis_User_Profile_Widget', + // 'WP_Widget_Pages', + // 'WP_Widget_Calendar', + // 'WP_Widget_Archives', + // 'WP_Widget_Links', + // 'WP_Widget_Media_Audio', + // 'WP_Widget_Media_Image', + // 'WP_Widget_Media_Gallery', + // 'WP_Widget_Media_Video', + // 'WP_Widget_Meta', + // 'WP_Widget_Search', + // 'WP_Widget_Text', + // 'WP_Widget_Categories', + // 'WP_Widget_Recent_Posts', + // 'WP_Widget_Recent_Comments', + // 'WP_Widget_RSS', + // 'WP_Widget_Tag_Cloud', + // 'WP_Nav_Menu_Widget', + // 'WP_Widget_Custom_HTML', + // 'WC_Widget_Products', + // 'WC_Widget_Recent_Products', + // 'WC_Widget_Featured_Products', + // 'WC_Widget_Product_Categories', + // 'WC_Widget_Product_Tag_Cloud', + // 'WC_Widget_Cart', + // 'WC_Widget_Layered_Nav', + // 'WC_Widget_Layered_Nav_Filters', + // 'WC_Widget_Price_Filter', + // 'WC_Widget_Rating_Filter', + // 'WC_Widget_Product_Search', + // 'WC_Widget_Top_Rated_Products', + // 'WC_Widget_Recent_Reviews', + // 'WC_Widget_Recently_Viewed', + // 'WC_Widget_Best_Sellers', + // 'WC_Widget_Onsale', + // 'WC_Widget_Random_Products', + ] + +]; diff --git a/customizer.dat b/customizer.dat new file mode 100644 index 0000000..d11ff48 --- /dev/null +++ b/customizer.dat @@ -0,0 +1 @@ +a:4:{s:8:"template";s:7:"genesis";s:4:"mods";a:8:{i:0;b:0;s:18:"custom_css_post_id";i:-1;s:18:"nav_menu_locations";a:4:{s:6:"header";i:20;s:12:"after-header";i:20;s:6:"footer";i:20;s:7:"primary";i:20;}s:21:"starter_primary_color";s:7:"#b0b5ba";s:21:"external_header_video";s:0:"";s:12:"header_image";s:84:"https://genesis-starter.dev/wp-content/themes/genesis-starter/assets/images/hero.jpg";s:11:"custom_logo";s:0:"";s:17:"header_image_data";a:3:{s:3:"url";s:84:"https://genesis-starter.dev/wp-content/themes/genesis-starter/assets/images/hero.jpg";s:13:"thumbnail_url";s:84:"https://genesis-starter.dev/wp-content/themes/genesis-starter/assets/images/hero.jpg";s:11:"description";s:10:"Hero Image";}}s:7:"options";a:20:{s:9:"site_icon";s:1:"0";s:23:"nav_menus_created_posts";a:0:{}s:29:"genesis-settings[site_layout]";s:15:"content-sidebar";s:39:"genesis-settings[breadcrumb_front_page]";i:0;s:39:"genesis-settings[breadcrumb_posts_page]";i:1;s:35:"genesis-settings[breadcrumb_single]";i:1;s:33:"genesis-settings[breadcrumb_page]";i:0;s:36:"genesis-settings[breadcrumb_archive]";i:1;s:32:"genesis-settings[breadcrumb_404]";i:1;s:39:"genesis-settings[breadcrumb_attachment]";i:1;s:32:"genesis-settings[comments_posts]";i:1;s:32:"genesis-settings[comments_pages]";i:0;s:34:"genesis-settings[trackbacks_posts]";i:1;s:34:"genesis-settings[trackbacks_pages]";i:0;s:33:"genesis-settings[content_archive]";s:4:"full";s:39:"genesis-settings[content_archive_limit]";i:300;s:43:"genesis-settings[content_archive_thumbnail]";i:0;s:28:"genesis-settings[image_size]";s:5:"large";s:33:"genesis-settings[image_alignment]";s:9:"alignleft";s:27:"genesis-settings[posts_nav]";s:7:"numeric";}s:6:"wp_css";s:0:"";} \ No newline at end of file diff --git a/functions.php b/functions.php new file mode 100644 index 0000000..35ea1bc --- /dev/null +++ b/functions.php @@ -0,0 +1,28 @@ + 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. + + +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. \ No newline at end of file diff --git a/lib/README.md b/lib/README.md new file mode 100644 index 0000000..d0f063d --- /dev/null +++ b/lib/README.md @@ -0,0 +1,177 @@ +# Child Theme Library + +A configuration based drop-in library for extending Genesis child themes. See an example of how to integrate the library [here](https://github.com/seothemes/genesis-starter) or check out the [live demo](https://demo.seothemes.com/genesis-starter). + +### Why was the Child Theme Library built? + +The main purpose of the Child Theme Library is to provide a shareable codebase for commercial Genesis child themes. This is achieved by using configuration-based architecture to separate the theme's reusable logic from it's configuration. Using this approach, we are able to use a single codebase which can be heavily customized by passing in different configs. + +## Installation + +### Composer (recommended) + +Include the package and the custom directory installer package in your child theme's `composer.json` file + +```json +"require":{ + "mnsami/composer-custom-directory-installer": "1.1.*", + "seothemes/child-theme-library": "dev-master" +} +``` + +In the `extra` section define the custom directory you want the package to be installed in: + +```json +"extra":{ + "installer-paths":{ + "./lib/": ["seothemes/child-theme-library"] + } +}, +``` + +While the child theme library is in beta, you will also need to add the repository details: + +```json +"repositories": [ + { + "type": "git", + "url": "https://github.com/seothemes/child-theme-library.git" + } +], +``` + +An example `composer.json` file can be found [here](https://github.com/seothemes/genesis-starter/composer.json) + +### Git + +The Child Theme Library can be installed as a Git Submodule. This allows the library to receive future updates with ease. If you are not familiar with Git Submodules please read [this article](https://gist.github.com/gitaarik/8735255). + +From the terminal, navigate to your project directory: + +```sh +cd wp-content/themes/my-theme +``` + +Clone from Github into the `lib` directory. This creates a submodule: + +```sh +git submodule add https://github.com/seothemes/child-theme-library.git lib +``` + +Include the library from your `functions.php` file by placing the following line **after** the Genesis Framework has loaded: + +```php +// Load Child Theme Library (do not remove). +require_once get_stylesheet_directory() . '/lib/init.php'; +``` + +### Manually + +Download the zip file from Github [here](https://github.com/seothemes/child-theme-library/archive/master.zip). + +Upload the file to your theme's main directory and unzip the contents. + +Include the library from your `functions.php` file, before any custom code is loaded e.g: + +```php +// Load child theme's lib (do not remove). +require_once get_stylesheet_directory() . '/lib/init.php'; +``` + +## Setup + +Once the library has been included in your theme, it is ready to accept your config file. By default, this should be placed in `./config/config.php`, however this location can be changed by using the config path filter, e.g: + +```php +add_filter( 'child_theme_config', get_stylesheet_directory() . 'my-config.php' ); +``` + +A working example of the config file with all of the possible settings can be found [here](https://github.com/seothemes/genesis-starter/composer.json). + +## Structure + +The Child Theme Library loosely resembles the current Genesis Framework file structure: + +```sh +lib/ +├── admin/ +│ ├── customizer-output.php +│ └── customizer-settings.php +├── classes/ +│ ├── class-rgba-customizer-control.php +│ └── class-tgm-plugin-activation.php +├── css/ +│ ├── customizer.css +│ ├── library.css +│ └── load-styles.php +├── functions/ +│ ├── attributes.php +│ ├── defaults.php +│ ├── demo.php +│ ├── general.php +│ ├── hero.php +│ ├── layout.php +│ ├── markup.php +│ ├── plugins.php +│ ├── setup.php +│ ├── templates.php +│ ├── upgrade.php +│ └── utilities.php +├── js/ +│ ├── customizer.js +│ ├── library.js +│ ├── menu.js +│ └── load-scripts.php +├── languages/ +│ └── child-theme-library.pot +├── shortcodes/ +│ └── footer.php +├── structure/ +│ ├── footer.php +│ ├── header.php +│ └── menu.php +├── views/ +│ ├── page-front.php +│ ├── page-full.php +│ ├── page-landing.php +│ └── page-sitemap.php +├── widgets/ +│ └── widgets.php +├── .gitattributes +├── composer.json +├── README.md +├── autoload.php +└── init.php +``` + +## Support + +Please visit https://github.com/seothemes/child-theme-library/issues/ to open a new issue. + +## Authors + +- **Lee Anthony** - [SEO Themes](https://seothemes.com/) + +See also the list of [contributors](https://github.com/seothemes/child-theme-library/graphs/contributors) who participated in this project. + +## License + +This project is licensed under the GNU General Public License - see the LICENSE.md file for details. + +## Acknowledgments + +A shout out to anyone who's code was used in or provided inspiration to this project: + +- Gary Jones +- Craig Simpson +- Tim Jensen +- Craig Watson +- Sridhar Katakam +- Christoph Herr +- Bill Erickson +- Chinmoy Paul +- Nathan Rice +- Calvin Koepke +- Jen Baumann +- Brian Gardner +- Robin Cornett diff --git a/lib/admin/customizer-output.php b/lib/admin/customizer-output.php new file mode 100644 index 0000000..74200ac --- /dev/null +++ b/lib/admin/customizer-output.php @@ -0,0 +1,82 @@ + $settings ) { + + $custom_color = get_theme_mod( "child_theme_{$color}_color", $settings['value'] ); + + if ( $settings['value'] !== $custom_color ) { + + foreach ( $settings['css'] as $rule ) { + + $counter = 0; + + foreach ( $rule['selectors'] as $selector ) { + + $comma = ( $counter++ === 0 ? '' : ',' ); + $css .= $comma . $selector; + + } + + $css .= '{'; + + foreach ( $rule['properties'] as $property ) { + + $css .= $property . ':' . $custom_color . ';'; + + } + + $css .= '}'; + + } + + } + + } + + if ( ! empty( $css ) ) { + + wp_add_inline_style( sanitize_title_with_dashes( CHILD_THEME_NAME ), child_theme_minify_css( $css ) ); + + } + +} diff --git a/lib/admin/customizer-settings.php b/lib/admin/customizer-settings.php new file mode 100644 index 0000000..0e95cc7 --- /dev/null +++ b/lib/admin/customizer-settings.php @@ -0,0 +1,142 @@ +remove_control( 'background_color' ); + $wp_customize->remove_control( 'header_textcolor' ); + + $colors = child_theme_get_config( 'colors' ); + + /* + | ------------------------------------------------------------------ + | Logo Size + | ------------------------------------------------------------------ + | + | Adds the logo size setting to the Customizer. The logo size + | setting adds a number field control which outputs inline + | CSS to change the width of the site logo in the theme. + | + */ + $wp_customize->add_setting( + 'child_theme_logo_size', + array( + 'capability' => 'edit_theme_options', + 'default' => 100, + 'sanitize_callback' => 'child_theme_sanitize_number', + ) + ); + + $wp_customize->add_control( new WP_Customize_Control( + $wp_customize, + 'child_theme_logo_size', + array( + 'label' => __( 'Logo Size', 'child-theme-library' ), + 'description' => __( 'Set the logo size in pixels. Default is 100.', 'child-theme-library' ), + 'settings' => 'child_theme_logo_size', + 'section' => 'title_tagline', + 'type' => 'number', + 'priority' => 8, + ) + ) ); + + /* + | ------------------------------------------------------------------ + | Sticky Header + | ------------------------------------------------------------------ + | + | Adds the sticky header setting to the Customizer. This setting + | provides users with the option to have a sticky site header + | that remains at the top of the screen viewport on scroll. + | + */ + $wp_customize->add_setting( + 'child_theme_sticky_header', + array( + 'capability' => 'edit_theme_options', + 'default' => false, + ) + ); + + $wp_customize->add_control( + new WP_Customize_Control( + $wp_customize, + 'child_theme_sticky_header', + array( + 'label' => __( 'Enable sticky header', 'child-theme-library' ), + 'settings' => 'child_theme_sticky_header', + 'section' => 'genesis_layout', + 'type' => 'checkbox', + ) + ) ); + + /* + | ------------------------------------------------------------------ + | Colors + | ------------------------------------------------------------------ + | + | Adds the color settings to the Customizer. Loops through an + | array of custom colors defined in the child theme config + | file to output a new setting and control for each one. + | + */ + foreach ( $colors as $color => $settings ) { + + $setting = "child_theme_{$color}_color"; + $label = ucwords( str_replace( '_', ' ', $color ) ) . __( ' Color', 'child-theme-library' ); + + $wp_customize->add_setting( + $setting, + array( + 'default' => $settings['value'], + 'sanitize_callback' => 'child_theme_sanitize_rgba_color', + ) + ); + + $wp_customize->add_control( + new RGBA_Customizer_Control( + $wp_customize, + $setting, + array( + 'section' => 'colors', + 'label' => $label, + 'settings' => $setting, + 'show_opacity' => true, + 'palette' => true, + ) + ) + ); + } +} diff --git a/lib/autoload.php b/lib/autoload.php new file mode 100644 index 0000000..b7f7efc --- /dev/null +++ b/lib/autoload.php @@ -0,0 +1,194 @@ + 100 ) { + + throw new Exception( 'Too many files attempted to load via autoload' ); + + } + + // Ignore these items from scandir. + $ignore = [ + '.', + '..', + ]; + + // Remove the ignored items. + $scanned_dir = array_diff( $scanned_dir, $ignore ); + + foreach ( $scanned_dir as $item ) { + + $filename = $directory . '/' . $item; + $real_path = realpath( $filename ); + + if ( false === $real_path ) { + + continue; + + } + + $filetype = filetype( $real_path ); + + if ( empty( $filetype ) ) { + + continue; + + } + + // If it's a directory then recursively load it. + if ( 'dir' === $filetype ) { + + child_theme_autoload( $real_path ); + + } elseif ( 'file' === $filetype ) { + + // Don't allow files that have been uploaded. + if ( is_uploaded_file( $real_path ) ) { + + continue; + + } + + $filesize = filesize( $real_path ); + + // Don't include empty or negative sized files. + if ( $filesize <= 0 ) { + + continue; + + } + + // Don't include files that are greater than 300kb. + if ( $filesize > 300000 ) { + + continue; + + } + + $pathinfo = pathinfo( $real_path ); + + // An empty filename wouldn't be a good idea. + if ( empty( $pathinfo['filename'] ) ) { + + continue; + + } + + // Sorry, need an extension. + if ( empty( $pathinfo['extension'] ) ) { + + continue; + + } + + // Actually, we want just a PHP extension! + if ( 'php' !== $pathinfo['extension'] ) { + + continue; + + } + + // Only for files that really exist. + if ( true !== file_exists( $real_path ) ) { + + continue; + + } + + if ( true !== is_readable( $real_path ) ) { + + continue; + + } + + require_once $real_path; + + } + + } + +} diff --git a/lib/classes/class-rgba-customizer-control.php b/lib/classes/class-rgba-customizer-control.php new file mode 100644 index 0000000..0733ee1 --- /dev/null +++ b/lib/classes/class-rgba-customizer-control.php @@ -0,0 +1,141 @@ +palette ) ) { + + $palette = implode( '|', $this->palette ); + + } else { + + // Default to true. + $palette = ( false === $this->palette || 'false' === $this->palette ) ? 'false' : 'true'; + + } + + // Support passing show_opacity as string or boolean. Default to true. + $show_opacity = ( false === $this->show_opacity || 'false' === $this->show_opacity ) ? 'false' : 'true'; + + // Begin the output. + if ( isset( $this->label ) && '' !== $this->label ) { + + echo '' . esc_html( $this->label ) . ''; + + } + + ?> + + wp_version = $GLOBALS['wp_version']; + + // Announce that the class is ready, and pass the object (for advanced use). + do_action_ref_array( 'tgmpa_init', array( $this ) ); + + /* + * Load our text domain and allow for overloading the fall-back file. + * + * {@internal IMPORTANT! If this code changes, review the regex in the custom TGMPA + * generator on the website.}} + */ + add_action( 'init', array( $this, 'load_textdomain' ), 5 ); + add_filter( 'load_textdomain_mofile', array( $this, 'overload_textdomain_mofile' ), 10, 2 ); + + // When the rest of WP has loaded, kick-start the rest of the class. + add_action( 'init', array( $this, 'init' ) ); + } + + /** + * Magic method to (not) set protected properties from outside of this class. + * + * {@internal hackedihack... There is a serious bug in v2.3.2 - 2.3.6 where the `menu` property + * is being assigned rather than tested in a conditional, effectively rendering it useless. + * This 'hack' prevents this from happening.}} + * + * @see https://github.com/TGMPA/TGM-Plugin-Activation/blob/2.3.6/tgm-plugin-activation/class-tgm-plugin-activation.php#L1593 + * + * @since 2.5.2 + * + * @param string $name Name of an inaccessible property. + * @param mixed $value Value to assign to the property. + * @return void Silently fail to set the property when this is tried from outside of this class context. + * (Inside this class context, the __set() method if not used as there is direct access.) + */ + public function __set( $name, $value ) { + return; + } + + /** + * Magic method to get the value of a protected property outside of this class context. + * + * @since 2.5.2 + * + * @param string $name Name of an inaccessible property. + * @return mixed The property value. + */ + public function __get( $name ) { + return $this->{$name}; + } + + /** + * Initialise the interactions between this class and WordPress. + * + * Hooks in three new methods for the class: admin_menu, notices and styles. + * + * @since 2.0.0 + * + * @see TGM_Plugin_Activation::admin_menu() + * @see TGM_Plugin_Activation::notices() + * @see TGM_Plugin_Activation::styles() + */ + public function init() { + /** + * By default TGMPA only loads on the WP back-end and not in an Ajax call. Using this filter + * you can overrule that behaviour. + * + * @since 2.5.0 + * + * @param bool $load Whether or not TGMPA should load. + * Defaults to the return of `is_admin() && ! defined( 'DOING_AJAX' )`. + */ + if ( true !== apply_filters( 'tgmpa_load', ( is_admin() && ! defined( 'DOING_AJAX' ) ) ) ) { + return; + } + + // Load class strings. + $this->strings = array( + 'page_title' => __( 'Install Required Plugins', 'tgmpa' ), + 'menu_title' => __( 'Install Plugins', 'tgmpa' ), + /* translators: %s: plugin name. */ + 'installing' => __( 'Installing Plugin: %s', 'tgmpa' ), + /* translators: %s: plugin name. */ + 'updating' => __( 'Updating Plugin: %s', 'tgmpa' ), + 'oops' => __( 'Something went wrong with the plugin API.', 'tgmpa' ), + 'notice_can_install_required' => _n_noop( + /* translators: 1: plugin name(s). */ + 'This theme requires the following plugin: %1$s.', + 'This theme requires the following plugins: %1$s.', + 'tgmpa' + ), + 'notice_can_install_recommended' => _n_noop( + /* translators: 1: plugin name(s). */ + 'This theme recommends the following plugin: %1$s.', + 'This theme recommends the following plugins: %1$s.', + 'tgmpa' + ), + 'notice_ask_to_update' => _n_noop( + /* translators: 1: plugin name(s). */ + 'The following plugin needs to be updated to its latest version to ensure maximum compatibility with this theme: %1$s.', + 'The following plugins need to be updated to their latest version to ensure maximum compatibility with this theme: %1$s.', + 'tgmpa' + ), + 'notice_ask_to_update_maybe' => _n_noop( + /* translators: 1: plugin name(s). */ + 'There is an update available for: %1$s.', + 'There are updates available for the following plugins: %1$s.', + 'tgmpa' + ), + 'notice_can_activate_required' => _n_noop( + /* translators: 1: plugin name(s). */ + 'The following required plugin is currently inactive: %1$s.', + 'The following required plugins are currently inactive: %1$s.', + 'tgmpa' + ), + 'notice_can_activate_recommended' => _n_noop( + /* translators: 1: plugin name(s). */ + 'The following recommended plugin is currently inactive: %1$s.', + 'The following recommended plugins are currently inactive: %1$s.', + 'tgmpa' + ), + 'install_link' => _n_noop( + 'Begin installing plugin', + 'Begin installing plugins', + 'tgmpa' + ), + 'update_link' => _n_noop( + 'Begin updating plugin', + 'Begin updating plugins', + 'tgmpa' + ), + 'activate_link' => _n_noop( + 'Begin activating plugin', + 'Begin activating plugins', + 'tgmpa' + ), + 'return' => __( 'Return to Required Plugins Installer', 'tgmpa' ), + 'dashboard' => __( 'Return to the Dashboard', 'tgmpa' ), + 'plugin_activated' => __( 'Plugin activated successfully.', 'tgmpa' ), + 'activated_successfully' => __( 'The following plugin was activated successfully:', 'tgmpa' ), + /* translators: 1: plugin name. */ + 'plugin_already_active' => __( 'No action taken. Plugin %1$s was already active.', 'tgmpa' ), + /* translators: 1: plugin name. */ + 'plugin_needs_higher_version' => __( 'Plugin not activated. A higher version of %s is needed for this theme. Please update the plugin.', 'tgmpa' ), + /* translators: 1: dashboard link. */ + 'complete' => __( 'All plugins installed and activated successfully. %1$s', 'tgmpa' ), + 'dismiss' => __( 'Dismiss this notice', 'tgmpa' ), + 'notice_cannot_install_activate' => __( 'There are one or more required or recommended plugins to install, update or activate.', 'tgmpa' ), + 'contact_admin' => __( 'Please contact the administrator of this site for help.', 'tgmpa' ), + ); + + do_action( 'tgmpa_register' ); + + /* After this point, the plugins should be registered and the configuration set. */ + + // Proceed only if we have plugins to handle. + if ( empty( $this->plugins ) || ! is_array( $this->plugins ) ) { + return; + } + + // Set up the menu and notices if we still have outstanding actions. + if ( true !== $this->is_tgmpa_complete() ) { + // Sort the plugins. + array_multisort( $this->sort_order, SORT_ASC, $this->plugins ); + + add_action( 'admin_menu', array( $this, 'admin_menu' ) ); + add_action( 'admin_head', array( $this, 'dismiss' ) ); + + // Prevent the normal links from showing underneath a single install/update page. + add_filter( 'install_plugin_complete_actions', array( $this, 'actions' ) ); + add_filter( 'update_plugin_complete_actions', array( $this, 'actions' ) ); + + if ( $this->has_notices ) { + add_action( 'admin_notices', array( $this, 'notices' ) ); + add_action( 'admin_init', array( $this, 'admin_init' ), 1 ); + add_action( 'admin_enqueue_scripts', array( $this, 'thickbox' ) ); + } + } + + // If needed, filter plugin action links. + add_action( 'load-plugins.php', array( $this, 'add_plugin_action_link_filters' ), 1 ); + + // Make sure things get reset on switch theme. + add_action( 'switch_theme', array( $this, 'flush_plugins_cache' ) ); + + if ( $this->has_notices ) { + add_action( 'switch_theme', array( $this, 'update_dismiss' ) ); + } + + // Setup the force activation hook. + if ( true === $this->has_forced_activation ) { + add_action( 'admin_init', array( $this, 'force_activation' ) ); + } + + // Setup the force deactivation hook. + if ( true === $this->has_forced_deactivation ) { + add_action( 'switch_theme', array( $this, 'force_deactivation' ) ); + } + } + + /** + * Load translations. + * + * @since 2.6.0 + * + * (@internal Uses `load_theme_textdomain()` rather than `load_plugin_textdomain()` to + * get round the different ways of handling the path and deprecated notices being thrown + * and such. For plugins, the actual file name will be corrected by a filter.}} + * + * {@internal IMPORTANT! If this function changes, review the regex in the custom TGMPA + * generator on the website.}} + */ + public function load_textdomain() { + if ( is_textdomain_loaded( 'tgmpa' ) ) { + return; + } + + if ( false !== strpos( __FILE__, WP_PLUGIN_DIR ) || false !== strpos( __FILE__, WPMU_PLUGIN_DIR ) ) { + // Plugin, we'll need to adjust the file name. + add_action( 'load_textdomain_mofile', array( $this, 'correct_plugin_mofile' ), 10, 2 ); + load_theme_textdomain( 'tgmpa', dirname( __FILE__ ) . '/languages' ); + remove_action( 'load_textdomain_mofile', array( $this, 'correct_plugin_mofile' ), 10 ); + } else { + load_theme_textdomain( 'tgmpa', dirname( __FILE__ ) . '/languages' ); + } + } + + /** + * Correct the .mo file name for (must-use) plugins. + * + * Themese use `/path/{locale}.mo` while plugins use `/path/{text-domain}-{locale}.mo`. + * + * {@internal IMPORTANT! If this function changes, review the regex in the custom TGMPA + * generator on the website.}} + * + * @since 2.6.0 + * + * @param string $mofile Full path to the target mofile. + * @param string $domain The domain for which a language file is being loaded. + * @return string $mofile + */ + public function correct_plugin_mofile( $mofile, $domain ) { + // Exit early if not our domain (just in case). + if ( 'tgmpa' !== $domain ) { + return $mofile; + } + return preg_replace( '`/([a-z]{2}_[A-Z]{2}.mo)$`', '/tgmpa-$1', $mofile ); + } + + /** + * Potentially overload the fall-back translation file for the current language. + * + * WP, by default since WP 3.7, will load a local translation first and if none + * can be found, will try and find a translation in the /wp-content/languages/ directory. + * As this library is theme/plugin agnostic, translation files for TGMPA can exist both + * in the WP_LANG_DIR /plugins/ subdirectory as well as in the /themes/ subdirectory. + * + * This method makes sure both directories are checked. + * + * {@internal IMPORTANT! If this function changes, review the regex in the custom TGMPA + * generator on the website.}} + * + * @since 2.6.0 + * + * @param string $mofile Full path to the target mofile. + * @param string $domain The domain for which a language file is being loaded. + * @return string $mofile + */ + public function overload_textdomain_mofile( $mofile, $domain ) { + // Exit early if not our domain, not a WP_LANG_DIR load or if the file exists and is readable. + if ( 'tgmpa' !== $domain || false === strpos( $mofile, WP_LANG_DIR ) || @is_readable( $mofile ) ) { + return $mofile; + } + + // Current fallback file is not valid, let's try the alternative option. + if ( false !== strpos( $mofile, '/themes/' ) ) { + return str_replace( '/themes/', '/plugins/', $mofile ); + } elseif ( false !== strpos( $mofile, '/plugins/' ) ) { + return str_replace( '/plugins/', '/themes/', $mofile ); + } else { + return $mofile; + } + } + + /** + * Hook in plugin action link filters for the WP native plugins page. + * + * - Prevent activation of plugins which don't meet the minimum version requirements. + * - Prevent deactivation of force-activated plugins. + * - Add update notice if update available. + * + * @since 2.5.0 + */ + public function add_plugin_action_link_filters() { + foreach ( $this->plugins as $slug => $plugin ) { + if ( false === $this->can_plugin_activate( $slug ) ) { + add_filter( 'plugin_action_links_' . $plugin['file_path'], array( $this, 'filter_plugin_action_links_activate' ), 20 ); + } + + if ( true === $plugin['force_activation'] ) { + add_filter( 'plugin_action_links_' . $plugin['file_path'], array( $this, 'filter_plugin_action_links_deactivate' ), 20 ); + } + + if ( false !== $this->does_plugin_require_update( $slug ) ) { + add_filter( 'plugin_action_links_' . $plugin['file_path'], array( $this, 'filter_plugin_action_links_update' ), 20 ); + } + } + } + + /** + * Remove the 'Activate' link on the WP native plugins page if the plugin does not meet the + * minimum version requirements. + * + * @since 2.5.0 + * + * @param array $actions Action links. + * @return array + */ + public function filter_plugin_action_links_activate( $actions ) { + unset( $actions['activate'] ); + + return $actions; + } + + /** + * Remove the 'Deactivate' link on the WP native plugins page if the plugin has been set to force activate. + * + * @since 2.5.0 + * + * @param array $actions Action links. + * @return array + */ + public function filter_plugin_action_links_deactivate( $actions ) { + unset( $actions['deactivate'] ); + + return $actions; + } + + /** + * Add a 'Requires update' link on the WP native plugins page if the plugin does not meet the + * minimum version requirements. + * + * @since 2.5.0 + * + * @param array $actions Action links. + * @return array + */ + public function filter_plugin_action_links_update( $actions ) { + $actions['update'] = sprintf( + '%3$s', + esc_url( $this->get_tgmpa_status_url( 'update' ) ), + esc_attr__( 'This plugin needs to be updated to be compatible with your theme.', 'tgmpa' ), + esc_html__( 'Update Required', 'tgmpa' ) + ); + + return $actions; + } + + /** + * Handles calls to show plugin information via links in the notices. + * + * We get the links in the admin notices to point to the TGMPA page, rather + * than the typical plugin-install.php file, so we can prepare everything + * beforehand. + * + * WP does not make it easy to show the plugin information in the thickbox - + * here we have to require a file that includes a function that does the + * main work of displaying it, enqueue some styles, set up some globals and + * finally call that function before exiting. + * + * Down right easy once you know how... + * + * Returns early if not the TGMPA page. + * + * @since 2.1.0 + * + * @global string $tab Used as iframe div class names, helps with styling + * @global string $body_id Used as the iframe body ID, helps with styling + * + * @return null Returns early if not the TGMPA page. + */ + public function admin_init() { + if ( ! $this->is_tgmpa_page() ) { + return; + } + + if ( isset( $_REQUEST['tab'] ) && 'plugin-information' === $_REQUEST['tab'] ) { + // Needed for install_plugin_information(). + require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; + + wp_enqueue_style( 'plugin-install' ); + + global $tab, $body_id; + $body_id = 'plugin-information'; + // @codingStandardsIgnoreStart + $tab = 'plugin-information'; + // @codingStandardsIgnoreEnd + + install_plugin_information(); + + exit; + } + } + + /** + * Enqueue thickbox scripts/styles for plugin info. + * + * Thickbox is not automatically included on all admin pages, so we must + * manually enqueue it for those pages. + * + * Thickbox is only loaded if the user has not dismissed the admin + * notice or if there are any plugins left to install and activate. + * + * @since 2.1.0 + */ + public function thickbox() { + if ( ! get_user_meta( get_current_user_id(), 'tgmpa_dismissed_notice_' . $this->id, true ) ) { + add_thickbox(); + } + } + + /** + * Adds submenu page if there are plugin actions to take. + * + * This method adds the submenu page letting users know that a required + * plugin needs to be installed. + * + * This page disappears once the plugin has been installed and activated. + * + * @since 1.0.0 + * + * @see TGM_Plugin_Activation::init() + * @see TGM_Plugin_Activation::install_plugins_page() + * + * @return null Return early if user lacks capability to install a plugin. + */ + public function admin_menu() { + // Make sure privileges are correct to see the page. + if ( ! current_user_can( 'install_plugins' ) ) { + return; + } + + $args = apply_filters( + 'tgmpa_admin_menu_args', + array( + 'parent_slug' => $this->parent_slug, // Parent Menu slug. + 'page_title' => $this->strings['page_title'], // Page title. + 'menu_title' => $this->strings['menu_title'], // Menu title. + 'capability' => $this->capability, // Capability. + 'menu_slug' => $this->menu, // Menu slug. + 'function' => array( $this, 'install_plugins_page' ), // Callback. + ) + ); + + $this->add_admin_menu( $args ); + } + + /** + * Add the menu item. + * + * {@internal IMPORTANT! If this function changes, review the regex in the custom TGMPA + * generator on the website.}} + * + * @since 2.5.0 + * + * @param array $args Menu item configuration. + */ + protected function add_admin_menu( array $args ) { + if ( has_filter( 'tgmpa_admin_menu_use_add_theme_page' ) ) { + _deprecated_function( 'The "tgmpa_admin_menu_use_add_theme_page" filter', '2.5.0', esc_html__( 'Set the parent_slug config variable instead.', 'tgmpa' ) ); + } + + if ( 'themes.php' === $this->parent_slug ) { + $this->page_hook = call_user_func( 'add_theme_page', $args['page_title'], $args['menu_title'], $args['capability'], $args['menu_slug'], $args['function'] ); + } else { + $this->page_hook = call_user_func( 'add_submenu_page', $args['parent_slug'], $args['page_title'], $args['menu_title'], $args['capability'], $args['menu_slug'], $args['function'] ); + } + } + + /** + * Echoes plugin installation form. + * + * This method is the callback for the admin_menu method function. + * This displays the admin page and form area where the user can select to install and activate the plugin. + * Aborts early if we're processing a plugin installation action. + * + * @since 1.0.0 + * + * @return null Aborts early if we're processing a plugin installation action. + */ + public function install_plugins_page() { + // Store new instance of plugin table in object. + $plugin_table = new TGMPA_List_Table; + + // Return early if processing a plugin installation action. + if ( ( ( 'tgmpa-bulk-install' === $plugin_table->current_action() || 'tgmpa-bulk-update' === $plugin_table->current_action() ) && $plugin_table->process_bulk_actions() ) || $this->do_plugin_install() ) { + return; + } + + // Force refresh of available plugin information so we'll know about manual updates/deletes. + wp_clean_plugins_cache( false ); + + ?> +

+

+ prepare_items(); ?> + + message ) && is_string( $this->message ) ) { + echo wp_kses_post( $this->message ); + } + ?> + views(); ?> + +
+ + + display(); ?> +
+
+ sanitize_key( urldecode( $_GET['plugin'] ) ); + + if ( ! isset( $this->plugins[ $slug ] ) ) { + return false; + } + + // Was an install or upgrade action link clicked? + if ( ( isset( $_GET['tgmpa-install'] ) && 'install-plugin' === $_GET['tgmpa-install'] ) || ( isset( $_GET['tgmpa-update'] ) && 'update-plugin' === $_GET['tgmpa-update'] ) ) { + + $install_type = 'install'; + if ( isset( $_GET['tgmpa-update'] ) && 'update-plugin' === $_GET['tgmpa-update'] ) { + $install_type = 'update'; + } + + check_admin_referer( 'tgmpa-' . $install_type, 'tgmpa-nonce' ); + + // Pass necessary information via URL if WP_Filesystem is needed. + $url = wp_nonce_url( + add_query_arg( + array( + 'plugin' => urlencode( $slug ), + 'tgmpa-' . $install_type => $install_type . '-plugin', + ), + $this->get_tgmpa_url() + ), + 'tgmpa-' . $install_type, + 'tgmpa-nonce' + ); + + $method = ''; // Leave blank so WP_Filesystem can populate it as necessary. + + if ( false === ( $creds = request_filesystem_credentials( esc_url_raw( $url ), $method, false, false, array() ) ) ) { + return true; + } + + if ( ! WP_Filesystem( $creds ) ) { + request_filesystem_credentials( esc_url_raw( $url ), $method, true, false, array() ); // Setup WP_Filesystem. + return true; + } + + /* If we arrive here, we have the filesystem. */ + + // Prep variables for Plugin_Installer_Skin class. + $extra = array(); + $extra['slug'] = $slug; // Needed for potentially renaming of directory name. + $source = $this->get_download_url( $slug ); + $api = ( 'repo' === $this->plugins[ $slug ]['source_type'] ) ? $this->get_plugins_api( $slug ) : null; + $api = ( false !== $api ) ? $api : null; + + $url = add_query_arg( + array( + 'action' => $install_type . '-plugin', + 'plugin' => urlencode( $slug ), + ), + 'update.php' + ); + + if ( ! class_exists( 'Plugin_Upgrader', false ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + } + + $title = ( 'update' === $install_type ) ? $this->strings['updating'] : $this->strings['installing']; + $skin_args = array( + 'type' => ( 'bundled' !== $this->plugins[ $slug ]['source_type'] ) ? 'web' : 'upload', + 'title' => sprintf( $title, $this->plugins[ $slug ]['name'] ), + 'url' => esc_url_raw( $url ), + 'nonce' => $install_type . '-plugin_' . $slug, + 'plugin' => '', + 'api' => $api, + 'extra' => $extra, + ); + unset( $title ); + + if ( 'update' === $install_type ) { + $skin_args['plugin'] = $this->plugins[ $slug ]['file_path']; + $skin = new Plugin_Upgrader_Skin( $skin_args ); + } else { + $skin = new Plugin_Installer_Skin( $skin_args ); + } + + // Create a new instance of Plugin_Upgrader. + $upgrader = new Plugin_Upgrader( $skin ); + + // Perform the action and install the plugin from the $source urldecode(). + add_filter( 'upgrader_source_selection', array( $this, 'maybe_adjust_source_dir' ), 1, 3 ); + + if ( 'update' === $install_type ) { + // Inject our info into the update transient. + $to_inject = array( $slug => $this->plugins[ $slug ] ); + $to_inject[ $slug ]['source'] = $source; + $this->inject_update_info( $to_inject ); + + $upgrader->upgrade( $this->plugins[ $slug ]['file_path'] ); + } else { + $upgrader->install( $source ); + } + + remove_filter( 'upgrader_source_selection', array( $this, 'maybe_adjust_source_dir' ), 1 ); + + // Make sure we have the correct file path now the plugin is installed/updated. + $this->populate_file_path( $slug ); + + // Only activate plugins if the config option is set to true and the plugin isn't + // already active (upgrade). + if ( $this->is_automatic && ! $this->is_plugin_active( $slug ) ) { + $plugin_activate = $upgrader->plugin_info(); // Grab the plugin info from the Plugin_Upgrader method. + if ( false === $this->activate_single_plugin( $plugin_activate, $slug, true ) ) { + return true; // Finish execution of the function early as we encountered an error. + } + } + + $this->show_tgmpa_version(); + + // Display message based on if all plugins are now active or not. + if ( $this->is_tgmpa_complete() ) { + echo '

', sprintf( esc_html( $this->strings['complete'] ), '' . esc_html__( 'Return to the Dashboard', 'tgmpa' ) . '' ), '

'; + echo ''; + } else { + echo '

', esc_html( $this->strings['return'] ), '

'; + } + + return true; + } elseif ( isset( $this->plugins[ $slug ]['file_path'], $_GET['tgmpa-activate'] ) && 'activate-plugin' === $_GET['tgmpa-activate'] ) { + // Activate action link was clicked. + check_admin_referer( 'tgmpa-activate', 'tgmpa-nonce' ); + + if ( false === $this->activate_single_plugin( $this->plugins[ $slug ]['file_path'], $slug ) ) { + return true; // Finish execution of the function early as we encountered an error. + } + } + + return false; + } + + /** + * Inject information into the 'update_plugins' site transient as WP checks that before running an update. + * + * @since 2.5.0 + * + * @param array $plugins The plugin information for the plugins which are to be updated. + */ + public function inject_update_info( $plugins ) { + $repo_updates = get_site_transient( 'update_plugins' ); + + if ( ! is_object( $repo_updates ) ) { + $repo_updates = new stdClass; + } + + foreach ( $plugins as $slug => $plugin ) { + $file_path = $plugin['file_path']; + + if ( empty( $repo_updates->response[ $file_path ] ) ) { + $repo_updates->response[ $file_path ] = new stdClass; + } + + // We only really need to set package, but let's do all we can in case WP changes something. + $repo_updates->response[ $file_path ]->slug = $slug; + $repo_updates->response[ $file_path ]->plugin = $file_path; + $repo_updates->response[ $file_path ]->new_version = $plugin['version']; + $repo_updates->response[ $file_path ]->package = $plugin['source']; + if ( empty( $repo_updates->response[ $file_path ]->url ) && ! empty( $plugin['external_url'] ) ) { + $repo_updates->response[ $file_path ]->url = $plugin['external_url']; + } + } + + set_site_transient( 'update_plugins', $repo_updates ); + } + + /** + * Adjust the plugin directory name if necessary. + * + * The final destination directory of a plugin is based on the subdirectory name found in the + * (un)zipped source. In some cases - most notably GitHub repository plugin downloads -, this + * subdirectory name is not the same as the expected slug and the plugin will not be recognized + * as installed. This is fixed by adjusting the temporary unzipped source subdirectory name to + * the expected plugin slug. + * + * @since 2.5.0 + * + * @param string $source Path to upgrade/zip-file-name.tmp/subdirectory/. + * @param string $remote_source Path to upgrade/zip-file-name.tmp. + * @param \WP_Upgrader $upgrader Instance of the upgrader which installs the plugin. + * @return string $source + */ + public function maybe_adjust_source_dir( $source, $remote_source, $upgrader ) { + if ( ! $this->is_tgmpa_page() || ! is_object( $GLOBALS['wp_filesystem'] ) ) { + return $source; + } + + // Check for single file plugins. + $source_files = array_keys( $GLOBALS['wp_filesystem']->dirlist( $remote_source ) ); + if ( 1 === count( $source_files ) && false === $GLOBALS['wp_filesystem']->is_dir( $source ) ) { + return $source; + } + + // Multi-file plugin, let's see if the directory is correctly named. + $desired_slug = ''; + + // Figure out what the slug is supposed to be. + if ( false === $upgrader->bulk && ! empty( $upgrader->skin->options['extra']['slug'] ) ) { + $desired_slug = $upgrader->skin->options['extra']['slug']; + } else { + // Bulk installer contains less info, so fall back on the info registered here. + foreach ( $this->plugins as $slug => $plugin ) { + if ( ! empty( $upgrader->skin->plugin_names[ $upgrader->skin->i ] ) && $plugin['name'] === $upgrader->skin->plugin_names[ $upgrader->skin->i ] ) { + $desired_slug = $slug; + break; + } + } + unset( $slug, $plugin ); + } + + if ( ! empty( $desired_slug ) ) { + $subdir_name = untrailingslashit( str_replace( trailingslashit( $remote_source ), '', $source ) ); + + if ( ! empty( $subdir_name ) && $subdir_name !== $desired_slug ) { + $from_path = untrailingslashit( $source ); + $to_path = trailingslashit( $remote_source ) . $desired_slug; + + if ( true === $GLOBALS['wp_filesystem']->move( $from_path, $to_path ) ) { + return trailingslashit( $to_path ); + } else { + return new WP_Error( 'rename_failed', esc_html__( 'The remote plugin package does not contain a folder with the desired slug and renaming did not work.', 'tgmpa' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'tgmpa' ), array( 'found' => $subdir_name, 'expected' => $desired_slug ) ); + } + } elseif ( empty( $subdir_name ) ) { + return new WP_Error( 'packaged_wrong', esc_html__( 'The remote plugin package consists of more than one file, but the files are not packaged in a folder.', 'tgmpa' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'tgmpa' ), array( 'found' => $subdir_name, 'expected' => $desired_slug ) ); + } + } + + return $source; + } + + /** + * Activate a single plugin and send feedback about the result to the screen. + * + * @since 2.5.0 + * + * @param string $file_path Path within wp-plugins/ to main plugin file. + * @param string $slug Plugin slug. + * @param bool $automatic Whether this is an automatic activation after an install. Defaults to false. + * This determines the styling of the output messages. + * @return bool False if an error was encountered, true otherwise. + */ + protected function activate_single_plugin( $file_path, $slug, $automatic = false ) { + if ( $this->can_plugin_activate( $slug ) ) { + $activate = activate_plugin( $file_path ); + + if ( is_wp_error( $activate ) ) { + echo '

', wp_kses_post( $activate->get_error_message() ), '

', + '

', esc_html( $this->strings['return'] ), '

'; + + return false; // End it here if there is an error with activation. + } else { + if ( ! $automatic ) { + // Make sure message doesn't display again if bulk activation is performed + // immediately after a single activation. + if ( ! isset( $_POST['action'] ) ) { // WPCS: CSRF OK. + echo '

', esc_html( $this->strings['activated_successfully'] ), ' ', esc_html( $this->plugins[ $slug ]['name'] ), '.

'; + } + } else { + // Simpler message layout for use on the plugin install page. + echo '

', esc_html( $this->strings['plugin_activated'] ), '

'; + } + } + } elseif ( $this->is_plugin_active( $slug ) ) { + // No simpler message format provided as this message should never be encountered + // on the plugin install page. + echo '

', + sprintf( + esc_html( $this->strings['plugin_already_active'] ), + '' . esc_html( $this->plugins[ $slug ]['name'] ) . '' + ), + '

'; + } elseif ( $this->does_plugin_require_update( $slug ) ) { + if ( ! $automatic ) { + // Make sure message doesn't display again if bulk activation is performed + // immediately after a single activation. + if ( ! isset( $_POST['action'] ) ) { // WPCS: CSRF OK. + echo '

', + sprintf( + esc_html( $this->strings['plugin_needs_higher_version'] ), + '' . esc_html( $this->plugins[ $slug ]['name'] ) . '' + ), + '

'; + } + } else { + // Simpler message layout for use on the plugin install page. + echo '

', sprintf( esc_html( $this->strings['plugin_needs_higher_version'] ), esc_html( $this->plugins[ $slug ]['name'] ) ), '

'; + } + } + + return true; + } + + /** + * Echoes required plugin notice. + * + * Outputs a message telling users that a specific plugin is required for + * their theme. If appropriate, it includes a link to the form page where + * users can install and activate the plugin. + * + * Returns early if we're on the Install page. + * + * @since 1.0.0 + * + * @global object $current_screen + * + * @return null Returns early if we're on the Install page. + */ + public function notices() { + // Remove nag on the install page / Return early if the nag message has been dismissed or user < author. + if ( ( $this->is_tgmpa_page() || $this->is_core_update_page() ) || get_user_meta( get_current_user_id(), 'tgmpa_dismissed_notice_' . $this->id, true ) || ! current_user_can( apply_filters( 'tgmpa_show_admin_notice_capability', 'publish_posts' ) ) ) { + return; + } + + // Store for the plugin slugs by message type. + $message = array(); + + // Initialize counters used to determine plurality of action link texts. + $install_link_count = 0; + $update_link_count = 0; + $activate_link_count = 0; + $total_required_action_count = 0; + + foreach ( $this->plugins as $slug => $plugin ) { + if ( $this->is_plugin_active( $slug ) && false === $this->does_plugin_have_update( $slug ) ) { + continue; + } + + if ( ! $this->is_plugin_installed( $slug ) ) { + if ( current_user_can( 'install_plugins' ) ) { + $install_link_count++; + + if ( true === $plugin['required'] ) { + $message['notice_can_install_required'][] = $slug; + } else { + $message['notice_can_install_recommended'][] = $slug; + } + } + if ( true === $plugin['required'] ) { + $total_required_action_count++; + } + } else { + if ( ! $this->is_plugin_active( $slug ) && $this->can_plugin_activate( $slug ) ) { + if ( current_user_can( 'activate_plugins' ) ) { + $activate_link_count++; + + if ( true === $plugin['required'] ) { + $message['notice_can_activate_required'][] = $slug; + } else { + $message['notice_can_activate_recommended'][] = $slug; + } + } + if ( true === $plugin['required'] ) { + $total_required_action_count++; + } + } + + if ( $this->does_plugin_require_update( $slug ) || false !== $this->does_plugin_have_update( $slug ) ) { + + if ( current_user_can( 'update_plugins' ) ) { + $update_link_count++; + + if ( $this->does_plugin_require_update( $slug ) ) { + $message['notice_ask_to_update'][] = $slug; + } elseif ( false !== $this->does_plugin_have_update( $slug ) ) { + $message['notice_ask_to_update_maybe'][] = $slug; + } + } + if ( true === $plugin['required'] ) { + $total_required_action_count++; + } + } + } + } + unset( $slug, $plugin ); + + // If we have notices to display, we move forward. + if ( ! empty( $message ) || $total_required_action_count > 0 ) { + krsort( $message ); // Sort messages. + $rendered = ''; + + // As add_settings_error() wraps the final message in a

and as the final message can't be + // filtered, using

's in our html would render invalid html output. + $line_template = '%s' . "\n"; + + if ( ! current_user_can( 'activate_plugins' ) && ! current_user_can( 'install_plugins' ) && ! current_user_can( 'update_plugins' ) ) { + $rendered = esc_html( $this->strings['notice_cannot_install_activate'] ) . ' ' . esc_html( $this->strings['contact_admin'] ); + $rendered .= $this->create_user_action_links_for_notice( 0, 0, 0, $line_template ); + } else { + + // If dismissable is false and a message is set, output it now. + if ( ! $this->dismissable && ! empty( $this->dismiss_msg ) ) { + $rendered .= sprintf( $line_template, wp_kses_post( $this->dismiss_msg ) ); + } + + // Render the individual message lines for the notice. + foreach ( $message as $type => $plugin_group ) { + $linked_plugins = array(); + + // Get the external info link for a plugin if one is available. + foreach ( $plugin_group as $plugin_slug ) { + $linked_plugins[] = $this->get_info_link( $plugin_slug ); + } + unset( $plugin_slug ); + + $count = count( $plugin_group ); + $linked_plugins = array_map( array( 'TGMPA_Utils', 'wrap_in_em' ), $linked_plugins ); + $last_plugin = array_pop( $linked_plugins ); // Pop off last name to prep for readability. + $imploded = empty( $linked_plugins ) ? $last_plugin : ( implode( ', ', $linked_plugins ) . ' ' . esc_html_x( 'and', 'plugin A *and* plugin B', 'tgmpa' ) . ' ' . $last_plugin ); + + $rendered .= sprintf( + $line_template, + sprintf( + translate_nooped_plural( $this->strings[ $type ], $count, 'tgmpa' ), + $imploded, + $count + ) + ); + + } + unset( $type, $plugin_group, $linked_plugins, $count, $last_plugin, $imploded ); + + $rendered .= $this->create_user_action_links_for_notice( $install_link_count, $update_link_count, $activate_link_count, $line_template ); + } + + // Register the nag messages and prepare them to be processed. + add_settings_error( 'tgmpa', 'tgmpa', $rendered, $this->get_admin_notice_class() ); + } + + // Admin options pages already output settings_errors, so this is to avoid duplication. + if ( 'options-general' !== $GLOBALS['current_screen']->parent_base ) { + $this->display_settings_errors(); + } + } + + /** + * Generate the user action links for the admin notice. + * + * @since 2.6.0 + * + * @param int $install_count Number of plugins to install. + * @param int $update_count Number of plugins to update. + * @param int $activate_count Number of plugins to activate. + * @param int $line_template Template for the HTML tag to output a line. + * @return string Action links. + */ + protected function create_user_action_links_for_notice( $install_count, $update_count, $activate_count, $line_template ) { + // Setup action links. + $action_links = array( + 'install' => '', + 'update' => '', + 'activate' => '', + 'dismiss' => $this->dismissable ? '' . esc_html( $this->strings['dismiss'] ) . '' : '', + ); + + $link_template = '%1$s'; + + if ( current_user_can( 'install_plugins' ) ) { + if ( $install_count > 0 ) { + $action_links['install'] = sprintf( + $link_template, + translate_nooped_plural( $this->strings['install_link'], $install_count, 'tgmpa' ), + esc_url( $this->get_tgmpa_status_url( 'install' ) ) + ); + } + if ( $update_count > 0 ) { + $action_links['update'] = sprintf( + $link_template, + translate_nooped_plural( $this->strings['update_link'], $update_count, 'tgmpa' ), + esc_url( $this->get_tgmpa_status_url( 'update' ) ) + ); + } + } + + if ( current_user_can( 'activate_plugins' ) && $activate_count > 0 ) { + $action_links['activate'] = sprintf( + $link_template, + translate_nooped_plural( $this->strings['activate_link'], $activate_count, 'tgmpa' ), + esc_url( $this->get_tgmpa_status_url( 'activate' ) ) + ); + } + + $action_links = apply_filters( 'tgmpa_notice_action_links', $action_links ); + + $action_links = array_filter( (array) $action_links ); // Remove any empty array items. + + if ( ! empty( $action_links ) ) { + $action_links = sprintf( $line_template, implode( ' | ', $action_links ) ); + return apply_filters( 'tgmpa_notice_rendered_action_links', $action_links ); + } else { + return ''; + } + } + + /** + * Get admin notice class. + * + * Work around all the changes to the various admin notice classes between WP 4.4 and 3.7 + * (lowest supported version by TGMPA). + * + * @since 2.6.0 + * + * @return string + */ + protected function get_admin_notice_class() { + if ( ! empty( $this->strings['nag_type'] ) ) { + return sanitize_html_class( strtolower( $this->strings['nag_type'] ) ); + } else { + if ( version_compare( $this->wp_version, '4.2', '>=' ) ) { + return 'notice-warning'; + } elseif ( version_compare( $this->wp_version, '4.1', '>=' ) ) { + return 'notice'; + } else { + return 'updated'; + } + } + } + + /** + * Display settings errors and remove those which have been displayed to avoid duplicate messages showing + * + * @since 2.5.0 + */ + protected function display_settings_errors() { + global $wp_settings_errors; + + settings_errors( 'tgmpa' ); + + foreach ( (array) $wp_settings_errors as $key => $details ) { + if ( 'tgmpa' === $details['setting'] ) { + unset( $wp_settings_errors[ $key ] ); + break; + } + } + } + + /** + * Register dismissal of admin notices. + * + * Acts on the dismiss link in the admin nag messages. + * If clicked, the admin notice disappears and will no longer be visible to this user. + * + * @since 2.1.0 + */ + public function dismiss() { + if ( isset( $_GET['tgmpa-dismiss'] ) && check_admin_referer( 'tgmpa-dismiss-' . get_current_user_id() ) ) { + update_user_meta( get_current_user_id(), 'tgmpa_dismissed_notice_' . $this->id, 1 ); + } + } + + /** + * Add individual plugin to our collection of plugins. + * + * If the required keys are not set or the plugin has already + * been registered, the plugin is not added. + * + * @since 2.0.0 + * + * @param array|null $plugin Array of plugin arguments or null if invalid argument. + * @return null Return early if incorrect argument. + */ + public function register( $plugin ) { + if ( empty( $plugin['slug'] ) || empty( $plugin['name'] ) ) { + return; + } + + if ( empty( $plugin['slug'] ) || ! is_string( $plugin['slug'] ) || isset( $this->plugins[ $plugin['slug'] ] ) ) { + return; + } + + $defaults = array( + 'name' => '', // String + 'slug' => '', // String + 'source' => 'repo', // String + 'required' => false, // Boolean + 'version' => '', // String + 'force_activation' => false, // Boolean + 'force_deactivation' => false, // Boolean + 'external_url' => '', // String + 'is_callable' => '', // String|Array. + ); + + // Prepare the received data. + $plugin = wp_parse_args( $plugin, $defaults ); + + // Standardize the received slug. + $plugin['slug'] = $this->sanitize_key( $plugin['slug'] ); + + // Forgive users for using string versions of booleans or floats for version number. + $plugin['version'] = (string) $plugin['version']; + $plugin['source'] = empty( $plugin['source'] ) ? 'repo' : $plugin['source']; + $plugin['required'] = TGMPA_Utils::validate_bool( $plugin['required'] ); + $plugin['force_activation'] = TGMPA_Utils::validate_bool( $plugin['force_activation'] ); + $plugin['force_deactivation'] = TGMPA_Utils::validate_bool( $plugin['force_deactivation'] ); + + // Enrich the received data. + $plugin['file_path'] = $this->_get_plugin_basename_from_slug( $plugin['slug'] ); + $plugin['source_type'] = $this->get_plugin_source_type( $plugin['source'] ); + + // Set the class properties. + $this->plugins[ $plugin['slug'] ] = $plugin; + $this->sort_order[ $plugin['slug'] ] = $plugin['name']; + + // Should we add the force activation hook ? + if ( true === $plugin['force_activation'] ) { + $this->has_forced_activation = true; + } + + // Should we add the force deactivation hook ? + if ( true === $plugin['force_deactivation'] ) { + $this->has_forced_deactivation = true; + } + } + + /** + * Determine what type of source the plugin comes from. + * + * @since 2.5.0 + * + * @param string $source The source of the plugin as provided, either empty (= WP repo), a file path + * (= bundled) or an external URL. + * @return string 'repo', 'external', or 'bundled' + */ + protected function get_plugin_source_type( $source ) { + if ( 'repo' === $source || preg_match( self::WP_REPO_REGEX, $source ) ) { + return 'repo'; + } elseif ( preg_match( self::IS_URL_REGEX, $source ) ) { + return 'external'; + } else { + return 'bundled'; + } + } + + /** + * Sanitizes a string key. + * + * Near duplicate of WP Core `sanitize_key()`. The difference is that uppercase characters *are* + * allowed, so as not to break upgrade paths from non-standard bundled plugins using uppercase + * characters in the plugin directory path/slug. Silly them. + * + * @see https://developer.wordpress.org/reference/hooks/sanitize_key/ + * + * @since 2.5.0 + * + * @param string $key String key. + * @return string Sanitized key + */ + public function sanitize_key( $key ) { + $raw_key = $key; + $key = preg_replace( '`[^A-Za-z0-9_-]`', '', $key ); + + /** + * Filter a sanitized key string. + * + * @since 2.5.0 + * + * @param string $key Sanitized key. + * @param string $raw_key The key prior to sanitization. + */ + return apply_filters( 'tgmpa_sanitize_key', $key, $raw_key ); + } + + /** + * Amend default configuration settings. + * + * @since 2.0.0 + * + * @param array $config Array of config options to pass as class properties. + */ + public function config( $config ) { + $keys = array( + 'id', + 'default_path', + 'has_notices', + 'dismissable', + 'dismiss_msg', + 'menu', + 'parent_slug', + 'capability', + 'is_automatic', + 'message', + 'strings', + ); + + foreach ( $keys as $key ) { + if ( isset( $config[ $key ] ) ) { + if ( is_array( $config[ $key ] ) ) { + $this->$key = array_merge( $this->$key, $config[ $key ] ); + } else { + $this->$key = $config[ $key ]; + } + } + } + } + + /** + * Amend action link after plugin installation. + * + * @since 2.0.0 + * + * @param array $install_actions Existing array of actions. + * @return false|array Amended array of actions. + */ + public function actions( $install_actions ) { + // Remove action links on the TGMPA install page. + if ( $this->is_tgmpa_page() ) { + return false; + } + + return $install_actions; + } + + /** + * Flushes the plugins cache on theme switch to prevent stale entries + * from remaining in the plugin table. + * + * @since 2.4.0 + * + * @param bool $clear_update_cache Optional. Whether to clear the Plugin updates cache. + * Parameter added in v2.5.0. + */ + public function flush_plugins_cache( $clear_update_cache = true ) { + wp_clean_plugins_cache( $clear_update_cache ); + } + + /** + * Set file_path key for each installed plugin. + * + * @since 2.1.0 + * + * @param string $plugin_slug Optional. If set, only (re-)populates the file path for that specific plugin. + * Parameter added in v2.5.0. + */ + public function populate_file_path( $plugin_slug = '' ) { + if ( ! empty( $plugin_slug ) && is_string( $plugin_slug ) && isset( $this->plugins[ $plugin_slug ] ) ) { + $this->plugins[ $plugin_slug ]['file_path'] = $this->_get_plugin_basename_from_slug( $plugin_slug ); + } else { + // Add file_path key for all plugins. + foreach ( $this->plugins as $slug => $values ) { + $this->plugins[ $slug ]['file_path'] = $this->_get_plugin_basename_from_slug( $slug ); + } + } + } + + /** + * Helper function to extract the file path of the plugin file from the + * plugin slug, if the plugin is installed. + * + * @since 2.0.0 + * + * @param string $slug Plugin slug (typically folder name) as provided by the developer. + * @return string Either file path for plugin if installed, or just the plugin slug. + */ + protected function _get_plugin_basename_from_slug( $slug ) { + $keys = array_keys( $this->get_plugins() ); + + foreach ( $keys as $key ) { + if ( preg_match( '|^' . $slug . '/|', $key ) ) { + return $key; + } + } + + return $slug; + } + + /** + * Retrieve plugin data, given the plugin name. + * + * Loops through the registered plugins looking for $name. If it finds it, + * it returns the $data from that plugin. Otherwise, returns false. + * + * @since 2.1.0 + * + * @param string $name Name of the plugin, as it was registered. + * @param string $data Optional. Array key of plugin data to return. Default is slug. + * @return string|boolean Plugin slug if found, false otherwise. + */ + public function _get_plugin_data_from_name( $name, $data = 'slug' ) { + foreach ( $this->plugins as $values ) { + if ( $name === $values['name'] && isset( $values[ $data ] ) ) { + return $values[ $data ]; + } + } + + return false; + } + + /** + * Retrieve the download URL for a package. + * + * @since 2.5.0 + * + * @param string $slug Plugin slug. + * @return string Plugin download URL or path to local file or empty string if undetermined. + */ + public function get_download_url( $slug ) { + $dl_source = ''; + + switch ( $this->plugins[ $slug ]['source_type'] ) { + case 'repo': + return $this->get_wp_repo_download_url( $slug ); + case 'external': + return $this->plugins[ $slug ]['source']; + case 'bundled': + return $this->default_path . $this->plugins[ $slug ]['source']; + } + + return $dl_source; // Should never happen. + } + + /** + * Retrieve the download URL for a WP repo package. + * + * @since 2.5.0 + * + * @param string $slug Plugin slug. + * @return string Plugin download URL. + */ + protected function get_wp_repo_download_url( $slug ) { + $source = ''; + $api = $this->get_plugins_api( $slug ); + + if ( false !== $api && isset( $api->download_link ) ) { + $source = $api->download_link; + } + + return $source; + } + + /** + * Try to grab information from WordPress API. + * + * @since 2.5.0 + * + * @param string $slug Plugin slug. + * @return object Plugins_api response object on success, WP_Error on failure. + */ + protected function get_plugins_api( $slug ) { + static $api = array(); // Cache received responses. + + if ( ! isset( $api[ $slug ] ) ) { + if ( ! function_exists( 'plugins_api' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; + } + + $response = plugins_api( 'plugin_information', array( 'slug' => $slug, 'fields' => array( 'sections' => false ) ) ); + + $api[ $slug ] = false; + + if ( is_wp_error( $response ) ) { + wp_die( esc_html( $this->strings['oops'] ) ); + } else { + $api[ $slug ] = $response; + } + } + + return $api[ $slug ]; + } + + /** + * Retrieve a link to a plugin information page. + * + * @since 2.5.0 + * + * @param string $slug Plugin slug. + * @return string Fully formed html link to a plugin information page if available + * or the plugin name if not. + */ + public function get_info_link( $slug ) { + if ( ! empty( $this->plugins[ $slug ]['external_url'] ) && preg_match( self::IS_URL_REGEX, $this->plugins[ $slug ]['external_url'] ) ) { + $link = sprintf( + '%2$s', + esc_url( $this->plugins[ $slug ]['external_url'] ), + esc_html( $this->plugins[ $slug ]['name'] ) + ); + } elseif ( 'repo' === $this->plugins[ $slug ]['source_type'] ) { + $url = add_query_arg( + array( + 'tab' => 'plugin-information', + 'plugin' => urlencode( $slug ), + 'TB_iframe' => 'true', + 'width' => '640', + 'height' => '500', + ), + self_admin_url( 'plugin-install.php' ) + ); + + $link = sprintf( + '%2$s', + esc_url( $url ), + esc_html( $this->plugins[ $slug ]['name'] ) + ); + } else { + $link = esc_html( $this->plugins[ $slug ]['name'] ); // No hyperlink. + } + + return $link; + } + + /** + * Determine if we're on the TGMPA Install page. + * + * @since 2.1.0 + * + * @return boolean True when on the TGMPA page, false otherwise. + */ + protected function is_tgmpa_page() { + return isset( $_GET['page'] ) && $this->menu === $_GET['page']; + } + + /** + * Determine if we're on a WP Core installation/upgrade page. + * + * @since 2.6.0 + * + * @return boolean True when on a WP Core installation/upgrade page, false otherwise. + */ + protected function is_core_update_page() { + // Current screen is not always available, most notably on the customizer screen. + if ( ! function_exists( 'get_current_screen' ) ) { + return false; + } + + $screen = get_current_screen(); + + if ( 'update-core' === $screen->base ) { + // Core update screen. + return true; + } elseif ( 'plugins' === $screen->base && ! empty( $_POST['action'] ) ) { // WPCS: CSRF ok. + // Plugins bulk update screen. + return true; + } elseif ( 'update' === $screen->base && ! empty( $_POST['action'] ) ) { // WPCS: CSRF ok. + // Individual updates (ajax call). + return true; + } + + return false; + } + + /** + * Retrieve the URL to the TGMPA Install page. + * + * I.e. depending on the config settings passed something along the lines of: + * http://example.com/wp-admin/themes.php?page=tgmpa-install-plugins + * + * @since 2.5.0 + * + * @return string Properly encoded URL (not escaped). + */ + public function get_tgmpa_url() { + static $url; + + if ( ! isset( $url ) ) { + $parent = $this->parent_slug; + if ( false === strpos( $parent, '.php' ) ) { + $parent = 'admin.php'; + } + $url = add_query_arg( + array( + 'page' => urlencode( $this->menu ), + ), + self_admin_url( $parent ) + ); + } + + return $url; + } + + /** + * Retrieve the URL to the TGMPA Install page for a specific plugin status (view). + * + * I.e. depending on the config settings passed something along the lines of: + * http://example.com/wp-admin/themes.php?page=tgmpa-install-plugins&plugin_status=install + * + * @since 2.5.0 + * + * @param string $status Plugin status - either 'install', 'update' or 'activate'. + * @return string Properly encoded URL (not escaped). + */ + public function get_tgmpa_status_url( $status ) { + return add_query_arg( + array( + 'plugin_status' => urlencode( $status ), + ), + $this->get_tgmpa_url() + ); + } + + /** + * Determine whether there are open actions for plugins registered with TGMPA. + * + * @since 2.5.0 + * + * @return bool True if complete, i.e. no outstanding actions. False otherwise. + */ + public function is_tgmpa_complete() { + $complete = true; + foreach ( $this->plugins as $slug => $plugin ) { + if ( ! $this->is_plugin_active( $slug ) || false !== $this->does_plugin_have_update( $slug ) ) { + $complete = false; + break; + } + } + + return $complete; + } + + /** + * Check if a plugin is installed. Does not take must-use plugins into account. + * + * @since 2.5.0 + * + * @param string $slug Plugin slug. + * @return bool True if installed, false otherwise. + */ + public function is_plugin_installed( $slug ) { + $installed_plugins = $this->get_plugins(); // Retrieve a list of all installed plugins (WP cached). + + return ( ! empty( $installed_plugins[ $this->plugins[ $slug ]['file_path'] ] ) ); + } + + /** + * Check if a plugin is active. + * + * @since 2.5.0 + * + * @param string $slug Plugin slug. + * @return bool True if active, false otherwise. + */ + public function is_plugin_active( $slug ) { + return ( ( ! empty( $this->plugins[ $slug ]['is_callable'] ) && is_callable( $this->plugins[ $slug ]['is_callable'] ) ) || is_plugin_active( $this->plugins[ $slug ]['file_path'] ) ); + } + + /** + * Check if a plugin can be updated, i.e. if we have information on the minimum WP version required + * available, check whether the current install meets them. + * + * @since 2.5.0 + * + * @param string $slug Plugin slug. + * @return bool True if OK to update, false otherwise. + */ + public function can_plugin_update( $slug ) { + // We currently can't get reliable info on non-WP-repo plugins - issue #380. + if ( 'repo' !== $this->plugins[ $slug ]['source_type'] ) { + return true; + } + + $api = $this->get_plugins_api( $slug ); + + if ( false !== $api && isset( $api->requires ) ) { + return version_compare( $this->wp_version, $api->requires, '>=' ); + } + + // No usable info received from the plugins API, presume we can update. + return true; + } + + /** + * Check to see if the plugin is 'updatetable', i.e. installed, with an update available + * and no WP version requirements blocking it. + * + * @since 2.6.0 + * + * @param string $slug Plugin slug. + * @return bool True if OK to proceed with update, false otherwise. + */ + public function is_plugin_updatetable( $slug ) { + if ( ! $this->is_plugin_installed( $slug ) ) { + return false; + } else { + return ( false !== $this->does_plugin_have_update( $slug ) && $this->can_plugin_update( $slug ) ); + } + } + + /** + * Check if a plugin can be activated, i.e. is not currently active and meets the minimum + * plugin version requirements set in TGMPA (if any). + * + * @since 2.5.0 + * + * @param string $slug Plugin slug. + * @return bool True if OK to activate, false otherwise. + */ + public function can_plugin_activate( $slug ) { + return ( ! $this->is_plugin_active( $slug ) && ! $this->does_plugin_require_update( $slug ) ); + } + + /** + * Retrieve the version number of an installed plugin. + * + * @since 2.5.0 + * + * @param string $slug Plugin slug. + * @return string Version number as string or an empty string if the plugin is not installed + * or version unknown (plugins which don't comply with the plugin header standard). + */ + public function get_installed_version( $slug ) { + $installed_plugins = $this->get_plugins(); // Retrieve a list of all installed plugins (WP cached). + + if ( ! empty( $installed_plugins[ $this->plugins[ $slug ]['file_path'] ]['Version'] ) ) { + return $installed_plugins[ $this->plugins[ $slug ]['file_path'] ]['Version']; + } + + return ''; + } + + /** + * Check whether a plugin complies with the minimum version requirements. + * + * @since 2.5.0 + * + * @param string $slug Plugin slug. + * @return bool True when a plugin needs to be updated, otherwise false. + */ + public function does_plugin_require_update( $slug ) { + $installed_version = $this->get_installed_version( $slug ); + $minimum_version = $this->plugins[ $slug ]['version']; + + return version_compare( $minimum_version, $installed_version, '>' ); + } + + /** + * Check whether there is an update available for a plugin. + * + * @since 2.5.0 + * + * @param string $slug Plugin slug. + * @return false|string Version number string of the available update or false if no update available. + */ + public function does_plugin_have_update( $slug ) { + // Presume bundled and external plugins will point to a package which meets the minimum required version. + if ( 'repo' !== $this->plugins[ $slug ]['source_type'] ) { + if ( $this->does_plugin_require_update( $slug ) ) { + return $this->plugins[ $slug ]['version']; + } + + return false; + } + + $repo_updates = get_site_transient( 'update_plugins' ); + + if ( isset( $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->new_version ) ) { + return $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->new_version; + } + + return false; + } + + /** + * Retrieve potential upgrade notice for a plugin. + * + * @since 2.5.0 + * + * @param string $slug Plugin slug. + * @return string The upgrade notice or an empty string if no message was available or provided. + */ + public function get_upgrade_notice( $slug ) { + // We currently can't get reliable info on non-WP-repo plugins - issue #380. + if ( 'repo' !== $this->plugins[ $slug ]['source_type'] ) { + return ''; + } + + $repo_updates = get_site_transient( 'update_plugins' ); + + if ( ! empty( $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->upgrade_notice ) ) { + return $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->upgrade_notice; + } + + return ''; + } + + /** + * Wrapper around the core WP get_plugins function, making sure it's actually available. + * + * @since 2.5.0 + * + * @param string $plugin_folder Optional. Relative path to single plugin folder. + * @return array Array of installed plugins with plugin information. + */ + public function get_plugins( $plugin_folder = '' ) { + if ( ! function_exists( 'get_plugins' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + return get_plugins( $plugin_folder ); + } + + /** + * Delete dismissable nag option when theme is switched. + * + * This ensures that the user(s) is/are again reminded via nag of required + * and/or recommended plugins if they re-activate the theme. + * + * @since 2.1.1 + */ + public function update_dismiss() { + delete_metadata( 'user', null, 'tgmpa_dismissed_notice_' . $this->id, null, true ); + } + + /** + * Forces plugin activation if the parameter 'force_activation' is + * set to true. + * + * This allows theme authors to specify certain plugins that must be + * active at all times while using the current theme. + * + * Please take special care when using this parameter as it has the + * potential to be harmful if not used correctly. Setting this parameter + * to true will not allow the specified plugin to be deactivated unless + * the user switches themes. + * + * @since 2.2.0 + */ + public function force_activation() { + foreach ( $this->plugins as $slug => $plugin ) { + if ( true === $plugin['force_activation'] ) { + if ( ! $this->is_plugin_installed( $slug ) ) { + // Oops, plugin isn't there so iterate to next condition. + continue; + } elseif ( $this->can_plugin_activate( $slug ) ) { + // There we go, activate the plugin. + activate_plugin( $plugin['file_path'] ); + } + } + } + } + + /** + * Forces plugin deactivation if the parameter 'force_deactivation' + * is set to true and adds the plugin to the 'recently active' plugins list. + * + * This allows theme authors to specify certain plugins that must be + * deactivated upon switching from the current theme to another. + * + * Please take special care when using this parameter as it has the + * potential to be harmful if not used correctly. + * + * @since 2.2.0 + */ + public function force_deactivation() { + $deactivated = array(); + + foreach ( $this->plugins as $slug => $plugin ) { + /* + * Only proceed forward if the parameter is set to true and plugin is active + * as a 'normal' (not must-use) plugin. + */ + if ( true === $plugin['force_deactivation'] && is_plugin_active( $plugin['file_path'] ) ) { + deactivate_plugins( $plugin['file_path'] ); + $deactivated[ $plugin['file_path'] ] = time(); + } + } + + if ( ! empty( $deactivated ) ) { + update_option( 'recently_activated', $deactivated + (array) get_option( 'recently_activated' ) ); + } + } + + /** + * Echo the current TGMPA version number to the page. + * + * @since 2.5.0 + */ + public function show_tgmpa_version() { + echo '

', + esc_html( + sprintf( + /* translators: %s: version number */ + __( 'TGMPA v%s', 'tgmpa' ), + self::TGMPA_VERSION + ) + ), + '

'; + } + + /** + * Returns the singleton instance of the class. + * + * @since 2.4.0 + * + * @return \TGM_Plugin_Activation The TGM_Plugin_Activation object. + */ + public static function get_instance() { + if ( ! isset( self::$instance ) && ! ( self::$instance instanceof self ) ) { + self::$instance = new self(); + } + + return self::$instance; + } + } + + if ( ! function_exists( 'load_tgm_plugin_activation' ) ) { + /** + * Ensure only one instance of the class is ever invoked. + * + * @since 2.5.0 + */ + function load_tgm_plugin_activation() { + $GLOBALS['tgmpa'] = TGM_Plugin_Activation::get_instance(); + } + } + + if ( did_action( 'plugins_loaded' ) ) { + load_tgm_plugin_activation(); + } else { + add_action( 'plugins_loaded', 'load_tgm_plugin_activation' ); + } +} + +if ( ! function_exists( 'tgmpa' ) ) { + /** + * Helper function to register a collection of required plugins. + * + * @since 2.0.0 + * @api + * + * @param array $plugins An array of plugin arrays. + * @param array $config Optional. An array of configuration values. + */ + function tgmpa( $plugins, $config = array() ) { + $instance = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) ); + + foreach ( $plugins as $plugin ) { + call_user_func( array( $instance, 'register' ), $plugin ); + } + + if ( ! empty( $config ) && is_array( $config ) ) { + // Send out notices for deprecated arguments passed. + if ( isset( $config['notices'] ) ) { + _deprecated_argument( __FUNCTION__, '2.2.0', 'The `notices` config parameter was renamed to `has_notices` in TGMPA 2.2.0. Please adjust your configuration.' ); + if ( ! isset( $config['has_notices'] ) ) { + $config['has_notices'] = $config['notices']; + } + } + + if ( isset( $config['parent_menu_slug'] ) ) { + _deprecated_argument( __FUNCTION__, '2.4.0', 'The `parent_menu_slug` config parameter was removed in TGMPA 2.4.0. In TGMPA 2.5.0 an alternative was (re-)introduced. Please adjust your configuration. For more information visit the website: http://tgmpluginactivation.com/configuration/#h-configuration-options.' ); + } + if ( isset( $config['parent_url_slug'] ) ) { + _deprecated_argument( __FUNCTION__, '2.4.0', 'The `parent_url_slug` config parameter was removed in TGMPA 2.4.0. In TGMPA 2.5.0 an alternative was (re-)introduced. Please adjust your configuration. For more information visit the website: http://tgmpluginactivation.com/configuration/#h-configuration-options.' ); + } + + call_user_func( array( $instance, 'config' ), $config ); + } + } +} + +/** + * WP_List_Table isn't always available. If it isn't available, + * we load it here. + * + * @since 2.2.0 + */ +if ( ! class_exists( 'WP_List_Table' ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php'; +} + +if ( ! class_exists( 'TGMPA_List_Table' ) ) { + + /** + * List table class for handling plugins. + * + * Extends the WP_List_Table class to provide a future-compatible + * way of listing out all required/recommended plugins. + * + * Gives users an interface similar to the Plugin Administration + * area with similar (albeit stripped down) capabilities. + * + * This class also allows for the bulk install of plugins. + * + * @since 2.2.0 + * + * @package TGM-Plugin-Activation + * @author Thomas Griffin + * @author Gary Jones + */ + class TGMPA_List_Table extends WP_List_Table { + /** + * TGMPA instance. + * + * @since 2.5.0 + * + * @var object + */ + protected $tgmpa; + + /** + * The currently chosen view. + * + * @since 2.5.0 + * + * @var string One of: 'all', 'install', 'update', 'activate' + */ + public $view_context = 'all'; + + /** + * The plugin counts for the various views. + * + * @since 2.5.0 + * + * @var array + */ + protected $view_totals = array( + 'all' => 0, + 'install' => 0, + 'update' => 0, + 'activate' => 0, + ); + + /** + * References parent constructor and sets defaults for class. + * + * @since 2.2.0 + */ + public function __construct() { + $this->tgmpa = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) ); + + parent::__construct( + array( + 'singular' => 'plugin', + 'plural' => 'plugins', + 'ajax' => false, + ) + ); + + if ( isset( $_REQUEST['plugin_status'] ) && in_array( $_REQUEST['plugin_status'], array( 'install', 'update', 'activate' ), true ) ) { + $this->view_context = sanitize_key( $_REQUEST['plugin_status'] ); + } + + add_filter( 'tgmpa_table_data_items', array( $this, 'sort_table_items' ) ); + } + + /** + * Get a list of CSS classes for the tag. + * + * Overruled to prevent the 'plural' argument from being added. + * + * @since 2.5.0 + * + * @return array CSS classnames. + */ + public function get_table_classes() { + return array( 'widefat', 'fixed' ); + } + + /** + * Gathers and renames all of our plugin information to be used by WP_List_Table to create our table. + * + * @since 2.2.0 + * + * @return array $table_data Information for use in table. + */ + protected function _gather_plugin_data() { + // Load thickbox for plugin links. + $this->tgmpa->admin_init(); + $this->tgmpa->thickbox(); + + // Categorize the plugins which have open actions. + $plugins = $this->categorize_plugins_to_views(); + + // Set the counts for the view links. + $this->set_view_totals( $plugins ); + + // Prep variables for use and grab list of all installed plugins. + $table_data = array(); + $i = 0; + + // Redirect to the 'all' view if no plugins were found for the selected view context. + if ( empty( $plugins[ $this->view_context ] ) ) { + $this->view_context = 'all'; + } + + foreach ( $plugins[ $this->view_context ] as $slug => $plugin ) { + $table_data[ $i ]['sanitized_plugin'] = $plugin['name']; + $table_data[ $i ]['slug'] = $slug; + $table_data[ $i ]['plugin'] = '' . $this->tgmpa->get_info_link( $slug ) . ''; + $table_data[ $i ]['source'] = $this->get_plugin_source_type_text( $plugin['source_type'] ); + $table_data[ $i ]['type'] = $this->get_plugin_advise_type_text( $plugin['required'] ); + $table_data[ $i ]['status'] = $this->get_plugin_status_text( $slug ); + $table_data[ $i ]['installed_version'] = $this->tgmpa->get_installed_version( $slug ); + $table_data[ $i ]['minimum_version'] = $plugin['version']; + $table_data[ $i ]['available_version'] = $this->tgmpa->does_plugin_have_update( $slug ); + + // Prep the upgrade notice info. + $upgrade_notice = $this->tgmpa->get_upgrade_notice( $slug ); + if ( ! empty( $upgrade_notice ) ) { + $table_data[ $i ]['upgrade_notice'] = $upgrade_notice; + + add_action( "tgmpa_after_plugin_row_{$slug}", array( $this, 'wp_plugin_update_row' ), 10, 2 ); + } + + $table_data[ $i ] = apply_filters( 'tgmpa_table_data_item', $table_data[ $i ], $plugin ); + + $i++; + } + + return $table_data; + } + + /** + * Categorize the plugins which have open actions into views for the TGMPA page. + * + * @since 2.5.0 + */ + protected function categorize_plugins_to_views() { + $plugins = array( + 'all' => array(), // Meaning: all plugins which still have open actions. + 'install' => array(), + 'update' => array(), + 'activate' => array(), + ); + + foreach ( $this->tgmpa->plugins as $slug => $plugin ) { + if ( $this->tgmpa->is_plugin_active( $slug ) && false === $this->tgmpa->does_plugin_have_update( $slug ) ) { + // No need to display plugins if they are installed, up-to-date and active. + continue; + } else { + $plugins['all'][ $slug ] = $plugin; + + if ( ! $this->tgmpa->is_plugin_installed( $slug ) ) { + $plugins['install'][ $slug ] = $plugin; + } else { + if ( false !== $this->tgmpa->does_plugin_have_update( $slug ) ) { + $plugins['update'][ $slug ] = $plugin; + } + + if ( $this->tgmpa->can_plugin_activate( $slug ) ) { + $plugins['activate'][ $slug ] = $plugin; + } + } + } + } + + return $plugins; + } + + /** + * Set the counts for the view links. + * + * @since 2.5.0 + * + * @param array $plugins Plugins order by view. + */ + protected function set_view_totals( $plugins ) { + foreach ( $plugins as $type => $list ) { + $this->view_totals[ $type ] = count( $list ); + } + } + + /** + * Get the plugin required/recommended text string. + * + * @since 2.5.0 + * + * @param string $required Plugin required setting. + * @return string + */ + protected function get_plugin_advise_type_text( $required ) { + if ( true === $required ) { + return __( 'Required', 'tgmpa' ); + } + + return __( 'Recommended', 'tgmpa' ); + } + + /** + * Get the plugin source type text string. + * + * @since 2.5.0 + * + * @param string $type Plugin type. + * @return string + */ + protected function get_plugin_source_type_text( $type ) { + $string = ''; + + switch ( $type ) { + case 'repo': + $string = __( 'WordPress Repository', 'tgmpa' ); + break; + case 'external': + $string = __( 'External Source', 'tgmpa' ); + break; + case 'bundled': + $string = __( 'Pre-Packaged', 'tgmpa' ); + break; + } + + return $string; + } + + /** + * Determine the plugin status message. + * + * @since 2.5.0 + * + * @param string $slug Plugin slug. + * @return string + */ + protected function get_plugin_status_text( $slug ) { + if ( ! $this->tgmpa->is_plugin_installed( $slug ) ) { + return __( 'Not Installed', 'tgmpa' ); + } + + if ( ! $this->tgmpa->is_plugin_active( $slug ) ) { + $install_status = __( 'Installed But Not Activated', 'tgmpa' ); + } else { + $install_status = __( 'Active', 'tgmpa' ); + } + + $update_status = ''; + + if ( $this->tgmpa->does_plugin_require_update( $slug ) && false === $this->tgmpa->does_plugin_have_update( $slug ) ) { + $update_status = __( 'Required Update not Available', 'tgmpa' ); + + } elseif ( $this->tgmpa->does_plugin_require_update( $slug ) ) { + $update_status = __( 'Requires Update', 'tgmpa' ); + + } elseif ( false !== $this->tgmpa->does_plugin_have_update( $slug ) ) { + $update_status = __( 'Update recommended', 'tgmpa' ); + } + + if ( '' === $update_status ) { + return $install_status; + } + + return sprintf( + /* translators: 1: install status, 2: update status */ + _x( '%1$s, %2$s', 'Install/Update Status', 'tgmpa' ), + $install_status, + $update_status + ); + } + + /** + * Sort plugins by Required/Recommended type and by alphabetical plugin name within each type. + * + * @since 2.5.0 + * + * @param array $items Prepared table items. + * @return array Sorted table items. + */ + public function sort_table_items( $items ) { + $type = array(); + $name = array(); + + foreach ( $items as $i => $plugin ) { + $type[ $i ] = $plugin['type']; // Required / recommended. + $name[ $i ] = $plugin['sanitized_plugin']; + } + + array_multisort( $type, SORT_DESC, $name, SORT_ASC, $items ); + + return $items; + } + + /** + * Get an associative array ( id => link ) of the views available on this table. + * + * @since 2.5.0 + * + * @return array + */ + public function get_views() { + $status_links = array(); + + foreach ( $this->view_totals as $type => $count ) { + if ( $count < 1 ) { + continue; + } + + switch ( $type ) { + case 'all': + /* translators: 1: number of plugins. */ + $text = _nx( 'All (%s)', 'All (%s)', $count, 'plugins', 'tgmpa' ); + break; + case 'install': + /* translators: 1: number of plugins. */ + $text = _n( 'To Install (%s)', 'To Install (%s)', $count, 'tgmpa' ); + break; + case 'update': + /* translators: 1: number of plugins. */ + $text = _n( 'Update Available (%s)', 'Update Available (%s)', $count, 'tgmpa' ); + break; + case 'activate': + /* translators: 1: number of plugins. */ + $text = _n( 'To Activate (%s)', 'To Activate (%s)', $count, 'tgmpa' ); + break; + default: + $text = ''; + break; + } + + if ( ! empty( $text ) ) { + + $status_links[ $type ] = sprintf( + '%s', + esc_url( $this->tgmpa->get_tgmpa_status_url( $type ) ), + ( $type === $this->view_context ) ? ' class="current"' : '', + sprintf( $text, number_format_i18n( $count ) ) + ); + } + } + + return $status_links; + } + + /** + * Create default columns to display important plugin information + * like type, action and status. + * + * @since 2.2.0 + * + * @param array $item Array of item data. + * @param string $column_name The name of the column. + * @return string + */ + public function column_default( $item, $column_name ) { + return $item[ $column_name ]; + } + + /** + * Required for bulk installing. + * + * Adds a checkbox for each plugin. + * + * @since 2.2.0 + * + * @param array $item Array of item data. + * @return string The input checkbox with all necessary info. + */ + public function column_cb( $item ) { + return sprintf( + '', + esc_attr( $this->_args['singular'] ), + esc_attr( $item['slug'] ), + esc_attr( $item['sanitized_plugin'] ) + ); + } + + /** + * Create default title column along with the action links. + * + * @since 2.2.0 + * + * @param array $item Array of item data. + * @return string The plugin name and action links. + */ + public function column_plugin( $item ) { + return sprintf( + '%1$s %2$s', + $item['plugin'], + $this->row_actions( $this->get_row_actions( $item ), true ) + ); + } + + /** + * Create version information column. + * + * @since 2.5.0 + * + * @param array $item Array of item data. + * @return string HTML-formatted version information. + */ + public function column_version( $item ) { + $output = array(); + + if ( $this->tgmpa->is_plugin_installed( $item['slug'] ) ) { + $installed = ! empty( $item['installed_version'] ) ? $item['installed_version'] : _x( 'unknown', 'as in: "version nr unknown"', 'tgmpa' ); + + $color = ''; + if ( ! empty( $item['minimum_version'] ) && $this->tgmpa->does_plugin_require_update( $item['slug'] ) ) { + $color = ' color: #ff0000; font-weight: bold;'; + } + + $output[] = sprintf( + '

%2$s' . __( 'Installed version:', 'tgmpa' ) . '

', + $color, + $installed + ); + } + + if ( ! empty( $item['minimum_version'] ) ) { + $output[] = sprintf( + '

%1$s' . __( 'Minimum required version:', 'tgmpa' ) . '

', + $item['minimum_version'] + ); + } + + if ( ! empty( $item['available_version'] ) ) { + $color = ''; + if ( ! empty( $item['minimum_version'] ) && version_compare( $item['available_version'], $item['minimum_version'], '>=' ) ) { + $color = ' color: #71C671; font-weight: bold;'; + } + + $output[] = sprintf( + '

%2$s' . __( 'Available version:', 'tgmpa' ) . '

', + $color, + $item['available_version'] + ); + } + + if ( empty( $output ) ) { + return ' '; // Let's not break the table layout. + } else { + return implode( "\n", $output ); + } + } + + /** + * Sets default message within the plugins table if no plugins + * are left for interaction. + * + * Hides the menu item to prevent the user from clicking and + * getting a permissions error. + * + * @since 2.2.0 + */ + public function no_items() { + echo esc_html__( 'No plugins to install, update or activate.', 'tgmpa' ) . ' ' . esc_html__( 'Return to the Dashboard', 'tgmpa' ) . ''; + echo ''; + } + + /** + * Output all the column information within the table. + * + * @since 2.2.0 + * + * @return array $columns The column names. + */ + public function get_columns() { + $columns = array( + 'cb' => '', + 'plugin' => __( 'Plugin', 'tgmpa' ), + 'source' => __( 'Source', 'tgmpa' ), + 'type' => __( 'Type', 'tgmpa' ), + ); + + if ( 'all' === $this->view_context || 'update' === $this->view_context ) { + $columns['version'] = __( 'Version', 'tgmpa' ); + $columns['status'] = __( 'Status', 'tgmpa' ); + } + + return apply_filters( 'tgmpa_table_columns', $columns ); + } + + /** + * Get name of default primary column + * + * @since 2.5.0 / WP 4.3+ compatibility + * @access protected + * + * @return string + */ + protected function get_default_primary_column_name() { + return 'plugin'; + } + + /** + * Get the name of the primary column. + * + * @since 2.5.0 / WP 4.3+ compatibility + * @access protected + * + * @return string The name of the primary column. + */ + protected function get_primary_column_name() { + if ( method_exists( 'WP_List_Table', 'get_primary_column_name' ) ) { + return parent::get_primary_column_name(); + } else { + return $this->get_default_primary_column_name(); + } + } + + /** + * Get the actions which are relevant for a specific plugin row. + * + * @since 2.5.0 + * + * @param array $item Array of item data. + * @return array Array with relevant action links. + */ + protected function get_row_actions( $item ) { + $actions = array(); + $action_links = array(); + + // Display the 'Install' action link if the plugin is not yet available. + if ( ! $this->tgmpa->is_plugin_installed( $item['slug'] ) ) { + /* translators: %2$s: plugin name in screen reader markup */ + $actions['install'] = __( 'Install %2$s', 'tgmpa' ); + } else { + // Display the 'Update' action link if an update is available and WP complies with plugin minimum. + if ( false !== $this->tgmpa->does_plugin_have_update( $item['slug'] ) && $this->tgmpa->can_plugin_update( $item['slug'] ) ) { + /* translators: %2$s: plugin name in screen reader markup */ + $actions['update'] = __( 'Update %2$s', 'tgmpa' ); + } + + // Display the 'Activate' action link, but only if the plugin meets the minimum version. + if ( $this->tgmpa->can_plugin_activate( $item['slug'] ) ) { + /* translators: %2$s: plugin name in screen reader markup */ + $actions['activate'] = __( 'Activate %2$s', 'tgmpa' ); + } + } + + // Create the actual links. + foreach ( $actions as $action => $text ) { + $nonce_url = wp_nonce_url( + add_query_arg( + array( + 'plugin' => urlencode( $item['slug'] ), + 'tgmpa-' . $action => $action . '-plugin', + ), + $this->tgmpa->get_tgmpa_url() + ), + 'tgmpa-' . $action, + 'tgmpa-nonce' + ); + + $action_links[ $action ] = sprintf( + '' . esc_html( $text ) . '', // $text contains the second placeholder. + esc_url( $nonce_url ), + '' . esc_html( $item['sanitized_plugin'] ) . '' + ); + } + + $prefix = ( defined( 'WP_NETWORK_ADMIN' ) && WP_NETWORK_ADMIN ) ? 'network_admin_' : ''; + return apply_filters( "tgmpa_{$prefix}plugin_action_links", array_filter( $action_links ), $item['slug'], $item, $this->view_context ); + } + + /** + * Generates content for a single row of the table. + * + * @since 2.5.0 + * + * @param object $item The current item. + */ + public function single_row( $item ) { + parent::single_row( $item ); + + /** + * Fires after each specific row in the TGMPA Plugins list table. + * + * The dynamic portion of the hook name, `$item['slug']`, refers to the slug + * for the plugin. + * + * @since 2.5.0 + */ + do_action( "tgmpa_after_plugin_row_{$item['slug']}", $item['slug'], $item, $this->view_context ); + } + + /** + * Show the upgrade notice below a plugin row if there is one. + * + * @since 2.5.0 + * + * @see /wp-admin/includes/update.php + * + * @param string $slug Plugin slug. + * @param array $item The information available in this table row. + * @return null Return early if upgrade notice is empty. + */ + public function wp_plugin_update_row( $slug, $item ) { + if ( empty( $item['upgrade_notice'] ) ) { + return; + } + + echo ' + + + '; + } + + /** + * Extra controls to be displayed between bulk actions and pagination. + * + * @since 2.5.0 + * + * @param string $which 'top' or 'bottom' table navigation. + */ + public function extra_tablenav( $which ) { + if ( 'bottom' === $which ) { + $this->tgmpa->show_tgmpa_version(); + } + } + + /** + * Defines the bulk actions for handling registered plugins. + * + * @since 2.2.0 + * + * @return array $actions The bulk actions for the plugin install table. + */ + public function get_bulk_actions() { + + $actions = array(); + + if ( 'update' !== $this->view_context && 'activate' !== $this->view_context ) { + if ( current_user_can( 'install_plugins' ) ) { + $actions['tgmpa-bulk-install'] = __( 'Install', 'tgmpa' ); + } + } + + if ( 'install' !== $this->view_context ) { + if ( current_user_can( 'update_plugins' ) ) { + $actions['tgmpa-bulk-update'] = __( 'Update', 'tgmpa' ); + } + if ( current_user_can( 'activate_plugins' ) ) { + $actions['tgmpa-bulk-activate'] = __( 'Activate', 'tgmpa' ); + } + } + + return $actions; + } + + /** + * Processes bulk installation and activation actions. + * + * The bulk installation process looks for the $_POST information and passes that + * through if a user has to use WP_Filesystem to enter their credentials. + * + * @since 2.2.0 + */ + public function process_bulk_actions() { + // Bulk installation process. + if ( 'tgmpa-bulk-install' === $this->current_action() || 'tgmpa-bulk-update' === $this->current_action() ) { + + check_admin_referer( 'bulk-' . $this->_args['plural'] ); + + $install_type = 'install'; + if ( 'tgmpa-bulk-update' === $this->current_action() ) { + $install_type = 'update'; + } + + $plugins_to_install = array(); + + // Did user actually select any plugins to install/update ? + if ( empty( $_POST['plugin'] ) ) { + if ( 'install' === $install_type ) { + $message = __( 'No plugins were selected to be installed. No action taken.', 'tgmpa' ); + } else { + $message = __( 'No plugins were selected to be updated. No action taken.', 'tgmpa' ); + } + + echo '

', esc_html( $message ), '

'; + + return false; + } + + if ( is_array( $_POST['plugin'] ) ) { + $plugins_to_install = (array) $_POST['plugin']; + } elseif ( is_string( $_POST['plugin'] ) ) { + // Received via Filesystem page - un-flatten array (WP bug #19643). + $plugins_to_install = explode( ',', $_POST['plugin'] ); + } + + // Sanitize the received input. + $plugins_to_install = array_map( 'urldecode', $plugins_to_install ); + $plugins_to_install = array_map( array( $this->tgmpa, 'sanitize_key' ), $plugins_to_install ); + + // Validate the received input. + foreach ( $plugins_to_install as $key => $slug ) { + // Check if the plugin was registered with TGMPA and remove if not. + if ( ! isset( $this->tgmpa->plugins[ $slug ] ) ) { + unset( $plugins_to_install[ $key ] ); + continue; + } + + // For install: make sure this is a plugin we *can* install and not one already installed. + if ( 'install' === $install_type && true === $this->tgmpa->is_plugin_installed( $slug ) ) { + unset( $plugins_to_install[ $key ] ); + } + + // For updates: make sure this is a plugin we *can* update (update available and WP version ok). + if ( 'update' === $install_type && false === $this->tgmpa->is_plugin_updatetable( $slug ) ) { + unset( $plugins_to_install[ $key ] ); + } + } + + // No need to proceed further if we have no plugins to handle. + if ( empty( $plugins_to_install ) ) { + if ( 'install' === $install_type ) { + $message = __( 'No plugins are available to be installed at this time.', 'tgmpa' ); + } else { + $message = __( 'No plugins are available to be updated at this time.', 'tgmpa' ); + } + + echo '

', esc_html( $message ), '

'; + + return false; + } + + // Pass all necessary information if WP_Filesystem is needed. + $url = wp_nonce_url( + $this->tgmpa->get_tgmpa_url(), + 'bulk-' . $this->_args['plural'] + ); + + // Give validated data back to $_POST which is the only place the filesystem looks for extra fields. + $_POST['plugin'] = implode( ',', $plugins_to_install ); // Work around for WP bug #19643. + + $method = ''; // Leave blank so WP_Filesystem can populate it as necessary. + $fields = array_keys( $_POST ); // Extra fields to pass to WP_Filesystem. + + if ( false === ( $creds = request_filesystem_credentials( esc_url_raw( $url ), $method, false, false, $fields ) ) ) { + return true; // Stop the normal page form from displaying, credential request form will be shown. + } + + // Now we have some credentials, setup WP_Filesystem. + if ( ! WP_Filesystem( $creds ) ) { + // Our credentials were no good, ask the user for them again. + request_filesystem_credentials( esc_url_raw( $url ), $method, true, false, $fields ); + + return true; + } + + /* If we arrive here, we have the filesystem */ + + // Store all information in arrays since we are processing a bulk installation. + $names = array(); + $sources = array(); // Needed for installs. + $file_paths = array(); // Needed for upgrades. + $to_inject = array(); // Information to inject into the update_plugins transient. + + // Prepare the data for validated plugins for the install/upgrade. + foreach ( $plugins_to_install as $slug ) { + $name = $this->tgmpa->plugins[ $slug ]['name']; + $source = $this->tgmpa->get_download_url( $slug ); + + if ( ! empty( $name ) && ! empty( $source ) ) { + $names[] = $name; + + switch ( $install_type ) { + + case 'install': + $sources[] = $source; + break; + + case 'update': + $file_paths[] = $this->tgmpa->plugins[ $slug ]['file_path']; + $to_inject[ $slug ] = $this->tgmpa->plugins[ $slug ]; + $to_inject[ $slug ]['source'] = $source; + break; + } + } + } + unset( $slug, $name, $source ); + + // Create a new instance of TGMPA_Bulk_Installer. + $installer = new TGMPA_Bulk_Installer( + new TGMPA_Bulk_Installer_Skin( + array( + 'url' => esc_url_raw( $this->tgmpa->get_tgmpa_url() ), + 'nonce' => 'bulk-' . $this->_args['plural'], + 'names' => $names, + 'install_type' => $install_type, + ) + ) + ); + + // Wrap the install process with the appropriate HTML. + echo '
', + '

', esc_html( get_admin_page_title() ), '

+
'; + + // Process the bulk installation submissions. + add_filter( 'upgrader_source_selection', array( $this->tgmpa, 'maybe_adjust_source_dir' ), 1, 3 ); + + if ( 'tgmpa-bulk-update' === $this->current_action() ) { + // Inject our info into the update transient. + $this->tgmpa->inject_update_info( $to_inject ); + + $installer->bulk_upgrade( $file_paths ); + } else { + $installer->bulk_install( $sources ); + } + + remove_filter( 'upgrader_source_selection', array( $this->tgmpa, 'maybe_adjust_source_dir' ), 1 ); + + echo '
'; + + return true; + } + + // Bulk activation process. + if ( 'tgmpa-bulk-activate' === $this->current_action() ) { + check_admin_referer( 'bulk-' . $this->_args['plural'] ); + + // Did user actually select any plugins to activate ? + if ( empty( $_POST['plugin'] ) ) { + echo '

', esc_html__( 'No plugins were selected to be activated. No action taken.', 'tgmpa' ), '

'; + + return false; + } + + // Grab plugin data from $_POST. + $plugins = array(); + if ( isset( $_POST['plugin'] ) ) { + $plugins = array_map( 'urldecode', (array) $_POST['plugin'] ); + $plugins = array_map( array( $this->tgmpa, 'sanitize_key' ), $plugins ); + } + + $plugins_to_activate = array(); + $plugin_names = array(); + + // Grab the file paths for the selected & inactive plugins from the registration array. + foreach ( $plugins as $slug ) { + if ( $this->tgmpa->can_plugin_activate( $slug ) ) { + $plugins_to_activate[] = $this->tgmpa->plugins[ $slug ]['file_path']; + $plugin_names[] = $this->tgmpa->plugins[ $slug ]['name']; + } + } + unset( $slug ); + + // Return early if there are no plugins to activate. + if ( empty( $plugins_to_activate ) ) { + echo '

', esc_html__( 'No plugins are available to be activated at this time.', 'tgmpa' ), '

'; + + return false; + } + + // Now we are good to go - let's start activating plugins. + $activate = activate_plugins( $plugins_to_activate ); + + if ( is_wp_error( $activate ) ) { + echo '

', wp_kses_post( $activate->get_error_message() ), '

'; + } else { + $count = count( $plugin_names ); // Count so we can use _n function. + $plugin_names = array_map( array( 'TGMPA_Utils', 'wrap_in_strong' ), $plugin_names ); + $last_plugin = array_pop( $plugin_names ); // Pop off last name to prep for readability. + $imploded = empty( $plugin_names ) ? $last_plugin : ( implode( ', ', $plugin_names ) . ' ' . esc_html_x( 'and', 'plugin A *and* plugin B', 'tgmpa' ) . ' ' . $last_plugin ); + + printf( // WPCS: xss ok. + '

%1$s %2$s.

', + esc_html( _n( 'The following plugin was activated successfully:', 'The following plugins were activated successfully:', $count, 'tgmpa' ) ), + $imploded + ); + + // Update recently activated plugins option. + $recent = (array) get_option( 'recently_activated' ); + foreach ( $plugins_to_activate as $plugin => $time ) { + if ( isset( $recent[ $plugin ] ) ) { + unset( $recent[ $plugin ] ); + } + } + update_option( 'recently_activated', $recent ); + } + + unset( $_POST ); // Reset the $_POST variable in case user wants to perform one action after another. + + return true; + } + + return false; + } + + /** + * Prepares all of our information to be outputted into a usable table. + * + * @since 2.2.0 + */ + public function prepare_items() { + $columns = $this->get_columns(); // Get all necessary column information. + $hidden = array(); // No columns to hide, but we must set as an array. + $sortable = array(); // No reason to make sortable columns. + $primary = $this->get_primary_column_name(); // Column which has the row actions. + $this->_column_headers = array( $columns, $hidden, $sortable, $primary ); // Get all necessary column headers. + + // Process our bulk activations here. + if ( 'tgmpa-bulk-activate' === $this->current_action() ) { + $this->process_bulk_actions(); + } + + // Store all of our plugin data into $items array so WP_List_Table can use it. + $this->items = apply_filters( 'tgmpa_table_data_items', $this->_gather_plugin_data() ); + } + + /* *********** DEPRECATED METHODS *********** */ + + /** + * Retrieve plugin data, given the plugin name. + * + * @since 2.2.0 + * @deprecated 2.5.0 use {@see TGM_Plugin_Activation::_get_plugin_data_from_name()} instead. + * @see TGM_Plugin_Activation::_get_plugin_data_from_name() + * + * @param string $name Name of the plugin, as it was registered. + * @param string $data Optional. Array key of plugin data to return. Default is slug. + * @return string|boolean Plugin slug if found, false otherwise. + */ + protected function _get_plugin_data_from_name( $name, $data = 'slug' ) { + _deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'TGM_Plugin_Activation::_get_plugin_data_from_name()' ); + + return $this->tgmpa->_get_plugin_data_from_name( $name, $data ); + } + } +} + + +if ( ! class_exists( 'TGM_Bulk_Installer' ) ) { + + /** + * Hack: Prevent TGMPA v2.4.1- bulk installer class from being loaded if 2.4.1- is loaded after 2.5+. + * + * @since 2.5.2 + * + * {@internal The TGMPA_Bulk_Installer class was originally called TGM_Bulk_Installer. + * For more information, see that class.}} + */ + class TGM_Bulk_Installer { + } +} +if ( ! class_exists( 'TGM_Bulk_Installer_Skin' ) ) { + + /** + * Hack: Prevent TGMPA v2.4.1- bulk installer skin class from being loaded if 2.4.1- is loaded after 2.5+. + * + * @since 2.5.2 + * + * {@internal The TGMPA_Bulk_Installer_Skin class was originally called TGM_Bulk_Installer_Skin. + * For more information, see that class.}} + */ + class TGM_Bulk_Installer_Skin { + } +} + +/** + * The WP_Upgrader file isn't always available. If it isn't available, + * we load it here. + * + * We check to make sure no action or activation keys are set so that WordPress + * does not try to re-include the class when processing upgrades or installs outside + * of the class. + * + * @since 2.2.0 + */ +add_action( 'admin_init', 'tgmpa_load_bulk_installer' ); +if ( ! function_exists( 'tgmpa_load_bulk_installer' ) ) { + /** + * Load bulk installer + */ + function tgmpa_load_bulk_installer() { + // Silently fail if 2.5+ is loaded *after* an older version. + if ( ! isset( $GLOBALS['tgmpa'] ) ) { + return; + } + + // Get TGMPA class instance. + $tgmpa_instance = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) ); + + if ( isset( $_GET['page'] ) && $tgmpa_instance->menu === $_GET['page'] ) { + if ( ! class_exists( 'Plugin_Upgrader', false ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + } + + if ( ! class_exists( 'TGMPA_Bulk_Installer' ) ) { + + /** + * Installer class to handle bulk plugin installations. + * + * Extends WP_Upgrader and customizes to suit the installation of multiple + * plugins. + * + * @since 2.2.0 + * + * {@internal Since 2.5.0 the class is an extension of Plugin_Upgrader rather than WP_Upgrader.}} + * {@internal Since 2.5.2 the class has been renamed from TGM_Bulk_Installer to TGMPA_Bulk_Installer. + * This was done to prevent backward compatibility issues with v2.3.6.}} + * + * @package TGM-Plugin-Activation + * @author Thomas Griffin + * @author Gary Jones + */ + class TGMPA_Bulk_Installer extends Plugin_Upgrader { + /** + * Holds result of bulk plugin installation. + * + * @since 2.2.0 + * + * @var string + */ + public $result; + + /** + * Flag to check if bulk installation is occurring or not. + * + * @since 2.2.0 + * + * @var boolean + */ + public $bulk = false; + + /** + * TGMPA instance + * + * @since 2.5.0 + * + * @var object + */ + protected $tgmpa; + + /** + * Whether or not the destination directory needs to be cleared ( = on update). + * + * @since 2.5.0 + * + * @var bool + */ + protected $clear_destination = false; + + /** + * References parent constructor and sets defaults for class. + * + * @since 2.2.0 + * + * @param \Bulk_Upgrader_Skin|null $skin Installer skin. + */ + public function __construct( $skin = null ) { + // Get TGMPA class instance. + $this->tgmpa = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) ); + + parent::__construct( $skin ); + + if ( isset( $this->skin->options['install_type'] ) && 'update' === $this->skin->options['install_type'] ) { + $this->clear_destination = true; + } + + if ( $this->tgmpa->is_automatic ) { + $this->activate_strings(); + } + + add_action( 'upgrader_process_complete', array( $this->tgmpa, 'populate_file_path' ) ); + } + + /** + * Sets the correct activation strings for the installer skin to use. + * + * @since 2.2.0 + */ + public function activate_strings() { + $this->strings['activation_failed'] = __( 'Plugin activation failed.', 'tgmpa' ); + $this->strings['activation_success'] = __( 'Plugin activated successfully.', 'tgmpa' ); + } + + /** + * Performs the actual installation of each plugin. + * + * @since 2.2.0 + * + * @see WP_Upgrader::run() + * + * @param array $options The installation config options. + * @return null|array Return early if error, array of installation data on success. + */ + public function run( $options ) { + $result = parent::run( $options ); + + // Reset the strings in case we changed one during automatic activation. + if ( $this->tgmpa->is_automatic ) { + if ( 'update' === $this->skin->options['install_type'] ) { + $this->upgrade_strings(); + } else { + $this->install_strings(); + } + } + + return $result; + } + + /** + * Processes the bulk installation of plugins. + * + * @since 2.2.0 + * + * {@internal This is basically a near identical copy of the WP Core + * Plugin_Upgrader::bulk_upgrade() method, with minor adjustments to deal with + * new installs instead of upgrades. + * For ease of future synchronizations, the adjustments are clearly commented, but no other + * comments are added. Code style has been made to comply.}} + * + * @see Plugin_Upgrader::bulk_upgrade() + * @see https://core.trac.wordpress.org/browser/tags/4.2.1/src/wp-admin/includes/class-wp-upgrader.php#L838 + * (@internal Last synced: Dec 31st 2015 against https://core.trac.wordpress.org/browser/trunk?rev=36134}} + * + * @param array $plugins The plugin sources needed for installation. + * @param array $args Arbitrary passed extra arguments. + * @return array|false Install confirmation messages on success, false on failure. + */ + public function bulk_install( $plugins, $args = array() ) { + // [TGMPA + ] Hook auto-activation in. + add_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 ); + + $defaults = array( + 'clear_update_cache' => true, + ); + $parsed_args = wp_parse_args( $args, $defaults ); + + $this->init(); + $this->bulk = true; + + $this->install_strings(); // [TGMPA + ] adjusted. + + /* [TGMPA - ] $current = get_site_transient( 'update_plugins' ); */ + + /* [TGMPA - ] add_filter('upgrader_clear_destination', array($this, 'delete_old_plugin'), 10, 4); */ + + $this->skin->header(); + + // Connect to the Filesystem first. + $res = $this->fs_connect( array( WP_CONTENT_DIR, WP_PLUGIN_DIR ) ); + if ( ! $res ) { + $this->skin->footer(); + return false; + } + + $this->skin->bulk_header(); + + /* + * Only start maintenance mode if: + * - running Multisite and there are one or more plugins specified, OR + * - a plugin with an update available is currently active. + * @TODO: For multisite, maintenance mode should only kick in for individual sites if at all possible. + */ + $maintenance = ( is_multisite() && ! empty( $plugins ) ); + + /* + [TGMPA - ] + foreach ( $plugins as $plugin ) + $maintenance = $maintenance || ( is_plugin_active( $plugin ) && isset( $current->response[ $plugin] ) ); + */ + if ( $maintenance ) { + $this->maintenance_mode( true ); + } + + $results = array(); + + $this->update_count = count( $plugins ); + $this->update_current = 0; + foreach ( $plugins as $plugin ) { + $this->update_current++; + + /* + [TGMPA - ] + $this->skin->plugin_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin, false, true); + + if ( !isset( $current->response[ $plugin ] ) ) { + $this->skin->set_result('up_to_date'); + $this->skin->before(); + $this->skin->feedback('up_to_date'); + $this->skin->after(); + $results[$plugin] = true; + continue; + } + + // Get the URL to the zip file. + $r = $current->response[ $plugin ]; + + $this->skin->plugin_active = is_plugin_active($plugin); + */ + + $result = $this->run( + array( + 'package' => $plugin, // [TGMPA + ] adjusted. + 'destination' => WP_PLUGIN_DIR, + 'clear_destination' => false, // [TGMPA + ] adjusted. + 'clear_working' => true, + 'is_multi' => true, + 'hook_extra' => array( + 'plugin' => $plugin, + ), + ) + ); + + $results[ $plugin ] = $this->result; + + // Prevent credentials auth screen from displaying multiple times. + if ( false === $result ) { + break; + } + } //end foreach $plugins + + $this->maintenance_mode( false ); + + /** + * Fires when the bulk upgrader process is complete. + * + * @since WP 3.6.0 / TGMPA 2.5.0 + * + * @param Plugin_Upgrader $this Plugin_Upgrader instance. In other contexts, $this, might + * be a Theme_Upgrader or Core_Upgrade instance. + * @param array $data { + * Array of bulk item update data. + * + * @type string $action Type of action. Default 'update'. + * @type string $type Type of update process. Accepts 'plugin', 'theme', or 'core'. + * @type bool $bulk Whether the update process is a bulk update. Default true. + * @type array $packages Array of plugin, theme, or core packages to update. + * } + */ + do_action( 'upgrader_process_complete', $this, array( + 'action' => 'install', // [TGMPA + ] adjusted. + 'type' => 'plugin', + 'bulk' => true, + 'plugins' => $plugins, + ) ); + + $this->skin->bulk_footer(); + + $this->skin->footer(); + + // Cleanup our hooks, in case something else does a upgrade on this connection. + /* [TGMPA - ] remove_filter('upgrader_clear_destination', array($this, 'delete_old_plugin')); */ + + // [TGMPA + ] Remove our auto-activation hook. + remove_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 ); + + // Force refresh of plugin update information. + wp_clean_plugins_cache( $parsed_args['clear_update_cache'] ); + + return $results; + } + + /** + * Handle a bulk upgrade request. + * + * @since 2.5.0 + * + * @see Plugin_Upgrader::bulk_upgrade() + * + * @param array $plugins The local WP file_path's of the plugins which should be upgraded. + * @param array $args Arbitrary passed extra arguments. + * @return string|bool Install confirmation messages on success, false on failure. + */ + public function bulk_upgrade( $plugins, $args = array() ) { + + add_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 ); + + $result = parent::bulk_upgrade( $plugins, $args ); + + remove_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 ); + + return $result; + } + + /** + * Abuse a filter to auto-activate plugins after installation. + * + * Hooked into the 'upgrader_post_install' filter hook. + * + * @since 2.5.0 + * + * @param bool $bool The value we need to give back (true). + * @return bool + */ + public function auto_activate( $bool ) { + // Only process the activation of installed plugins if the automatic flag is set to true. + if ( $this->tgmpa->is_automatic ) { + // Flush plugins cache so the headers of the newly installed plugins will be read correctly. + wp_clean_plugins_cache(); + + // Get the installed plugin file. + $plugin_info = $this->plugin_info(); + + // Don't try to activate on upgrade of active plugin as WP will do this already. + if ( ! is_plugin_active( $plugin_info ) ) { + $activate = activate_plugin( $plugin_info ); + + // Adjust the success string based on the activation result. + $this->strings['process_success'] = $this->strings['process_success'] . "
\n"; + + if ( is_wp_error( $activate ) ) { + $this->skin->error( $activate ); + $this->strings['process_success'] .= $this->strings['activation_failed']; + } else { + $this->strings['process_success'] .= $this->strings['activation_success']; + } + } + } + + return $bool; + } + } + } + + if ( ! class_exists( 'TGMPA_Bulk_Installer_Skin' ) ) { + + /** + * Installer skin to set strings for the bulk plugin installations.. + * + * Extends Bulk_Upgrader_Skin and customizes to suit the installation of multiple + * plugins. + * + * @since 2.2.0 + * + * {@internal Since 2.5.2 the class has been renamed from TGM_Bulk_Installer_Skin to + * TGMPA_Bulk_Installer_Skin. + * This was done to prevent backward compatibility issues with v2.3.6.}} + * + * @see https://core.trac.wordpress.org/browser/trunk/src/wp-admin/includes/class-wp-upgrader-skins.php + * + * @package TGM-Plugin-Activation + * @author Thomas Griffin + * @author Gary Jones + */ + class TGMPA_Bulk_Installer_Skin extends Bulk_Upgrader_Skin { + /** + * Holds plugin info for each individual plugin installation. + * + * @since 2.2.0 + * + * @var array + */ + public $plugin_info = array(); + + /** + * Holds names of plugins that are undergoing bulk installations. + * + * @since 2.2.0 + * + * @var array + */ + public $plugin_names = array(); + + /** + * Integer to use for iteration through each plugin installation. + * + * @since 2.2.0 + * + * @var integer + */ + public $i = 0; + + /** + * TGMPA instance + * + * @since 2.5.0 + * + * @var object + */ + protected $tgmpa; + + /** + * Constructor. Parses default args with new ones and extracts them for use. + * + * @since 2.2.0 + * + * @param array $args Arguments to pass for use within the class. + */ + public function __construct( $args = array() ) { + // Get TGMPA class instance. + $this->tgmpa = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) ); + + // Parse default and new args. + $defaults = array( + 'url' => '', + 'nonce' => '', + 'names' => array(), + 'install_type' => 'install', + ); + $args = wp_parse_args( $args, $defaults ); + + // Set plugin names to $this->plugin_names property. + $this->plugin_names = $args['names']; + + // Extract the new args. + parent::__construct( $args ); + } + + /** + * Sets install skin strings for each individual plugin. + * + * Checks to see if the automatic activation flag is set and uses the + * the proper strings accordingly. + * + * @since 2.2.0 + */ + public function add_strings() { + if ( 'update' === $this->options['install_type'] ) { + parent::add_strings(); + /* translators: 1: plugin name, 2: action number 3: total number of actions. */ + $this->upgrader->strings['skin_before_update_header'] = __( 'Updating Plugin %1$s (%2$d/%3$d)', 'tgmpa' ); + } else { + /* translators: 1: plugin name, 2: error message. */ + $this->upgrader->strings['skin_update_failed_error'] = __( 'An error occurred while installing %1$s: %2$s.', 'tgmpa' ); + /* translators: 1: plugin name. */ + $this->upgrader->strings['skin_update_failed'] = __( 'The installation of %1$s failed.', 'tgmpa' ); + + if ( $this->tgmpa->is_automatic ) { + // Automatic activation strings. + $this->upgrader->strings['skin_upgrade_start'] = __( 'The installation and activation process is starting. This process may take a while on some hosts, so please be patient.', 'tgmpa' ); + /* translators: 1: plugin name. */ + $this->upgrader->strings['skin_update_successful'] = __( '%1$s installed and activated successfully.', 'tgmpa' ) . ' ' . esc_html__( 'Show Details', 'tgmpa' ) . '.'; + $this->upgrader->strings['skin_upgrade_end'] = __( 'All installations and activations have been completed.', 'tgmpa' ); + /* translators: 1: plugin name, 2: action number 3: total number of actions. */ + $this->upgrader->strings['skin_before_update_header'] = __( 'Installing and Activating Plugin %1$s (%2$d/%3$d)', 'tgmpa' ); + } else { + // Default installation strings. + $this->upgrader->strings['skin_upgrade_start'] = __( 'The installation process is starting. This process may take a while on some hosts, so please be patient.', 'tgmpa' ); + /* translators: 1: plugin name. */ + $this->upgrader->strings['skin_update_successful'] = esc_html__( '%1$s installed successfully.', 'tgmpa' ) . ' ' . esc_html__( 'Show Details', 'tgmpa' ) . '.'; + $this->upgrader->strings['skin_upgrade_end'] = __( 'All installations have been completed.', 'tgmpa' ); + /* translators: 1: plugin name, 2: action number 3: total number of actions. */ + $this->upgrader->strings['skin_before_update_header'] = __( 'Installing Plugin %1$s (%2$d/%3$d)', 'tgmpa' ); + } + } + } + + /** + * Outputs the header strings and necessary JS before each plugin installation. + * + * @since 2.2.0 + * + * @param string $title Unused in this implementation. + */ + public function before( $title = '' ) { + if ( empty( $title ) ) { + $title = esc_html( $this->plugin_names[ $this->i ] ); + } + parent::before( $title ); + } + + /** + * Outputs the footer strings and necessary JS after each plugin installation. + * + * Checks for any errors and outputs them if they exist, else output + * success strings. + * + * @since 2.2.0 + * + * @param string $title Unused in this implementation. + */ + public function after( $title = '' ) { + if ( empty( $title ) ) { + $title = esc_html( $this->plugin_names[ $this->i ] ); + } + parent::after( $title ); + + $this->i++; + } + + /** + * Outputs links after bulk plugin installation is complete. + * + * @since 2.2.0 + */ + public function bulk_footer() { + // Serve up the string to say installations (and possibly activations) are complete. + parent::bulk_footer(); + + // Flush plugins cache so we can make sure that the installed plugins list is always up to date. + wp_clean_plugins_cache(); + + $this->tgmpa->show_tgmpa_version(); + + // Display message based on if all plugins are now active or not. + $update_actions = array(); + + if ( $this->tgmpa->is_tgmpa_complete() ) { + // All plugins are active, so we display the complete string and hide the menu to protect users. + echo ''; + $update_actions['dashboard'] = sprintf( + esc_html( $this->tgmpa->strings['complete'] ), + '' . esc_html__( 'Return to the Dashboard', 'tgmpa' ) . '' + ); + } else { + $update_actions['tgmpa_page'] = '' . esc_html( $this->tgmpa->strings['return'] ) . ''; + } + + /** + * Filter the list of action links available following bulk plugin installs/updates. + * + * @since 2.5.0 + * + * @param array $update_actions Array of plugin action links. + * @param array $plugin_info Array of information for the last-handled plugin. + */ + $update_actions = apply_filters( 'tgmpa_update_bulk_plugins_complete_actions', $update_actions, $this->plugin_info ); + + if ( ! empty( $update_actions ) ) { + $this->feedback( implode( ' | ', (array) $update_actions ) ); + } + } + + /* *********** DEPRECATED METHODS *********** */ + + /** + * Flush header output buffer. + * + * @since 2.2.0 + * @deprecated 2.5.0 use {@see Bulk_Upgrader_Skin::flush_output()} instead + * @see Bulk_Upgrader_Skin::flush_output() + */ + public function before_flush_output() { + _deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'Bulk_Upgrader_Skin::flush_output()' ); + $this->flush_output(); + } + + /** + * Flush footer output buffer and iterate $this->i to make sure the + * installation strings reference the correct plugin. + * + * @since 2.2.0 + * @deprecated 2.5.0 use {@see Bulk_Upgrader_Skin::flush_output()} instead + * @see Bulk_Upgrader_Skin::flush_output() + */ + public function after_flush_output() { + _deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'Bulk_Upgrader_Skin::flush_output()' ); + $this->flush_output(); + $this->i++; + } + } + } + } + } +} + +if ( ! class_exists( 'TGMPA_Utils' ) ) { + + /** + * Generic utilities for TGMPA. + * + * All methods are static, poor-dev name-spacing class wrapper. + * + * Class was called TGM_Utils in 2.5.0 but renamed TGMPA_Utils in 2.5.1 as this was conflicting with Soliloquy. + * + * @since 2.5.0 + * + * @package TGM-Plugin-Activation + * @author Juliette Reinders Folmer + */ + class TGMPA_Utils { + /** + * Whether the PHP filter extension is enabled. + * + * @see http://php.net/book.filter + * + * @since 2.5.0 + * + * @static + * + * @var bool $has_filters True is the extension is enabled. + */ + public static $has_filters; + + /** + * Wrap an arbitrary string in tags. Meant to be used in combination with array_map(). + * + * @since 2.5.0 + * + * @static + * + * @param string $string Text to be wrapped. + * @return string + */ + public static function wrap_in_em( $string ) { + return '' . wp_kses_post( $string ) . ''; + } + + /** + * Wrap an arbitrary string in tags. Meant to be used in combination with array_map(). + * + * @since 2.5.0 + * + * @static + * + * @param string $string Text to be wrapped. + * @return string + */ + public static function wrap_in_strong( $string ) { + return '' . wp_kses_post( $string ) . ''; + } + + /** + * Helper function: Validate a value as boolean + * + * @since 2.5.0 + * + * @static + * + * @param mixed $value Arbitrary value. + * @return bool + */ + public static function validate_bool( $value ) { + if ( ! isset( self::$has_filters ) ) { + self::$has_filters = extension_loaded( 'filter' ); + } + + if ( self::$has_filters ) { + return filter_var( $value, FILTER_VALIDATE_BOOLEAN ); + } else { + return self::emulate_filter_bool( $value ); + } + } + + /** + * Helper function: Cast a value to bool + * + * @since 2.5.0 + * + * @static + * + * @param mixed $value Value to cast. + * @return bool + */ + protected static function emulate_filter_bool( $value ) { + // @codingStandardsIgnoreStart + static $true = array( + '1', + 'true', 'True', 'TRUE', + 'y', 'Y', + 'yes', 'Yes', 'YES', + 'on', 'On', 'ON', + ); + static $false = array( + '0', + 'false', 'False', 'FALSE', + 'n', 'N', + 'no', 'No', 'NO', + 'off', 'Off', 'OFF', + ); + // @codingStandardsIgnoreEnd + + if ( is_bool( $value ) ) { + return $value; + } elseif ( is_int( $value ) && ( 0 === $value || 1 === $value ) ) { + return (bool) $value; + } elseif ( ( is_float( $value ) && ! is_nan( $value ) ) && ( (float) 0 === $value || (float) 1 === $value ) ) { + return (bool) $value; + } elseif ( is_string( $value ) ) { + $value = trim( $value ); + if ( in_array( $value, $true, true ) ) { + return true; + } elseif ( in_array( $value, $false, true ) ) { + return false; + } else { + return false; + } + } + + return false; + } + } // End of class TGMPA_Utils +} // End of class_exists wrapper diff --git a/lib/composer.json b/lib/composer.json new file mode 100644 index 0000000..ae2102d --- /dev/null +++ b/lib/composer.json @@ -0,0 +1,38 @@ +{ + "name": "seothemes/child-theme-library", + "type": "library", + "description": "A lightweight drop-in library for extending Genesis child themes.", + "keywords": [ + "wordpress", + "wordpress-theme", + "genesis-framework" + ], + "license": "GPL-2.0", + "authors": [ + { + "name": "SEO Themes", + "homepage": "https://seothemes.com", + "role": "Developer" + } + ], + "support": { + "issues": "https://github.com/seothemes/child-theme-library/issues", + "source": "https://github.com/seothemes/child-theme-library" + }, + "require": {}, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4", + "squizlabs/php_codesniffer": "^3.2.3", + "wp-coding-standards/wpcs": "^0.14.1", + "roave/security-advisories": "dev-master" + }, + "suggest": { + "kint-php/kint": "^2.2", + "filp/whoops": "^2.1" + }, + "config": { + "sort-order": true + }, + "minimum-stability": "dev", + "prefer-stable": true +} \ No newline at end of file diff --git a/lib/css/customizer.css b/lib/css/customizer.css new file mode 100644 index 0000000..3f3e579 --- /dev/null +++ b/lib/css/customizer.css @@ -0,0 +1,128 @@ +.no-widget-areas-rendered-notice p:nth-of-type(1) { + display: none !important +} + +.no-widget-areas-rendered-notice p:nth-of-type(2) { + margin-top: 0 !important +} + +.customize-control-alpha-color .wp-picker-container .iris-picker { + border-bottom: none +} + +.customize-control-alpha-color .wp-picker-container { + max-width: 257px +} + +.customize-control-alpha-color .wp-picker-open + .wp-picker-input-wrap { + width: 100% +} + +.customize-control-alpha-color .wp-picker-input-wrap input[type=text].wp-color-picker.alpha-color-control { + float: left; + width: 195px +} + +.customize-control-alpha-color .wp-picker-input-wrap .button { + margin-left: 0; + float: right +} + +.wp-picker-container .wp-picker-open ~ .wp-picker-holder .alpha-color-picker-container { + display: block +} + +.alpha-color-picker-container { + border: 1px solid #dfdfdf; + border-top: none; + display: none; + background: #FFF; + padding: 0 11px 10px; + position: relative +} + +.alpha-color-picker-container .ui-widget-content, .alpha-color-picker-container .ui-widget-header, .alpha-color-picker-wrap .ui-state-focus { + background: 0 0; + border: none +} + +.alpha-color-picker-wrap a.iris-square-value:focus { + -webkit-box-shadow: none; + box-shadow: none +} + +.alpha-color-picker-container .ui-slider { + position: relative; + z-index: 1; + height: 24px; + text-align: center; + margin: 0 auto; + width: 88%; + width: calc(100% - 28px) +} + +.alpha-color-picker-container .ui-slider-handle, .alpha-color-picker-container .ui-widget-content .ui-state-default { + color: #777; + background-color: #FFF; + text-shadow: 0 1px 0 #FFF; + text-decoration: none; + position: absolute; + z-index: 2; + box-shadow: 0 1px 2px rgba(0, 0, 0, .2); + border: 1px solid #aaa; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + margin-top: -2px; + top: 0; + height: 26px; + width: 26px; + cursor: ew-resize; + font-size: 0; + padding: 0; + line-height: 27px; + margin-left: -14px +} + +.alpha-color-picker-container .ui-slider-handle.show-opacity { + font-size: 12px +} + +.alpha-color-picker-container .click-zone { + width: 14px; + height: 24px; + display: block; + position: absolute; + left: 10px +} + +.alpha-color-picker-container .max-click-zone { + right: 10px; + left: auto +} + +.alpha-color-picker-container .transparency { + height: 24px; + width: 100%; + background-color: #FFF; + background-image: url(../../images/transparency-grid.png); + box-shadow: 0 0 5px rgba(0, 0, 0, .4) inset; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + padding: 0; + margin-top: -24px +} + +@media only screen and (max-width: 782px) { + .customize-control-alpha-color .wp-picker-input-wrap input[type=text].wp-color-picker.alpha-color-control { + width: 184px + } +} + +@media only screen and (max-width: 640px) { + .customize-control-alpha-color .wp-picker-input-wrap input[type=text].wp-color-picker.alpha-color-control { + width: 172px; + height: 33px + } +} \ No newline at end of file diff --git a/lib/css/load-styles.php b/lib/css/load-styles.php new file mode 100644 index 0000000..d923276 --- /dev/null +++ b/lib/css/load-styles.php @@ -0,0 +1,51 @@ + $params ) { + + wp_enqueue_style( 'child-theme-' . $style, $params['src'], $params['deps'], $params['ver'], $params['media'] ); + + } + + foreach ( $config['google-fonts'] as $google_font ) { + + $google_fonts[] = $google_font; + + } + + wp_enqueue_style( 'child-theme-google-fonts', '//fonts.googleapis.com/css?family=' . implode( '|', $google_fonts ), array(), CHILD_THEME_VERSION ); + + add_filter( 'genesis_portfolio_load_default_styles', '__return_false' ); + +} diff --git a/lib/functions/attributes.php b/lib/functions/attributes.php new file mode 100644 index 0000000..a46226a --- /dev/null +++ b/lib/functions/attributes.php @@ -0,0 +1,174 @@ + $menu->term_id, + ) ); + + } + + if ( $home && $blog ) { + + update_option( 'show_on_front', 'page' ); + update_option( 'page_on_front', $home->ID ); + update_option( 'page_for_posts', $blog->ID ); + + } + + if ( $shop ) { + + update_option( 'woocommerce_shop_page_id', $shop->ID ); + + } + + // Trash "Hello World" post. + wp_delete_post( 1 ); + + // Update permalink structure. + global $wp_rewrite; + $wp_rewrite->set_permalink_structure( '/%postname%/' ); + $wp_rewrite->flush_rules(); + +} diff --git a/lib/functions/general.php b/lib/functions/general.php new file mode 100644 index 0000000..3eb2e0c --- /dev/null +++ b/lib/functions/general.php @@ -0,0 +1,73 @@ + '

', + 'close' => '

', + 'content' => get_the_title( wc_get_page_id( 'shop' ) ), + 'context' => 'entry-title', + ) ); + + } elseif ( is_home() && 'posts' === get_option( 'show_on_front' ) ) { + + genesis_markup( array( + 'open' => '

', + 'close' => '

', + 'content' => apply_filters( 'child_theme_latest_posts_title', __( 'Latest Posts', 'child-theme-library' ) ), + 'context' => 'entry-title', + ) ); + + } elseif ( is_404() ) { + + genesis_markup( array( + 'open' => '

', + 'close' => '

', + 'content' => apply_filters( 'genesis_404_entry_title', __( 'Not found, error 404', 'child-theme-library' ) ), + 'context' => 'entry-title', + ) ); + + } elseif ( is_search() ) { + + genesis_markup( array( + 'open' => '

', + 'close' => '

', + 'content' => apply_filters( 'genesis_search_title_text', __( 'Search results for: ', 'child-theme-library' ) ) . get_search_query(), + 'context' => 'entry-title', + ) ); + + } elseif ( is_page_template( 'page_blog.php' ) ) { + + do_action( 'genesis_archive_title_descriptions', get_the_title(), '', 'posts-page-description' ); + + } elseif ( is_singular() ) { + + genesis_do_post_title(); + + } + +} + +/** + * Display page excerpt. + * + * Prints the correct excerpt on a per page basis. If on the WooCommerce shop + * page then the products result count is be displayed instead of the page + * excerpt. Also, if on a single product then no excerpt will be output. + * + * @since 1.0.0 + * + * @return void + */ +function child_theme_hero_section_excerpt() { + + if ( class_exists( 'WooCommerce' ) && is_shop() ) { + + woocommerce_result_count(); + + } elseif ( is_home() && 'posts' === get_option( 'show_on_front' ) ) { + + printf( '

%s

', apply_filters( 'child_theme_latest_posts_excerpt', 'Showing the latest posts' ) ); + + } elseif ( is_search() ) { + + $id = get_page_by_path( 'search' ); + + if ( has_excerpt( $id ) ) { + + printf( '

%s

', do_shortcode( get_the_excerpt( $id ) ) ); + + } + } elseif ( is_404() ) { + + $id = get_page_by_path( 'error' ); + + if ( has_excerpt( $id ) ) { + + printf( '

%s

', do_shortcode( get_the_excerpt( $id ) ) ); + + } + } elseif ( ( is_singular() ) && ! is_singular( 'product' ) && has_excerpt() ) { + + printf( '

%s

', do_shortcode( get_the_excerpt() ) ); + + } +} + +/** + * Display the hero section. + * + * Conditionally outputs the opening and closing hero section markup and runs + * the hero_section hook which all of our hero functions are hooked to. + * + * @since 1.0.0 + * + * @return void + */ +function child_theme_hero_section_display() { + + // Output hero section markup. + genesis_markup( array( + 'open' => '
', + 'context' => 'hero-section', + ) ); + + /** + * Do hero section hook. + * + * @hooked child_theme_hero_section_title - 10 + * @hooked child_theme_hero_section_excerpt - 20 + * @hooked genesis_do_posts_page_heading + * @hooked genesis_do_date_archive_title + * @hooked genesis_do_blog_template_heading + * @hooked genesis_do_taxonomy_title_description + * @hooked genesis_do_author_title_description + * @hooked genesis_do_cpt_archive_title_description + */ + do_action( 'child_theme_hero_section' ); + + // Output hero section markup. + genesis_markup( array( + 'close' => '
', + 'context' => 'hero-section', + ) ); + +} diff --git a/lib/functions/layout.php b/lib/functions/layout.php new file mode 100644 index 0000000..11c6501 --- /dev/null +++ b/lib/functions/layout.php @@ -0,0 +1,142 @@ + ucwords( str_replace( '-', ' ', $custom_layout ) ), + 'img' => CHILD_THEME_ASSETS . '/images/' . $custom_layout . '.gif', + ) ); + + } + +} + +add_filter( 'genesis_site_layout', 'child_theme_search_page_layout' ); +/** + * Gets a custom page layout for the search results page. + * + * @since 1.0.0 + * + * @param string $layout Layout to return. + * + * @return string + */ +function child_theme_search_page_layout( $layout ) { + + if ( is_search() ) { + + $page = get_page_by_path( 'search' ); + + if ( $page ) { + + $field = genesis_get_custom_field( '_genesis_layout', $page->ID ); + $layout = $field ? $field : genesis_get_option( 'site_layout' ); + + } + + } + + return $layout; + +} + +add_filter( 'genesis_site_layout', 'child_theme_error_404_page_layout' ); +/** + * Gets a custom page layout for the error 404 page. + * + * @since 1.0.0 + * + * @param string $layout Layout to return. + * + * @return string + */ +function child_theme_error_404_page_layout( $layout ) { + + if ( is_404() ) { + + $page = get_page_by_path( 'error-404' ); + + if ( $page ) { + + $field = genesis_get_custom_field( '_genesis_layout', $page->ID ); + $layout = $field ? $field : genesis_get_option( 'site_layout' ); + + } + + } + + return $layout; + +} + +add_action( 'genesis_before', 'child_theme_remove_narrow_sidebars' ); +/** + * Remove sidebars for narrow layout. + * + * @since 1.0.0 + * + * @return void + */ +function child_theme_remove_narrow_sidebars() { + + $site_layout = genesis_site_layout(); + + if ( 'center-content' !== $site_layout ) { + + return; + + } + + add_filter( 'genesis_site_layout', '__genesis_return_full_width_content' ); + +} diff --git a/lib/functions/markup.php b/lib/functions/markup.php new file mode 100644 index 0000000..a1336ec --- /dev/null +++ b/lib/functions/markup.php @@ -0,0 +1,105 @@ + 'Genesis Connect WooCommerce', + 'slug' => 'genesis-connect-woocommerce', + 'required' => true, + ); + + } + + $plugin_config = array( + 'id' => CHILD_THEME_HANDLE, + 'default_path' => '', + 'menu' => 'tgmpa-install-plugins', + 'has_notices' => true, + 'dismissable' => true, + 'dismiss_msg' => '', + 'is_automatic' => false, + 'message' => '', + ); + + tgmpa( $plugins, $plugin_config ); + +} + +add_filter( 'simple_social_default_styles', 'child_theme_ssi_default_styles' ); +/** + * Simple Social Icons default settings. + * + * @since 1.0.0 + * + * @param array $defaults Default Simple Social Icons settings. + * + * @return array Custom settings. + */ +function child_theme_ssi_default_styles( $defaults ) { + + $settings = child_theme_get_config( 'simple-social-icons' ); + + return wp_parse_args( $settings, $defaults ); + +} + +add_action( 'wp_head', 'child_theme_remove_ssi_inline_styles', 1 ); +/** + * Remove Simple Social Icons inline CSS. + * + * No longer needed because we are generating custom CSS instead so removing + * this means we don't need to use !important rules in the function below. + * + * @since 1.0.0 + * + * @return void + */ +function child_theme_remove_ssi_inline_styles() { + + global $wp_widget_factory; + + remove_action( 'wp_head', array( $wp_widget_factory->widgets['Simple_Social_Icons_Widget'], 'css' ) ); + +} + +add_action( 'wp_head', 'child_theme_simple_social_icons_css' ); +/** + * Simple Social Icons multiple instances workaround. + * + * By default, Simple Social Icons only allows you to create one style for your + * icons, even if you have multiple on one page. This function allows us to + * output different styles for each widget displayed on the front end. + * + * @since 1.0.0 + * + * @return void + */ +function child_theme_simple_social_icons_css() { + + if ( ! class_exists( 'Simple_Social_Icons_Widget' ) ) { + + return; + + } + + $obj = new Simple_Social_Icons_Widget(); + + $all_instances = $obj->get_settings(); + + foreach ( $all_instances as $key => $options ) : + + $instance = wp_parse_args( $all_instances[ $key ] ); + $font_size = round( (int) $instance['size'] / 2 ); + $icon_padding = round( (int) $font_size / 2 ); + + $css = '#' . $obj->id_base . '-' . $key . ' ul li a, + #' . $obj->id_base . '-' . $key . ' ul li a:hover { + background-color: ' . $instance['background_color'] . '; + border-radius: ' . $instance['border_radius'] . 'px; + color: ' . $instance['icon_color'] . '; + border: ' . $instance['border_width'] . 'px ' . $instance['border_color'] . ' solid; + font-size: ' . $font_size . 'px; + padding: ' . $icon_padding . 'px; + } + + #' . $obj->id_base . '-' . $key . ' ul li a:hover { + background-color: ' . $instance['background_color_hover'] . '; + border-color: ' . $instance['border_color_hover'] . '; + color: ' . $instance['icon_color_hover'] . '; + }'; + + $css = child_theme_minify_css( $css ); + + printf( '', $css ); + + endforeach; + +} + +add_filter( 'genesis_widget_column_classes', 'child_theme_widget_columns' ); +/** + * Add additional column class to plugin. + * + * @since 1.0.0 + * + * @param array $column_classes Array of column classes. + * + * @return array Modified column classes. + */ +function child_theme_widget_columns( $column_classes ) { + + $column_classes[] = 'full-width'; + + return $column_classes; + +} + +add_filter( 'gsw_settings_defaults', 'child_theme_testimonial_defaults' ); +/** + * Filter the default Genesis Testimonial Slider settings. + * + * @since 1.0.0 + * + * @param array $defaults Default plugin settings. + * + * @return array + */ +function child_theme_testimonial_defaults( $defaults ) { + + $config = child_theme_get_config( 'testimonial-slider' ); + + return ( $config ? $config : $defaults ); + +} + +add_filter( 'agm_custom_styles', 'child_theme_map_styles' ); +/** + * Add custom Google Map style. + * + * Adds a custom Google map style to the Google Map plugin used in the theme demo. + * The JSON file used in this function can be found in the top level directory + * of the theme. More information can be found by following the links below. + * + * @since 1.0.0 + * + * @link https://github.com/ankurk91/wp-google-map/wiki/How-to-add-your-own-styles + * @link https://snazzymaps.com/style/85413/cartagena + * @param array $json Array of JSON data. + * + * @return array + */ +function child_theme_map_styles( $json ) { + + $config = child_theme_get_config( 'map-style' ); + + if ( ! is_readable( $config['style'] ) ) { + + return $json; + + } + + $config['style'] = json_decode( file_get_contents( $config['style'] ), true ); + + array_push( $json, $config ); + + return $json; + +} + +add_action( 'wp_enqueue_scripts', 'child_theme_remove_plugin_css' ); +/** + * Disable third party CSS that is included in theme. + * + * @since 1.0.0 + * + * @return void + */ +function child_theme_remove_plugin_css() { + + add_filter( 'gs_faq_print_styles', '__return_false' ); + add_filter( 'genesis_portfolio_load_default_styles', '__return_false' ); + +} diff --git a/lib/functions/setup.php b/lib/functions/setup.php new file mode 100644 index 0000000..128c3d3 --- /dev/null +++ b/lib/functions/setup.php @@ -0,0 +1,123 @@ + $args ) { + + if ( is_array( $args ) ) { + + add_theme_support( $feature, $args ); + + } else { + + add_theme_support( $args ); + + } + + } + +} + +add_action( 'genesis_setup', 'child_theme_add_image_sizes' ); +/** + * Add new image sizes. + * + * @since 1.0.0 + * + * @return void + */ +function child_theme_add_image_sizes() { + + $config = child_theme_get_config( 'image-sizes' ); + + foreach ( $config as $name => $args ) { + + $crop = array_key_exists( 'crop', $args ) ? $args['crop'] : false; + + add_image_size( $name, $args['width'], $args['height'], $crop ); + + } + +} + +add_action( 'genesis_setup', 'child_theme_add_post_type_supports' ); +/** + * Add post type supports. + * + * @since 1.0.0 + * + * @return void + */ +function child_theme_add_post_type_supports() { + + $config = child_theme_get_config( 'post-type-supports' ); + + foreach ( $config as $post_type => $support ) { + + add_post_type_support( $post_type, $support ); + + } + +} + +add_action( 'genesis_setup', 'child_theme_add_default_headers' ); +/** + * Add default header image. + * + * @since 1.0.0 + * + * @return void + */ +function child_theme_add_default_headers() { + + $config = child_theme_get_config( 'default-headers' ); + + register_default_headers( $config ); + +} diff --git a/lib/functions/templates.php b/lib/functions/templates.php new file mode 100644 index 0000000..df6ce55 --- /dev/null +++ b/lib/functions/templates.php @@ -0,0 +1,117 @@ +. + $css = preg_replace( '/(,|:|;|\{|}|\*\/|>) /', '$1', $css ); + + // Remove space before , ; { } ( ) >. + $css = preg_replace( '/ (,|;|\{|}|\)|>)/', '$1', $css ); + + // Strips leading 0 on decimal values (converts 0.5px into .5px). + $css = preg_replace( '/(:| )0\.([0-9]+)(%|em|ex|px|in|cm|mm|pt|pc)/i', '${1}.${2}${3}', $css ); + + // Strips units if value is 0 (converts 0px to 0). + $css = preg_replace( '/(:| )(\.?)0(%|em|ex|px|in|cm|mm|pt|pc)/i', '${1}0', $css ); + + // Converts all zeros value into short-hand. + $css = preg_replace( '/0 0 0 0/', '0', $css ); + + // Shorten 6-character hex color codes to 3-character where possible. + $css = preg_replace( '/#([a-f0-9])\\1([a-f0-9])\\2([a-f0-9])\\3/i', '#\1\2\3', $css ); + + return trim( $css ); + +} + +/** + * Helper function to check if we're on a WooCommerce page. + * + * @since 1.0.0 + * + * @link https://docs.woocommerce.com/document/conditional-tags/. + * + * @return bool + */ +function child_theme_is_woocommerce_page() { + + if ( ! class_exists( 'WooCommerce' ) ) { + + return false; + + } + + if ( is_woocommerce() || is_shop() || is_product_category() || is_product_tag() || is_product() || is_cart() || is_checkout() || is_account_page() ) { + + return true; + + } else { + + return false; + + } + +} + +/** + * Custom header image callback. + * + * Loads custom header or featured image depending on what is set on a per + * page basis. If a featured image is set for a page, it will override + * the default header image. It also gets the image for custom post + * types by looking for a page with the same slug as the CPT e.g + * the Portfolio CPT archive will pull the featured image from + * a page with the slug of 'portfolio', if the page exists. + * + * @since 1.0.0 + * + * @return string + */ +function child_theme_custom_header() { + + $id = ''; + + // Get the current page ID. + if ( class_exists( 'WooCommerce' ) && is_shop() ) { + + $id = wc_get_page_id( 'shop' ); + + } elseif ( is_post_type_archive() ) { + + $id = get_page_by_path( get_query_var( 'post_type' ) ); + + } elseif ( is_front_page() ) { + + $id = get_option( 'page_on_front' ); + + } elseif ( 'posts' === get_option( 'show_on_front' ) && is_home() ) { + + $id = get_option( 'page_for_posts' ); + + } elseif ( is_search() ) { + + $id = get_page_by_path( 'search' ); + + } elseif ( is_404() ) { + + $id = get_page_by_path( 'error' ); + + } elseif ( is_singular() ) { + + $id = get_the_id(); + + } + + $url = get_the_post_thumbnail_url( $id, 'hero' ); + + if ( '0' === $id || ! $url ) { + + $url = get_header_image(); + + } + + return printf( '' . "\n", esc_url( $url ) ); + +} + +/** + * Check if any Front Page widgets are active. + * + * @since 1.0.0 + * + * @return bool + */ +function child_theme_has_front_page_widgets() { + + $config = child_theme_get_config( 'widget-areas' ); + + foreach ( $config as $id => $location ) { + + if ( is_numeric( str_replace( 'front-page-', '', $id ) ) ) { + + if ( is_active_sidebar( $id ) ) { + + return true; + + } + + } + + } + + return false; + +} diff --git a/lib/init.php b/lib/init.php new file mode 100644 index 0000000..d386ea4 --- /dev/null +++ b/lib/init.php @@ -0,0 +1,63 @@ +get( 'Name' ) ); + define( 'CHILD_THEME_URL', $child_theme->get( 'ThemeURI' ) ); + define( 'CHILD_THEME_VERSION', $child_theme->get( 'Version' ) ); + define( 'CHILD_THEME_HANDLE', $child_theme->get( 'TextDomain' ) ); + define( 'CHILD_THEME_AUTHOR', $child_theme->get( 'Author' ) ); + define( 'CHILD_THEME_DIR', get_stylesheet_directory() ); + define( 'CHILD_THEME_URI', get_stylesheet_directory_uri() ); + define( 'CHILD_THEME_LIB', CHILD_THEME_DIR . '/lib' ); + define( 'CHILD_THEME_VIEWS', CHILD_THEME_LIB . '/views' ); + define( 'CHILD_THEME_VENDOR', CHILD_THEME_DIR . '/vendor' ); + define( 'CHILD_THEME_ASSETS', CHILD_THEME_URI . '/assets' ); + define( 'CHILD_THEME_CONFIG', CHILD_THEME_DIR . '/config/config.php' ); + + $config = require apply_filters( 'child_theme_config', CHILD_THEME_CONFIG ); + + require_once CHILD_THEME_LIB . '/autoload.php'; + + foreach ( $config['autoload'] as $dir ) { + + child_theme_autoload_dir( CHILD_THEME_DIR . $dir ); + + } + +} diff --git a/lib/js/customizer.js b/lib/js/customizer.js new file mode 100644 index 0000000..b258069 --- /dev/null +++ b/lib/js/customizer.js @@ -0,0 +1,311 @@ +/** + * Alpha Color Picker JS + * + * This file includes several helper functions and the core control JS. + */ + +/** + * Override the stock color.js toString() method to add support for + * outputting RGBa or Hex. + */ +Color.prototype.toString = function( flag ) { + + // If our no-alpha flag has been passed in, output RGBa value with 100% opacity. + // This is used to set the background color on the opacity slider during color changes. + if ( 'no-alpha' == flag ) { + return this.toCSS( 'rgba', '1' ).replace( /\s+/g, '' ); + } + + // If we have a proper opacity value, output RGBa. + if ( 1 > this._alpha ) { + return this.toCSS( 'rgba', this._alpha ).replace( /\s+/g, '' ); + } + + // Proceed with stock color.js hex output. + var hex = parseInt( this._color, 10 ).toString( 16 ); + if ( this.error ) { + return ''; + } + if ( 6 > hex.length ) { + for ( var i = 6 - hex.length - 1; 0 <= i; i-- ) { + hex = '0' + hex; + } + } + + return '#' + hex; +}; + +/** + * Given an RGBa, RGB, or hex color value, return the alpha channel value. + */ +function acp_get_alpha_value_from_color( value ) { + var alphaVal; + + // Remove all spaces from the passed in value to help our RGBa regex. + value = value.replace( / /g, '' ); + + if ( value.match( /rgba\(\d+\,\d+\,\d+\,([^\)]+)\)/ ) ) { + alphaVal = + parseFloat( + value.match( /rgba\(\d+\,\d+\,\d+\,([^\)]+)\)/ )[1] + ).toFixed( 2 ) * 100; + alphaVal = parseInt( alphaVal ); + } else { + alphaVal = 100; + } + + return alphaVal; +} + +/** + * Force update the alpha value of the color picker object and maybe the alpha slider. + */ +function acp_update_alpha_value_on_color_control( + alpha, + $control, + $alphaSlider, + update_slider +) { + var iris, colorPicker, color; + + iris = $control.data( 'a8cIris' ); + colorPicker = $control.data( 'wpWpColorPicker' ); + + // Set the alpha value on the Iris object. + iris._color._alpha = alpha; + + // Store the new color value. + color = iris._color.toString(); + + // Set the value of the input. + $control.val( color ); + + // Update the background color of the color picker. + colorPicker.toggler.css({ + 'background-color': color + }); + + // Maybe update the alpha slider itself. + if ( update_slider ) { + acp_update_alpha_value_on_alpha_slider( alpha, $alphaSlider ); + } + + // Update the color value of the color picker object. + $control.wpColorPicker( 'color', color ); +} + +/** + * Update the slider handle position and label. + */ +function acp_update_alpha_value_on_alpha_slider( alpha, $alphaSlider ) { + $alphaSlider.slider( 'value', alpha ); + $alphaSlider.find( '.ui-slider-handle' ).text( alpha.toString() ); +} + +/** + * Initialization trigger. + */ +jQuery( document ).ready( function( $ ) { + + // Loop over each control and transform it into our color picker. + $( '.alpha-color-control' ).each( function() { + + // Scope the vars. + var $control, + startingColor, + paletteInput, + showOpacity, + defaultColor, + palette, + colorPickerOptions, + $container, + $alphaSlider, + alphaVal, + sliderOptions; + + // Store the control instance. + $control = $( this ); + + // Get a clean starting value for the option. + startingColor = $control.val().replace( /\s+/g, '' ); + + // Get some data off the control. + paletteInput = $control.attr( 'data-palette' ); + showOpacity = $control.attr( 'data-show-opacity' ); + defaultColor = $control.attr( 'data-default-color' ); + + // Process the palette. + if ( -1 !== paletteInput.indexOf( '|' ) ) { + palette = paletteInput.split( '|' ); + } else if ( 'false' == paletteInput ) { + palette = false; + } else { + palette = true; + } + + // Set up the options that we'll pass to wpColorPicker(). + colorPickerOptions = { + change: function( event, ui ) { + var key, value, alpha, $transparency; + + key = $control.attr( 'data-customize-setting-link' ); + value = $control.wpColorPicker( 'color' ); + + // Set the opacity value on the slider handle when the default color button is clicked. + if ( defaultColor == value ) { + alpha = acp_get_alpha_value_from_color( value ); + $alphaSlider.find( '.ui-slider-handle' ).text( alpha ); + } + + // Send ajax request to wp.customize to trigger the Save action. + wp.customize( key, function( obj ) { + obj.set( value ); + }); + + $transparency = $container.find( '.transparency' ); + + // Always show the background color of the opacity slider at 100% opacity. + $transparency.css( + 'background-color', + ui.color.toString( 'no-alpha' ) + ); + }, + palettes: palette // Use the passed in palette. + }; + + // Create the colorpicker. + $control.wpColorPicker( colorPickerOptions ); + + $container = $control.parents( '.wp-picker-container:first' ); + + // Insert our opacity slider. + $( + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + ).appendTo( $container.find( '.wp-picker-holder' ) ); + + $alphaSlider = $container.find( '.alpha-slider' ); + + // If starting value is in format RGBa, grab the alpha channel. + alphaVal = acp_get_alpha_value_from_color( startingColor ); + + // Set up jQuery UI slider() options. + sliderOptions = { + create: function( event, ui ) { + var value = $( this ).slider( 'value' ); + + // Set up initial values. + $( this ) + .find( '.ui-slider-handle' ) + .text( value ); + $( this ) + .siblings( '.transparency ' ) + .css( 'background-color', startingColor ); + }, + value: alphaVal, + range: 'max', + step: 1, + min: 0, + max: 100, + animate: 300 + }; + + // Initialize jQuery UI slider with our options. + $alphaSlider.slider( sliderOptions ); + + // Maybe show the opacity on the handle. + if ( 'true' == showOpacity ) { + $alphaSlider.find( '.ui-slider-handle' ).addClass( 'show-opacity' ); + } + + // Bind event handlers for the click zones. + $container.find( '.min-click-zone' ).on( 'click', function() { + acp_update_alpha_value_on_color_control( + 0, + $control, + $alphaSlider, + true + ); + }); + $container.find( '.max-click-zone' ).on( 'click', function() { + acp_update_alpha_value_on_color_control( + 100, + $control, + $alphaSlider, + true + ); + }); + + // Bind event handler for clicking on a palette color. + $container.find( '.iris-palette' ).on( 'click', function() { + var color, alpha; + + color = $( this ).css( 'background-color' ); + alpha = acp_get_alpha_value_from_color( color ); + + acp_update_alpha_value_on_alpha_slider( alpha, $alphaSlider ); + + // Sometimes Iris doesn't set a perfect background-color on the palette, + // for example rgba(20, 80, 100, 0.3) becomes rgba(20, 80, 100, 0.298039). + // To compensante for this we round the opacity value on RGBa colors here + // and save it a second time to the color picker object. + if ( 100 != alpha ) { + color = color.replace( /[^,]+(?=\))/, ( alpha / 100 ).toFixed( 2 ) ); + } + + $control.wpColorPicker( 'color', color ); + }); + + // Bind event handler for clicking on the 'Clear' button. + $container.find( '.button.wp-picker-clear' ).on( 'click', function() { + var key = $control.attr( 'data-customize-setting-link' ); + + // The #fff color is delibrate here. This sets the color picker to white instead of the + // defult black, which puts the color picker in a better place to visually represent empty. + $control.wpColorPicker( 'color', '#ffffff' ); + + // Set the actual option value to empty string. + wp.customize( key, function( obj ) { + obj.set( '' ); + }); + + acp_update_alpha_value_on_alpha_slider( 100, $alphaSlider ); + }); + + // Bind event handler for clicking on the 'Default' button. + $container.find( '.button.wp-picker-default' ).on( 'click', function() { + var alpha = acp_get_alpha_value_from_color( defaultColor ); + + acp_update_alpha_value_on_alpha_slider( alpha, $alphaSlider ); + }); + + // Bind event handler for typing or pasting into the input. + $control.on( 'input', function() { + var value = $( this ).val(); + var alpha = acp_get_alpha_value_from_color( value ); + + acp_update_alpha_value_on_alpha_slider( alpha, $alphaSlider ); + }); + + // Update all the things when the slider is interacted with. + $alphaSlider.slider().on( 'slide', function( event, ui ) { + var alpha = parseFloat( ui.value ) / 100.0; + + acp_update_alpha_value_on_color_control( + alpha, + $control, + $alphaSlider, + false + ); + + // Change value shown on slider handle. + $( this ) + .find( '.ui-slider-handle' ) + .text( ui.value ); + }); + }); +}); diff --git a/lib/js/load-scripts.php b/lib/js/load-scripts.php new file mode 100644 index 0000000..14f8b7b --- /dev/null +++ b/lib/js/load-scripts.php @@ -0,0 +1,91 @@ + $params ) { + + wp_enqueue_script( 'child-theme-' . $script, $params['src'], explode( ',', $params['deps'] ), $params['ver'], $params['in_footer'] ); + + } + +} + +add_action( 'wp_enqueue_scripts', 'child_theme_menu_settings', 99 ); +/** + * Localizes the responsive menu script + * + * @since 1.0.0 + * + * @return void + */ +function child_theme_menu_settings() { + + $menu_settings = child_theme_get_config( 'responsive-menu' ); + + wp_localize_script( 'child-theme-menu', 'genesis_responsive_menu', $menu_settings ); + +} + +add_action( 'genesis_before', 'child_theme_js_nojs_script', 1 ); +/** + * Echo out the script that changes 'no-js' class to 'js'. + * + * Adds a script on the genesis_before hook which immediately changes the + * class to js if JavaScript is enabled. This is how WP does things on + * the back end, to allow different styles for the same elements + * depending if JavaScript is active or not. + * + * Outputting the script immediately also reduces a flash of incorrectly + * styled content, as the page does not load with no-js styles, then + * switch to js once everything has finished loading. + * + * @since 1.0.0 + * + * @author Gary Jones + * @link https://github.com/GaryJones/genesis-js-no-js + * + * @return void + */ +function child_theme_js_nojs_script() { + ?> + + 1 ) { + + $.each( + $menu, function( key, value ) { + + var newString = menuString + '-' + key; + + $( this ).addClass( newString.replace( '.','' ) ); + + genesisMenus[group].push( newString ); + + if ( 'combine' === group ) { + menusToCombine.push( newString ); + } + + } + ); + + } else if ( $menu.length == 1 ) { + + genesisMenus[group].push( menuString ); + + if ( 'combine' === group ) { + menusToCombine.push( menuString ); + } + + } + + } + ); + + } + ); + + // Make sure there is something to use for the 'others' array. + if ( typeof genesisMenus.others == 'undefined' ) { + genesisMenus.others = []; + } + + // If there's only one menu on the page for combining, push it to the 'others' array and nullify our 'combine' variable. + if ( menusToCombine.length == 1 ) { + genesisMenus.others.push( menusToCombine[0] ); + genesisMenus.combine = null; + menusToCombine = null; + } + + var genesisMenu = {}, + mainMenuButtonClass = 'menu-toggle', + subMenuButtonClass = 'sub-menu-toggle', + responsiveMenuClass = 'genesis-responsive-menu'; + + // Initialize. + genesisMenu.init = function() { + + // Exit early if there are no menus to do anything. + if ( $( _getAllMenusArray() ).length == 0 ) { + return; + } + + var menuIconClass = typeof genesisMenuParams.menuIconClass !== 'undefined' ? genesisMenuParams.menuIconClass : 'dashicons-before dashicons-menu'; + var subMenuIconClass = typeof genesisMenuParams.subMenuIconClass !== 'undefined' ? genesisMenuParams.subMenuIconClass : 'dashicons-before dashicons-arrow-down-alt2'; + var toggleButtons = { + menu : $( '
+
', + esc_html__( 'Upgrade message from the plugin author:', 'tgmpa' ), + ' ', wp_kses_data( $item['upgrade_notice'] ), ' +
+