From 8cbf53172b087ec91c07a4072a3080b23c1be57a Mon Sep 17 00:00:00 2001 From: Sophia Atkinson Date: Fri, 8 Sep 2023 01:45:46 -0700 Subject: [PATCH] first commit --- comments.php | 78 + editor-style-rtl.css | 278 ++ editor-style.css | 278 ++ footer.php | 36 + functions.php | 27 + header.php | 42 + inc/alpha-color-picker.css | 136 + inc/back-compat.php | 70 + inc/core/CSSRules.php | 575 +++ inc/core/Editor.php | 150 + inc/core/Enhance.php | 175 + inc/core/Header.php | 42 + inc/core/Helpers.php | 95 + inc/core/Icons.php | 279 ++ inc/core/IconsHelper.php | 131 + inc/core/Jetpack.php | 80 + inc/core/Menu.php | 105 + inc/core/Options.php | 27 + inc/core/Options/AlphaColorControl.php | 96 + inc/core/Options/BlockSection.php | 58 + inc/core/Options/Blog.php | 493 +++ inc/core/Options/Colors.php | 194 + inc/core/Options/Content.php | 176 + inc/core/Options/Fonts.php | 147 + inc/core/Options/Footer.php | 237 ++ inc/core/Options/FooterBlock.php | 332 ++ inc/core/Options/General.php | 127 + inc/core/Options/HeaderBlock.php | 332 ++ inc/core/Options/HeaderImage.php | 154 + inc/core/Options/PrimaryNavbar.php | 115 + inc/core/Options/Sanitizer.php | 89 + inc/core/Options/Sidebar.php | 341 ++ inc/core/Options/SiteIdentity.php | 450 +++ inc/core/Options/TopBanner.php | 473 +++ inc/core/Options/TopNavbar.php | 104 + inc/core/Options/Upsell.php | 229 ++ inc/core/PageSettings.php | 235 ++ inc/core/Scripts.php | 103 + inc/core/Serviceable.php | 18 + inc/core/Setup.php | 117 + inc/core/TemplateTags.php | 167 + inc/core/Theme.php | 68 + inc/core/Widget.php | 144 + inc/core/WooCommerce.php | 163 + inc/customize-controls.css | 42 + inc/libs/class-pressbook-upsell-control.php | 72 + inc/libs/class-pressbook-upsell-section.php | 94 + inc/libs/class-tgm-plugin-activation.php | 3770 +++++++++++++++++++ inc/libs/class-wptt-webfont-loader.php | 711 ++++ inc/recommended-plugins.php | 79 + inc/theme-page.css | 161 + inc/transparency-grid.png | Bin 0 -> 2646 bytes inc/vendor/autoload.php | 7 + inc/vendor/composer/ClassLoader.php | 445 +++ inc/vendor/composer/LICENSE | 21 + inc/vendor/composer/autoload_classmap.php | 9 + inc/vendor/composer/autoload_namespaces.php | 9 + inc/vendor/composer/autoload_psr4.php | 10 + inc/vendor/composer/autoload_real.php | 52 + inc/vendor/composer/autoload_static.php | 31 + inc/welcome-page.php | 259 ++ inc/widgets-editor-legacy-rtl.css | 301 ++ inc/widgets-editor-legacy.css | 301 ++ inc/widgets-editor-style.css | 20 + index.php | 70 + js/ResizeObserver.js | 936 +++++ js/ResizeObserver.min.js | 1 + js/alpha-color-picker.js | 269 ++ js/customize-controls.js | 7 + js/customizer.js | 77 + js/script.js | 528 +++ js/script.min.js | 1 + js/sticky-sidebar.js | 707 ++++ js/sticky-sidebar.min.js | 1 + languages/How-to-use-a-pot-file.txt | 21 + languages/hi_IN.mo | Bin 0 -> 735 bytes languages/hi_IN.po | 1808 +++++++++ languages/pressbook.pot | 1690 +++++++++ license.txt | 339 ++ page-templates/full.php | 34 + page-templates/large.php | 34 + page-templates/medium.php | 34 + page-templates/sidebar.php | 39 + page-templates/small.php | 34 + page.php | 41 + readme.txt | 397 ++ screenshot.png | Bin 0 -> 192929 bytes sidebar-left.php | 22 + sidebar-shop.php | 22 + sidebar.php | 22 + single.php | 51 + style-rtl.css | 3525 +++++++++++++++++ style.css | 3531 +++++++++++++++++ style.min-rtl.css | 1 + style.min.css | 1 + template-parts/content-none.php | 51 + template-parts/content-page-no-title.php | 30 + template-parts/content-page.php | 34 + template-parts/content-single.php | 52 + template-parts/content.php | 74 + template-parts/footer/block-section.php | 68 + template-parts/footer/copyright-text.php | 23 + template-parts/footer/widgets.php | 30 + template-parts/header/block-section.php | 68 + template-parts/header/primary-navbar.php | 26 + template-parts/header/site-branding.php | 28 + template-parts/header/top-banner.php | 64 + template-parts/header/top-navbar.php | 54 + 108 files changed, 29005 insertions(+) create mode 100644 comments.php create mode 100644 editor-style-rtl.css create mode 100644 editor-style.css create mode 100644 footer.php create mode 100644 functions.php create mode 100644 header.php create mode 100644 inc/alpha-color-picker.css create mode 100644 inc/back-compat.php create mode 100644 inc/core/CSSRules.php create mode 100644 inc/core/Editor.php create mode 100644 inc/core/Enhance.php create mode 100644 inc/core/Header.php create mode 100644 inc/core/Helpers.php create mode 100644 inc/core/Icons.php create mode 100644 inc/core/IconsHelper.php create mode 100644 inc/core/Jetpack.php create mode 100644 inc/core/Menu.php create mode 100644 inc/core/Options.php create mode 100644 inc/core/Options/AlphaColorControl.php create mode 100644 inc/core/Options/BlockSection.php create mode 100644 inc/core/Options/Blog.php create mode 100644 inc/core/Options/Colors.php create mode 100644 inc/core/Options/Content.php create mode 100644 inc/core/Options/Fonts.php create mode 100644 inc/core/Options/Footer.php create mode 100644 inc/core/Options/FooterBlock.php create mode 100644 inc/core/Options/General.php create mode 100644 inc/core/Options/HeaderBlock.php create mode 100644 inc/core/Options/HeaderImage.php create mode 100644 inc/core/Options/PrimaryNavbar.php create mode 100644 inc/core/Options/Sanitizer.php create mode 100644 inc/core/Options/Sidebar.php create mode 100644 inc/core/Options/SiteIdentity.php create mode 100644 inc/core/Options/TopBanner.php create mode 100644 inc/core/Options/TopNavbar.php create mode 100644 inc/core/Options/Upsell.php create mode 100644 inc/core/PageSettings.php create mode 100644 inc/core/Scripts.php create mode 100644 inc/core/Serviceable.php create mode 100644 inc/core/Setup.php create mode 100644 inc/core/TemplateTags.php create mode 100644 inc/core/Theme.php create mode 100644 inc/core/Widget.php create mode 100644 inc/core/WooCommerce.php create mode 100644 inc/customize-controls.css create mode 100644 inc/libs/class-pressbook-upsell-control.php create mode 100644 inc/libs/class-pressbook-upsell-section.php create mode 100644 inc/libs/class-tgm-plugin-activation.php create mode 100644 inc/libs/class-wptt-webfont-loader.php create mode 100644 inc/recommended-plugins.php create mode 100644 inc/theme-page.css create mode 100644 inc/transparency-grid.png create mode 100644 inc/vendor/autoload.php create mode 100644 inc/vendor/composer/ClassLoader.php create mode 100644 inc/vendor/composer/LICENSE create mode 100644 inc/vendor/composer/autoload_classmap.php create mode 100644 inc/vendor/composer/autoload_namespaces.php create mode 100644 inc/vendor/composer/autoload_psr4.php create mode 100644 inc/vendor/composer/autoload_real.php create mode 100644 inc/vendor/composer/autoload_static.php create mode 100644 inc/welcome-page.php create mode 100644 inc/widgets-editor-legacy-rtl.css create mode 100644 inc/widgets-editor-legacy.css create mode 100644 inc/widgets-editor-style.css create mode 100644 index.php create mode 100644 js/ResizeObserver.js create mode 100644 js/ResizeObserver.min.js create mode 100644 js/alpha-color-picker.js create mode 100644 js/customize-controls.js create mode 100644 js/customizer.js create mode 100644 js/script.js create mode 100644 js/script.min.js create mode 100644 js/sticky-sidebar.js create mode 100644 js/sticky-sidebar.min.js create mode 100644 languages/How-to-use-a-pot-file.txt create mode 100644 languages/hi_IN.mo create mode 100644 languages/hi_IN.po create mode 100644 languages/pressbook.pot create mode 100644 license.txt create mode 100644 page-templates/full.php create mode 100644 page-templates/large.php create mode 100644 page-templates/medium.php create mode 100644 page-templates/sidebar.php create mode 100644 page-templates/small.php create mode 100644 page.php create mode 100644 readme.txt create mode 100644 screenshot.png create mode 100644 sidebar-left.php create mode 100644 sidebar-shop.php create mode 100644 sidebar.php create mode 100644 single.php create mode 100644 style-rtl.css create mode 100644 style.css create mode 100644 style.min-rtl.css create mode 100644 style.min.css create mode 100644 template-parts/content-none.php create mode 100644 template-parts/content-page-no-title.php create mode 100644 template-parts/content-page.php create mode 100644 template-parts/content-single.php create mode 100644 template-parts/content.php create mode 100644 template-parts/footer/block-section.php create mode 100644 template-parts/footer/copyright-text.php create mode 100644 template-parts/footer/widgets.php create mode 100644 template-parts/header/block-section.php create mode 100644 template-parts/header/primary-navbar.php create mode 100644 template-parts/header/site-branding.php create mode 100644 template-parts/header/top-banner.php create mode 100644 template-parts/header/top-navbar.php diff --git a/comments.php b/comments.php new file mode 100644 index 0000000..a3d2688 --- /dev/null +++ b/comments.php @@ -0,0 +1,78 @@ + + +
+ + + +

+ (%1$s) on “%2$s”', + 'Comments (%1$s) on “%2$s”', + $pressbook_comment_count, + 'comments title', + 'pressbook' + ), + array( 'span' => array( 'class' => array() ) ) + ), + esc_html( number_format_i18n( $pressbook_comment_count ) ), + wp_kses_post( get_the_title() ) + ); + ?> +

+ + + +
    + 'ol', + 'short_ping' => true, + 'avatar_size' => 32, + ) + ); + ?> +
+ + +

+ + +
diff --git a/editor-style-rtl.css b/editor-style-rtl.css new file mode 100644 index 0000000..f7be805 --- /dev/null +++ b/editor-style-rtl.css @@ -0,0 +1,278 @@ +body { + color: #404040; + font-size: 16px; + font-size: 1rem; + line-height: 1.75; +} + +@media screen and (min-width: 768px) { + body { + font-size: 17px; + font-size: 1.0625rem; + } +} + +.editor-post-title__input, +.editor-post-title .editor-post-title__input, +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.5; +} + +.editor-post-title__input, +.editor-post-title .editor-post-title__input { + margin-top: 0; + margin-bottom: .45em; + padding: 19px 0; + font-size: 1.46em; +} + +h1 { + font-size: 1.94em; + margin: .67em 0; +} + +h2 { + font-size: 1.78em; + margin: .73em 0; +} + +h3 { + font-size: 1.62em; + margin: .8em 0; +} + +h4 { + font-size: 1.46em; + margin: .89em 0; +} + +h5 { + font-size: 1.3em; + margin: 1em 0; +} + +h6 { + font-size: 1.14em; + margin: 1.14em 0; +} + +p { + margin-bottom: 1.5em; +} + +a { + text-decoration: underline; + transition: color .2s; +} + +a { + color: #166dd6; +} + +a:hover, +a:focus, +a:active { + color: #f69275; +} + +a:focus { + outline: thin dotted; +} + +a:focus:not(:focus-visible), +a:hover, +a:active { + outline: 0; +} + +p.has-text-color a, +p.has-text-color a:hover, +p.has-text-color a:focus, +p.has-text-color a:active { + color: inherit; +} + +ul, +ol { + margin: 1.5em 0 1.5em 0; + padding-right: 1em; +} + +ul { + list-style-type: disc; +} + +ol { + list-style-type: decimal; +} + +li>ul, +li>ol { + margin-top: 0; + margin-bottom: 0; + margin-right: 1.5em; +} + +li:not(:first-child) { + padding-top: .2em; +} + +li:not(:last-child) { + padding-bottom: .2em; +} + +li>ul>li:first-child, +li>ol>li:first-child { + padding-top: .4em; +} + +blockquote { + margin: 0 1.5em; +} + +.wp-block-quote p { + margin-bottom: .75em; +} + +.wp-block-quote.is-large p, +.wp-block-quote.is-style-large p { + font-size: 1.3em; +} + +.wp-block-quote__citation, +.wp-block-quote cite, +.wp-block-quote footer { + font-size: .85em; +} + +.wp-block-quote.is-large cite, +.wp-block-quote.is-large footer, +.wp-block-quote.is-style-large cite, +.wp-block-quote.is-style-large footer { + font-size: .95em; +} + +.wp-block-quote, +.wp-block-quote.is-large, +.wp-block-quote.is-style-large { + margin-bottom: 1.75em; +} + +.wp-block-pullquote { + padding: 2.4em 0; +} + +.wp-block-pullquote p { + font-size: 1.75em; + margin-bottom: 0; +} + +.wp-block-pullquote__citation, +.wp-block-pullquote cite, +.wp-block-pullquote footer { + display: block; + margin-top: 1.5em; +} + +.wp-block-pullquote.is-style-solid-color blockquote p { + font-size: 1.9em; +} + +.wp-block-pullquote.is-style-solid-color blockquote { + max-width: 70%; +} + +.wp-block-table, +.wp-block-video, +.wp-block-audio, +.wp-block-embed, +.wp-block-image, +.wp-block-gallery, +.wp-block-media-text, +.wp-block-calendar { + margin-bottom: 1.5em; +} + +.wp-block-calendar table:where(:not(.has-text-color)) { + color: inherit; +} + +.wp-block-table table, +.wp-block-calendar .wp-calendar-table { + margin-bottom: 0; +} + +.wp-block-calendar .wp-calendar-nav { + margin-top: .5em; +} + +.wp-block-image img { + display: block; +} + +.wp-block-table figcaption, +.wp-block-video figcaption, +.wp-block-embed figcaption, +.wp-block-image figcaption, +.wp-block-gallery figcaption { + font-size: .85em; +} + +.wp-block-table figcaption, +.wp-block-video figcaption, +.wp-block-embed figcaption { + margin-top: 1em; + margin-bottom: 0; +} + +.wp-block-audio figcaption { + margin-top: .75em; + margin-bottom: 0; + font-size: .8em; +} + +.wp-block-table.is-style-stripes { + border-bottom: 0; +} + +.wp-block-code>code { + color: inherit; +} + +pre.wp-block-verse { + font-family: 'Courier 10 Pitch', courier, monospace; +} + +.wp-block-search .wp-block-search__button { + margin-right: 0; +} + +.wp-block-rss { + padding: 0; + list-style-type: none; +} + +.wp-block-rss .wp-block-rss__item:not(:last-child) { + margin-bottom: 1em; +} + +.wp-block-rss .wp-block-rss__item:not(:first-child) { + padding-top: 0; +} + +.wp-block-latest-comments__comment { + line-height: inherit; +} + +.wp-block-button__link { + text-decoration: none; +} + +.wp-block-social-links .wp-block-social-link { + padding: 0; +} \ No newline at end of file diff --git a/editor-style.css b/editor-style.css new file mode 100644 index 0000000..ed4b45f --- /dev/null +++ b/editor-style.css @@ -0,0 +1,278 @@ +body { + color: #404040; + font-size: 16px; + font-size: 1rem; + line-height: 1.75; +} + +@media screen and (min-width: 768px) { + body { + font-size: 17px; + font-size: 1.0625rem; + } +} + +.editor-post-title__input, +.editor-post-title .editor-post-title__input, +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.5; +} + +.editor-post-title__input, +.editor-post-title .editor-post-title__input { + margin-top: 0; + margin-bottom: .45em; + padding: 19px 0; + font-size: 1.46em; +} + +h1 { + font-size: 1.94em; + margin: .67em 0; +} + +h2 { + font-size: 1.78em; + margin: .73em 0; +} + +h3 { + font-size: 1.62em; + margin: .8em 0; +} + +h4 { + font-size: 1.46em; + margin: .89em 0; +} + +h5 { + font-size: 1.3em; + margin: 1em 0; +} + +h6 { + font-size: 1.14em; + margin: 1.14em 0; +} + +p { + margin-bottom: 1.5em; +} + +a { + text-decoration: underline; + transition: color .2s; +} + +a { + color: #166dd6; +} + +a:hover, +a:focus, +a:active { + color: #f69275; +} + +a:focus { + outline: thin dotted; +} + +a:focus:not(:focus-visible), +a:hover, +a:active { + outline: 0; +} + +p.has-text-color a, +p.has-text-color a:hover, +p.has-text-color a:focus, +p.has-text-color a:active { + color: inherit; +} + +ul, +ol { + margin: 1.5em 0 1.5em 0; + padding-left: 1em; +} + +ul { + list-style-type: disc; +} + +ol { + list-style-type: decimal; +} + +li>ul, +li>ol { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +li:not(:first-child) { + padding-top: .2em; +} + +li:not(:last-child) { + padding-bottom: .2em; +} + +li>ul>li:first-child, +li>ol>li:first-child { + padding-top: .4em; +} + +blockquote { + margin: 0 1.5em; +} + +.wp-block-quote p { + margin-bottom: .75em; +} + +.wp-block-quote.is-large p, +.wp-block-quote.is-style-large p { + font-size: 1.3em; +} + +.wp-block-quote__citation, +.wp-block-quote cite, +.wp-block-quote footer { + font-size: .85em; +} + +.wp-block-quote.is-large cite, +.wp-block-quote.is-large footer, +.wp-block-quote.is-style-large cite, +.wp-block-quote.is-style-large footer { + font-size: .95em; +} + +.wp-block-quote, +.wp-block-quote.is-large, +.wp-block-quote.is-style-large { + margin-bottom: 1.75em; +} + +.wp-block-pullquote { + padding: 2.4em 0; +} + +.wp-block-pullquote p { + font-size: 1.75em; + margin-bottom: 0; +} + +.wp-block-pullquote__citation, +.wp-block-pullquote cite, +.wp-block-pullquote footer { + display: block; + margin-top: 1.5em; +} + +.wp-block-pullquote.is-style-solid-color blockquote p { + font-size: 1.9em; +} + +.wp-block-pullquote.is-style-solid-color blockquote { + max-width: 70%; +} + +.wp-block-table, +.wp-block-video, +.wp-block-audio, +.wp-block-embed, +.wp-block-image, +.wp-block-gallery, +.wp-block-media-text, +.wp-block-calendar { + margin-bottom: 1.5em; +} + +.wp-block-calendar table:where(:not(.has-text-color)) { + color: inherit; +} + +.wp-block-table table, +.wp-block-calendar .wp-calendar-table { + margin-bottom: 0; +} + +.wp-block-calendar .wp-calendar-nav { + margin-top: .5em; +} + +.wp-block-image img { + display: block; +} + +.wp-block-table figcaption, +.wp-block-video figcaption, +.wp-block-embed figcaption, +.wp-block-image figcaption, +.wp-block-gallery figcaption { + font-size: .85em; +} + +.wp-block-table figcaption, +.wp-block-video figcaption, +.wp-block-embed figcaption { + margin-top: 1em; + margin-bottom: 0; +} + +.wp-block-audio figcaption { + margin-top: .75em; + margin-bottom: 0; + font-size: .8em; +} + +.wp-block-table.is-style-stripes { + border-bottom: 0; +} + +.wp-block-code>code { + color: inherit; +} + +pre.wp-block-verse { + font-family: 'Courier 10 Pitch', courier, monospace; +} + +.wp-block-search .wp-block-search__button { + margin-left: 0; +} + +.wp-block-rss { + padding: 0; + list-style-type: none; +} + +.wp-block-rss .wp-block-rss__item:not(:last-child) { + margin-bottom: 1em; +} + +.wp-block-rss .wp-block-rss__item:not(:first-child) { + padding-top: 0; +} + +.wp-block-latest-comments__comment { + line-height: inherit; +} + +.wp-block-button__link { + text-decoration: none; +} + +.wp-block-social-links .wp-block-social-link { + padding: 0; +} \ No newline at end of file diff --git a/footer.php b/footer.php new file mode 100644 index 0000000..9df3b4d --- /dev/null +++ b/footer.php @@ -0,0 +1,36 @@ + + + + + + + + + + + + + diff --git a/functions.php b/functions.php new file mode 100644 index 0000000..595829f --- /dev/null +++ b/functions.php @@ -0,0 +1,27 @@ + section and everything up until
+ * + * @link https://developer.wordpress.org/themes/basics/template-files/#template-partials + * + * @package PressBook + */ + +?> +> + + + + + + +> + + +
+ + + + +
diff --git a/inc/alpha-color-picker.css b/inc/alpha-color-picker.css new file mode 100644 index 0000000..1dfb15d --- /dev/null +++ b/inc/alpha-color-picker.css @@ -0,0 +1,136 @@ +/** + * Alpha Color Picker CSS + */ + +.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 label { + display: unset; +} + +.customize-control-alpha-color .iris-palette { + height: 22.79px; + width: 22.79px; +} + +.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: transparent; + 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: inset 0 1px 2px rgba(0, 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(transparency-grid.png); + box-shadow: 0 0 5px rgba(0, 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; + } +} diff --git a/inc/back-compat.php b/inc/back-compat.php new file mode 100644 index 0000000..9dc5851 --- /dev/null +++ b/inc/back-compat.php @@ -0,0 +1,70 @@ +

'; + printf( + /* translators: %s: WordPress Version. */ + esc_html__( 'This theme requires WordPress 5.3 or newer. You are running version %s. Please upgrade.', 'pressbook' ), + esc_html( $GLOBALS['wp_version'] ) + ); + echo '

'; +} + +/** + * Prevents the Customizer from being loaded on WordPress versions prior to 5.3. + * + * @global string $wp_version WordPress version. + */ +function pressbook_customize() { + wp_die( + sprintf( + /* translators: %s: WordPress Version. */ + esc_html__( 'This theme requires WordPress 5.3 or newer. You are running version %s. Please upgrade.', 'pressbook' ), + esc_html( $GLOBALS['wp_version'] ) + ), + '', + array( + 'back_link' => true, + ) + ); +} +add_action( 'load-customize.php', 'pressbook_customize' ); + +/** + * Prevents the Theme Preview from being loaded on WordPress versions prior to 5.3. + * + * @global string $wp_version WordPress version. + */ +function pressbook_preview() { + if ( isset( $_GET['preview'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + wp_die( + sprintf( + /* translators: %s: WordPress Version. */ + esc_html__( 'This theme requires WordPress 5.3 or newer. You are running version %s. Please upgrade.', 'pressbook' ), + esc_html( $GLOBALS['wp_version'] ) + ) + ); + } +} +add_action( 'template_redirect', 'pressbook_preview' ); diff --git a/inc/core/CSSRules.php b/inc/core/CSSRules.php new file mode 100644 index 0000000..2fba423 --- /dev/null +++ b/inc/core/CSSRules.php @@ -0,0 +1,575 @@ + $props ) { + $output_selector = ( $selector . '{' ); + $append_selector = false; + + foreach ( $props as $prop => $value ) { + if ( ! array_key_exists( 'skip', $value ) ) { + $output_selector .= ( $prop . ':' . $value['value'] . ';' ); + $append_selector = true; + } + } + + $output_selector .= '}'; + + if ( $append_selector ) { + $output .= $output_selector; + } + } + } + } + + return $output; + } + + /** + * CSS rules for the final output in array format. + * + * @return array. + */ + public static function output_array() { + $saved_styles = self::saved_styles(); + + $styles_keys = array_keys( $saved_styles ); + + $output = array(); + + foreach ( $styles_keys as $styles_key ) { + + $output[ $styles_key ] = array(); + + if ( method_exists( static::class, $styles_key ) ) { + $rules = static::$styles_key( $saved_styles[ $styles_key ] ); + + foreach ( $rules as $selector => $props ) { + $output[ $styles_key ][ $selector ] = $props; + } + } + } + + return $output; + } + + /** + * CSS rules for the final output in the editor. + */ + public static function output_editor() { + $saved_styles = self::saved_styles(); + + $styles_keys = Editor::styles_keys(); + + $output = ''; + + foreach ( $styles_keys as $styles_key ) { + if ( method_exists( Editor::class, $styles_key ) ) { + $rules = Editor::$styles_key( $saved_styles[ $styles_key ] ); + + foreach ( $rules as $selector => $props ) { + $output_selector = ( '.editor-styles-wrapper' . str_replace( ',', ',.editor-styles-wrapper', $selector ) . '{' ); + $append_selector = false; + + foreach ( $props as $prop => $value ) { + if ( ! array_key_exists( 'skip', $value ) ) { + $output_selector .= ( $prop . ':' . $value['value'] . ';' ); + $append_selector = true; + } + } + + $output_selector .= '}'; + + if ( $append_selector ) { + $output .= $output_selector; + } + } + } + } + + return $output; + } + + /** + * CSS rules for the final output in the widgets editor legacy. + */ + public static function output_widgets_editor_legacy() { + $saved_styles = self::saved_styles(); + + $styles_keys = Widget::legacy_styles_keys(); + + $output = ''; + + foreach ( $styles_keys as $styles_key ) { + if ( method_exists( static::class, $styles_key ) ) { + $rules = static::$styles_key( $saved_styles[ $styles_key ] ); + + foreach ( $rules as $selector => $props ) { + $output_selector = ( $selector . '{' ); + $append_selector = false; + + foreach ( $props as $prop => $value ) { + if ( ! array_key_exists( 'skip', $value ) ) { + $output_selector .= ( $prop . ':' . $value['value'] . ';' ); + $append_selector = true; + } + } + + $output_selector .= '}'; + + if ( $append_selector ) { + $output .= $output_selector; + } + } + } + } + + return $output; + } + + /** + * Get saved styles. + * + * @return array. + */ + public static function saved_styles() { + return wp_parse_args( + get_theme_mod( 'set_styles', array() ), + self::default_styles() + ); + } + + /** + * Get default styles. + * + * @param string $key Color setting key. + * @return string|array. + */ + public static function default_styles( $key = '' ) { + $styles = apply_filters( + 'pressbook_default_styles', + array( + 'header_bg_position' => 'center-center', + 'header_bg_repeat' => 'repeat', + 'header_bg_size' => 'contain', + 'top_banner_max_height' => '150', + 'top_navbar_bg_color_1' => '#166dd6', + 'top_navbar_bg_color_2' => '#1257ab', + 'primary_navbar_bg_color' => '#166dd6', + 'header_bg_color' => '#ffffff', + 'site_title_color' => '#404040', + 'tagline_color' => '#979797', + 'button_bg_color_1' => '#f3c841', + 'button_bg_color_2' => '#f69275', + 'button_font_wgt' => '600', + 'heading_font_wgt' => '700', + 'site_title_font_wgt' => '700', + 'side_widget_border_color' => '#fafafa', + 'footer_bg_color' => '#232323', + 'footer_credit_link_color' => '#f69275', + ) + ); + + if ( array_key_exists( $key, $styles ) ) { + return $styles[ $key ]; + } + + return $styles; + } + + /** + * Header Background Position. + * + * @param string $value Position value. + * @return array + */ + public static function header_bg_position( $value ) { + return array( + '.site-branding' => array( + 'background-position' => array( + 'value' => esc_attr( str_replace( '-', ' ', $value ) ), + 'place' => '_PLACE', + ), + ), + ); + } + + /** + * Header Background Repeat. + * + * @param string $value Repeat value. + * @return array + */ + public static function header_bg_repeat( $value ) { + return array( + '.site-branding' => array( + 'background-repeat' => array( + 'value' => esc_attr( $value ), + 'place' => '_PLACE', + ), + ), + ); + } + + /** + * Header Background Size. + * + * @param string $value Size value. + * @return array + */ + public static function header_bg_size( $value ) { + return array( + '.site-branding' => array( + 'background-size' => array( + 'value' => esc_attr( $value ), + 'place' => '_PLACE', + ), + ), + ); + } + + /** + * Top Banner Max Height. + * + * @param string $value Max Height value. + * @return array + */ + public static function top_banner_max_height( $value ) { + return array( + '.top-banner-image' => array( + 'max-height' => array( + 'value' => ( absint( $value ) . 'px' ), + 'place' => '_PLACEpx', + ), + ), + ); + } + + /** + * Top Navbar Background Color 1. + * + * @param string $value Color value. + * @return array + */ + public static function top_navbar_bg_color_1( $value ) { + $color_2 = self::saved_styles()['top_navbar_bg_color_2']; + + return array( + '.top-navbar' => array( + 'background' => array( + 'value' => ( 'linear-gradient(0deg, ' . Sanitizer::sanitize_alpha_color( $value ) . ' 0%, ' . Sanitizer::sanitize_alpha_color( $color_2 ) . ' 100%)' ), + 'place' => 'linear-gradient(0deg, _PLACE 0%, _EXTRA_COLOR_2 100%)', + 'extra' => array( + 'top_navbar_bg_color_2' => '_EXTRA_COLOR_2', + ), + 'remove' => array( + 'top_navbar_bg_color_2', + ), + ), + ), + '.social-navigation a:active .svg-icon,.social-navigation a:focus .svg-icon,.social-navigation a:hover .svg-icon' => array( + 'color' => array( + 'value' => Sanitizer::sanitize_alpha_color( $value ), + 'place' => '_PLACE', + ), + ), + ); + } + + /** + * Top Navbar Background Color 2. + * + * @param string $value Color value. + * @return array + */ + public static function top_navbar_bg_color_2( $value ) { + $color_1 = self::saved_styles()['top_navbar_bg_color_1']; + + $rules = array( + '.top-navbar' => array( + 'background' => array( + 'skip' => true, + 'value' => ( 'linear-gradient(0deg, ' . Sanitizer::sanitize_alpha_color( $color_1 ) . ' 0%, ' . Sanitizer::sanitize_alpha_color( $value ) . ' 100%)' ), + 'place' => 'linear-gradient(0deg, _EXTRA_COLOR_1 0%, _PLACE 100%)', + 'extra' => array( + 'top_navbar_bg_color_1' => '_EXTRA_COLOR_1', + ), + 'remove' => array( + 'top_navbar_bg_color_1', + ), + ), + ), + ); + + if ( is_customize_preview() ) { + $rules['.social-navigation a:active .svg-icon,.social-navigation a:focus .svg-icon,.social-navigation a:hover .svg-icon'] = array( + 'color' => array( + 'value' => Sanitizer::sanitize_alpha_color( $color_1 ), + 'place' => '_EXTRA_COLOR_1', + 'extra' => array( + 'top_navbar_bg_color_1' => '_EXTRA_COLOR_1', + ), + 'remove' => array( + 'top_navbar_bg_color_1', + ), + ), + ); + } + + return $rules; + } + + /** + * Primary Navbar Background Color. + * + * @param string $value Color value. + * @return array + */ + public static function primary_navbar_bg_color( $value ) { + return array( + '.primary-navbar,.main-navigation ul ul' => array( + 'background' => array( + 'value' => Sanitizer::sanitize_alpha_color( $value ), + 'place' => '_PLACE', + ), + ), + '.main-navigation .main-navigation-arrow-btn:active,.main-navigation .main-navigation-arrow-btn:hover,.main-navigation li.focus>.main-navigation-arrow-btn,.main-navigation:not(.toggled) li:hover>.main-navigation-arrow-btn,.main-navigation a:active,.main-navigation a:focus,.main-navigation a:hover' => array( + 'color' => array( + 'value' => Sanitizer::sanitize_alpha_color( $value ), + 'place' => '_PLACE', + ), + ), + ); + } + + /** + * Header Background Color. + * + * @param string $value Color value. + * @return array + */ + public static function header_bg_color( $value ) { + return array( + '.site-branding' => array( + 'background-color' => array( + 'value' => Sanitizer::sanitize_alpha_color( $value ), + 'place' => '_PLACE', + ), + ), + ); + } + + /** + * Site Title Color. + * + * @param string $value Color value. + * @return array + */ + public static function site_title_color( $value ) { + return array( + '.site-title,.site-title a,.site-title a:active,.site-title a:focus,.site-title a:hover' => array( + 'color' => array( + 'value' => sanitize_hex_color( $value ), + 'place' => '_PLACE', + ), + ), + ); + } + + /** + * Tagline Color. + * + * @param string $value Color value. + * @return array + */ + public static function tagline_color( $value ) { + return array( + '.site-tagline' => array( + 'color' => array( + 'value' => sanitize_hex_color( $value ), + 'place' => '_PLACE', + ), + ), + ); + } + + /** + * Button Background Color 1. + * + * @param string $value Color value. + * @return array + */ + public static function button_bg_color_1( $value ) { + $color_2 = self::saved_styles()['button_bg_color_2']; + + return array( + '.more-link,.wp-block-search .wp-block-search__button,button,input[type=button],input[type=reset],input[type=submit]' => array( + 'background-image' => array( + 'value' => ( 'linear-gradient(to right, ' . Sanitizer::sanitize_alpha_color( $value ) . ' 0%, ' . Sanitizer::sanitize_alpha_color( $color_2 ) . ' 51%, ' . Sanitizer::sanitize_alpha_color( $value ) . ' 100%)' ), + 'place' => 'linear-gradient(to right, _PLACE 0%, _EXTRA_COLOR_2 51%, _PLACE 100%)', + 'extra' => array( + 'button_bg_color_2' => '_EXTRA_COLOR_2', + ), + 'remove' => array( + 'button_bg_color_2', + ), + ), + ), + ); + } + + /** + * Button Background Color 2. + * + * @param string $value Color value. + * @return array + */ + public static function button_bg_color_2( $value ) { + $color_1 = self::saved_styles()['button_bg_color_1']; + + return array( + '.more-link,.wp-block-search .wp-block-search__button,button,input[type=button],input[type=reset],input[type=submit]' => array( + 'background-image' => array( + 'skip' => true, + 'value' => ( 'linear-gradient(to right, ' . Sanitizer::sanitize_alpha_color( $color_1 ) . ' 0%, ' . Sanitizer::sanitize_alpha_color( $value ) . ' 51%, ' . Sanitizer::sanitize_alpha_color( $color_1 ) . ' 100%)' ), + 'place' => 'linear-gradient(to right, _EXTRA_COLOR_1 0%, _PLACE 51%, _EXTRA_COLOR_1 100%)', + 'extra' => array( + 'button_bg_color_1' => '_EXTRA_COLOR_1', + ), + 'remove' => array( + 'button_bg_color_1', + ), + ), + ), + ); + } + + /** + * Button Font Weight. + * + * @param string $value Font weight value. + * @return array + */ + public static function button_font_wgt( $value ) { + return array( + '.more-link,.wp-block-search .wp-block-search__button,button,input[type=button],input[type=reset],input[type=submit]' => array( + 'font-weight' => array( + 'value' => absint( $value ), + 'place' => '_PLACE', + ), + ), + ); + } + + /** + * Heading Font Weight. + * + * @param string $value Font weight value. + * @return array + */ + public static function heading_font_wgt( $value ) { + return array( + 'h1,h2,h3,h4,h5,h6' => array( + 'font-weight' => array( + 'value' => absint( $value ), + 'place' => '_PLACE', + ), + ), + ); + } + + /** + * Site Title Font Weight. + * + * @param string $value Font weight value. + * @return array + */ + public static function site_title_font_wgt( $value ) { + return array( + '.site-title' => array( + 'font-weight' => array( + 'value' => absint( $value ), + 'place' => '_PLACE', + ), + ), + ); + } + + /** + * Side Widget Border Color. + * + * @param string $value Color value. + * @return array + */ + public static function side_widget_border_color( $value ) { + return array( + '.c-sidebar .widget' => array( + 'border-color' => array( + 'value' => Sanitizer::sanitize_alpha_color( $value ), + 'place' => '_PLACE', + ), + ), + ); + } + + /** + * Footer Background Color. + * + * @param string $value Color value. + * @return array + */ + public static function footer_bg_color( $value ) { + return array( + '.footer-widgets,.copyright-text' => array( + 'background' => array( + 'value' => Sanitizer::sanitize_alpha_color( $value ), + 'place' => '_PLACE', + ), + ), + ); + } + + /** + * Footer Credit Link Color. + * + * @param string $value Color value. + * @return array + */ + public static function footer_credit_link_color( $value ) { + return array( + '.copyright-text a' => array( + 'color' => array( + 'value' => sanitize_hex_color( $value ), + 'place' => '_PLACE', + ), + ), + ); + } +} diff --git a/inc/core/Editor.php b/inc/core/Editor.php new file mode 100644 index 0000000..2eb7540 --- /dev/null +++ b/inc/core/Editor.php @@ -0,0 +1,150 @@ +id, array( 'widgets', 'nav-menus' ), true ) ) { + return; + } + + $this->enqueue_assets(); + } + } + + /** + * Enqueue block assets. + */ + public function enqueue_block_assets() { + if ( $this->is_block_screen() ) { + $this->enqueue_assets(); + } + } + + /** + * Enqueue assets. + */ + public function enqueue_assets() { + // Enqueue fonts. + wp_enqueue_style( 'pressbook-editor-fonts', Scripts::fonts_url(), array(), null ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion + + // Add inline style for fonts in the block editor. + $this->load_editor_fonts_css(); + + // Add output of customizer settings as inline style. + wp_add_inline_style( 'pressbook-editor-fonts', CSSRules::output_editor() ); + } + + /** + * Check if block editor screen, but not widgets or nav-menus screen. + * + * @return bool + */ + public function is_block_screen() { + if ( function_exists( '\get_current_screen' ) ) { + $current_screen = get_current_screen(); + if ( $current_screen ) { + if ( \in_array( $current_screen->id, array( 'widgets', 'nav-menus' ), true ) ) { + return false; + } + + if ( \method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) { + return true; + } + } + } + + return false; + } + + /** + * Add inline style for fonts in the block editor. + */ + public function load_editor_fonts_css() { + $fonts_css = ''; + + /* translators: If there are characters in your language that are not supported by Inter, translate this to 'off'. Do not translate into your own language. */ + $inter = _x( 'on', 'Inter font (in the editor): on or off', 'pressbook' ); + if ( 'off' !== $inter ) { + $fonts_css .= ( '.editor-styles-wrapper.editor-styles-wrapper{font-family:\'Inter\', Arial, Helvetica, sans-serif;}' ); + } + + /* translators: If there are characters in your language that are not supported by Lato, translate this to 'off'. Do not translate into your own language. */ + $lato = _x( 'on', 'Lato font (in the editor): on or off', 'pressbook' ); + if ( 'off' !== $lato ) { + $fonts_css .= ( '.editor-styles-wrapper .editor-post-title__input,.editor-styles-wrapper .editor-post-title .editor-post-title__input,.editor-styles-wrapper h1,.editor-styles-wrapper h2,.editor-styles-wrapper h3,.editor-styles-wrapper h4,.editor-styles-wrapper h5,.editor-styles-wrapper h6{font-family:\'Lato\', Helvetica, Arial, sans-serif;}' ); + } + + if ( '' !== $fonts_css ) { + wp_add_inline_style( 'pressbook-editor-fonts', $fonts_css ); + } + } + + /** + * Styles keys for the editor CSS output. + * + * @return array + */ + public static function styles_keys() { + return apply_filters( + 'pressbook_default_editor_styles_keys', + array( 'heading_font_wgt' ) + ); + } + + /** + * Heading Font Weight. + * + * @param string $value Color value. + * @return array + */ + public static function heading_font_wgt( $value ) { + return array( + '.editor-styles-wrapper .editor-post-title__input,.editor-styles-wrapper .editor-post-title .editor-post-title__input,.editor-styles-wrapper h1,.editor-styles-wrapper h2,.editor-styles-wrapper h3,.editor-styles-wrapper h4,.editor-styles-wrapper h5,.editor-styles-wrapper h6' => array( + 'font-weight' => array( + 'value' => absint( $value ), + ), + ), + ); + } +} diff --git a/inc/core/Enhance.php b/inc/core/Enhance.php new file mode 100644 index 0000000..00ca6cc --- /dev/null +++ b/inc/core/Enhance.php @@ -0,0 +1,175 @@ +', esc_url( get_bloginfo( 'pingback_url' ) ) ); + } + } + + /** + * Change the excerpt more string. + * + * @param string $more The string shown within the more link. + * @return string + */ + public function excerpt_more( $more ) { + if ( is_admin() ) { + return $more; + } + + $more_text = General::get_read_more_text(); + + if ( '' === $more_text ) { + $more_text = esc_html__( 'Read More', 'pressbook' ); + } + + $more = ( '...' ); + + return apply_filters( 'pressbook_excerpt_more', $more ); + } + + /** + * Change the content more string. + * + * @param string $more The string shown within the more link. + * @return string + */ + public function content_more( $more ) { + if ( is_admin() ) { + return $more; + } + + $more_text = General::get_read_more_text(); + + if ( '' === $more_text ) { + $more_text = esc_html__( 'Read More', 'pressbook' ); + } + + $more = ( '' ); + + return apply_filters( 'pressbook_content_more', $more ); + } + + /** + * Change the search form button text. + * + * @param string $form The search form HTML output. + * @return string + */ + public function search_form( $form ) { + if ( is_admin() ) { + return $form; + } + + $button_text = General::get_search_form_button_text(); + + if ( '' !== $button_text ) { + $form = str_replace( 'value="Search"', ( 'value="' . esc_attr( $button_text ) . '"' ), $form ); + } + + return $form; + } +} diff --git a/inc/core/Header.php b/inc/core/Header.php new file mode 100644 index 0000000..38acfc2 --- /dev/null +++ b/inc/core/Header.php @@ -0,0 +1,42 @@ + '', + 'width' => 1600, + 'height' => 250, + 'flex-width' => true, + 'flex-height' => true, + 'header-text' => false, + ) + ) + ); + } +} diff --git a/inc/core/Helpers.php b/inc/core/Helpers.php new file mode 100644 index 0000000..f5f1dea --- /dev/null +++ b/inc/core/Helpers.php @@ -0,0 +1,95 @@ +post_content, '' ) ); + + $format = ( false !== get_post_format() ) ? get_post_format() : 'standard'; + + $show_excerpt = ( 'excerpt' === Blog::get_archive_content() ); + + $show_excerpt = ( 'standard' !== $format ) ? false : $show_excerpt; + + $show_excerpt = ( $more_tag ) ? false : $show_excerpt; + + $show_excerpt = ( is_search() ) ? true : $show_excerpt; + + return apply_filters( 'pressbook_show_excerpt', $show_excerpt ); + } + + /** + * Get theme name. + * + * @return string + */ + public static function get_theme_name() { + return wp_get_theme()->get( 'Name' ); + } + + /** + * Get theme URL. + * Used in footer credit link. + * + * @return string + */ + public static function get_theme_url() { + return wp_get_theme()->get( 'ThemeURI' ); + } + + /** + * Get theme author URL. + * + * @return string + */ + public static function get_theme_author_url() { + return wp_get_theme()->get( 'AuthorURI' ); + } + + /** + * Get upsell detail URL. + * + * @return string + */ + public static function get_upsell_detail_url() { + return 'https://scriptstown.com/wordpress-themes/pressbook-premium/'; + } + + /** + * Get upsell buy URL. + * Used one time in the theme page and customizer. + * + * @return string + */ + public static function get_upsell_buy_url() { + return 'https://scriptstown.com/account/signup/pressbook-premium-wordpress-theme'; + } + + /** + * Get FAQ page URL. + * + * @return string + */ + public static function get_faq_url() { + return 'https://scriptstown.com/wordpress-themes/pressbook/#faq'; + } +} diff --git a/inc/core/Icons.php b/inc/core/Icons.php new file mode 100644 index 0000000..b2dc17f --- /dev/null +++ b/inc/core/Icons.php @@ -0,0 +1,279 @@ + source on its own array key, without adding the + * both `width` and `height` attributes, since these are added dynamically, + * before rendering the SVG code. + * + * All icons are assumed to have equal width and height, hence the option + * to only specify a `$size` parameter in the svg methods. + */ +class Icons { + /** + * Gets the SVG code for a given icon. + * + * @param string $group Icon group. + * @param string $icon Icon key. + * @param int $size Icon size. + * @return string + */ + public static function get_svg( $group, $icon, $size ) { + if ( 'ui' === $group ) { + $arr = self::$ui_icons; + } elseif ( 'social' === $group ) { + $arr = self::$social_icons; + } else { + $arr = array(); + } + if ( array_key_exists( $icon, $arr ) ) { + $repl = sprintf( '\s*<', $svg ); // Remove white space between SVG tags. + return $svg; + } + return null; + } + + /** + * Detects the social network from a URL and returns the SVG code for its icon. + * + * @param string $uri Social link uri. + * @param int $size Icon size. + * @return string + */ + public static function get_social_link_svg( $uri, $size ) { + static $regex_map; // Only compute regex map once, for performance. + if ( ! isset( $regex_map ) ) { + $regex_map = array(); + $map = &self::$social_icons_map; // Use reference instead of copy, to save memory. + foreach ( array_keys( self::$social_icons ) as $icon ) { + $domains = array_key_exists( $icon, $map ) ? $map[ $icon ] : array( sprintf( '%s.com', $icon ) ); + $domains = array_map( 'trim', $domains ); // Remove leading/trailing spaces, to prevent regex from failing to match. + $domains = array_map( 'preg_quote', $domains ); + $regex_map[ $icon ] = sprintf( '/(%s)/i', implode( '|', $domains ) ); + } + } + foreach ( $regex_map as $icon => $regex ) { + if ( preg_match( $regex, $uri ) ) { + return self::get_svg( 'social', $icon, $size ); + } + } + return null; + } + + /** + * User Interface icons – svg sources. + * + * @var array + */ + public static $ui_icons = array( + 'menu' => '', + + 'close' => '', + + 'chevron_down' => '', + + 'search' => '', + + 'calendar' => '', + + 'user' => '', + + 'category' => '', + + 'tag' => ' + + ', + + 'bookmark' => '', + + 'comment' => '', + ); + + /** + * Social Icons – domain mappings. + * + * By default, each Icon ID is matched against a .com TLD. To override this behavior, + * specify all the domains it covers (including the .com TLD too, if applicable). + * + * @var array + */ + public static $social_icons_map = array( + 'amazon' => array( + 'amazon.com', + 'amazon.cn', + 'amazon.in', + 'amazon.fr', + 'amazon.de', + 'amazon.it', + 'amazon.nl', + 'amazon.es', + 'amazon.co', + 'amazon.ca', + ), + 'behance' => array( + 'behance.net', + ), + 'codepen' => array( + 'codepen.io', + ), + 'discord' => array( + 'discord.com', + 'discord.gg', + ), + 'facebook' => array( + 'facebook.com', + 'fb.me', + ), + 'feed' => array( + 'feed', + ), + 'google' => array( + 'g.page', + ), + 'kbin' => array( + 'kbin.social', + ), + 'lastfm' => array( + 'last.fm', + ), + 'lemmy' => array( + 'lemmy.world', + 'join-lemmy.org', + ), + 'mail' => array( + 'mailto:', + ), + 'mastodon' => array( + 'mastodon.world', + 'mastodon.social', + ), + 'pocket' => array( + 'getpocket.com', + ), + 'threads' => array( + 'threads.net', + ), + 'tiktok' => array( + 'tiktok.com', + ), + 'twitch' => array( + 'twitch.tv', + ), + 'wordpress' => array( + 'wordpress.com', + 'wordpress.org', + ), + 'x' => array( + 'x.com', + ), + ); + + /** + * Social Icons – svg sources. + * + * @var array + */ + public static $social_icons = array( + '500px' => '', + + 'amazon' => '', + + 'bandcamp' => '', + + 'behance' => '', + + 'codepen' => '', + + 'deviantart' => '', + + 'discord' => '', + + 'dribbble' => '', + + 'dropbox' => '', + + 'etsy' => '', + + 'facebook' => '', + + 'feed' => '', + + 'flickr' => '', + + 'foursquare' => '', + + 'goodreads' => '', + + 'google' => '', + + 'github' => '', + + 'instagram' => '', + + 'kbin' => '', + + 'lastfm' => '', + + 'lemmy' => '', + + 'linkedin' => '', + + 'mail' => '', + + 'mastodon' => '', + + 'medium' => '', + + 'meetup' => '', + + 'pinterest' => '', + + 'pocket' => '', + + 'reddit' => '', + + 'skype' => '', + + 'snapchat' => '', + + 'soundcloud' => '', + + 'spotify' => '', + + 'threads' => '', + + 'tiktok' => '', + + 'tumblr' => '', + + 'twitch' => '', + + 'twitter' => '', + + 'vimeo' => '', + + 'vk' => '', + + 'whatsapp' => '', + + // phpcs:disable WordPress.WP.CapitalPDangit.Misspelled + 'wordpress' => '', + + 'x' => '', + + 'yelp' => '', + + 'youtube' => '', + ); +} diff --git a/inc/core/IconsHelper.php b/inc/core/IconsHelper.php new file mode 100644 index 0000000..dcc89bd --- /dev/null +++ b/inc/core/IconsHelper.php @@ -0,0 +1,131 @@ +theme_location ) { + $svg = self::get_social_link_svg( $item->url, 26 ); + if ( empty( $svg ) ) { + $svg = self::get_icon_svg( 'link' ); + } + $item_output = str_replace( $args->link_after, '' . $svg, $item_output ); + } + + return $item_output; + } + + /** + * Gets the SVG code for a given icon. + * + * @param string $icon Icon key. + * @param integer $size Icon size. + * @return string + */ + public static function get_icon_svg( $icon, $size = 24 ) { + return Icons::get_svg( 'ui', $icon, $size ); + } + + /** + * Gets the SVG code for a given social icon. + * + * @param string $icon Icon key. + * @param int $size Icon size. + * @return string + */ + public static function get_social_icon_svg( $icon, $size = 24 ) { + return Icons::get_svg( 'social', $icon, $size ); + } + + /** + * Detects the social network from a URL and returns the SVG code for its icon. + * + * @param string $uri Social link uri. + * @param int $size Icon size. + * @return string + */ + public static function get_social_link_svg( $uri, $size = 24 ) { + return Icons::get_social_link_svg( $uri, $size ); + } + + /** + * Output and Get Theme SVG. + * Output and get the SVG markup for an icon in the Icons class. + * + * @param string $icon Icon key. + * @param integer $size Icon size. + * @param string $group The icon group. + */ + public static function the_theme_svg( $icon, $size = 24, $group = 'ui' ) { + echo self::get_theme_svg( $icon, $size, $group ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaped in IconsHelper::get_theme_svg(). + } + + /** + * Get information about the SVG icon. + * + * @param string $icon Icon key. + * @param integer $size Icon size. + * @param string $group The icon group. + */ + public static function get_theme_svg( $icon, $size = 24, $group = 'ui' ) { + // Make sure that only our allowed tags and attributes are included. + $svg = wp_kses( + Icons::get_svg( $group, $icon, $size ), + array( + 'svg' => array( + 'class' => true, + 'xmlns' => true, + 'width' => true, + 'height' => true, + 'viewbox' => true, + 'aria-hidden' => true, + 'role' => true, + 'focusable' => true, + ), + 'path' => array( + 'fill' => true, + 'fill-rule' => true, + 'd' => true, + 'transform' => true, + ), + 'polygon' => array( + 'fill' => true, + 'fill-rule' => true, + 'points' => true, + 'transform' => true, + 'focusable' => true, + ), + ) + ); + + if ( ! $svg ) { + return false; + } + return $svg; + } +} diff --git a/inc/core/Jetpack.php b/inc/core/Jetpack.php new file mode 100644 index 0000000..c18bfa7 --- /dev/null +++ b/inc/core/Jetpack.php @@ -0,0 +1,80 @@ + 'primary', + 'render' => array( $this, 'infinite_scroll_render' ), + 'footer' => 'page', + ) + ); + + // Add theme support for Responsive Videos. + add_theme_support( 'jetpack-responsive-videos' ); + + // Add theme support for Content Options. + add_theme_support( + 'jetpack-content-options', + array( + 'post-details' => array( + 'stylesheet' => 'pressbook-style', + 'date' => '.posted-on', + 'categories' => '.cat-links', + 'tags' => '.tag-links', + 'author' => '.byline', + 'comment' => '.comments-link', + ), + 'featured-images' => array( + 'archive' => true, + 'post' => true, + 'page' => true, + ), + ) + ); + } + + /** + * Custom render function for Infinite Scroll. + */ + public function infinite_scroll_render() { + while ( have_posts() ) { + the_post(); + if ( is_search() ) { + get_template_part( 'template-parts/content', 'search' ); + } else { + get_template_part( 'template-parts/content' ); + } + } + } +} diff --git a/inc/core/Menu.php b/inc/core/Menu.php new file mode 100644 index 0000000..8e1ec6c --- /dev/null +++ b/inc/core/Menu.php @@ -0,0 +1,105 @@ + esc_html__( 'Primary', 'pressbook' ), + 'menu-2' => esc_html__( 'Top Menu', 'pressbook' ), + 'social' => esc_html__( 'Social Links Menu', 'pressbook' ), + ) + ) + ); + } + + /** + * Filter the HTML output of a nav menu item to add the dropdown button that reveal the sub-menu. + * + * @param string $item_output Nav menu item HTML. + * @param object $item Nav menu item. + * @param int $depth The depth of the menu. + * @param array $args Array of menu args, such as theme location. + * @return string Modified nav menu item HTML. + */ + public function add_dropdown_icons( $item_output, $item, $depth, $args ) { + // Only add the sub-menu button to the main navigation. + if ( 'menu-1' === $args->theme_location ) { + // Skip if the item has no sub-menu. + if ( in_array( 'menu-item-has-children', $item->classes, true ) ) { + $item_output .= ''; + } + } + + return $item_output; + } + + /** + * Output HTML for the primary menu. + */ + public static function primary_menu() { + if ( PrimaryNavbar::get_primary_navbar_search() ) { + $search = ( '' ); + } else { + $search = ''; + } + + wp_nav_menu( + array( + 'theme_location' => 'menu-1', + 'menu_id' => 'primary-menu', + 'items_wrap' => '
    %3$s' . $search . '
', + ) + ); + } + + /** + * Get top menus class. + * + * @return string + */ + public static function top_menus_class() { + $left_menu_active = has_nav_menu( 'social' ); + $right_menu_active = has_nav_menu( 'menu-2' ); + + $top_menus_class = 'top-menus'; + + if ( $left_menu_active && $right_menu_active ) { + $top_menus_class .= ' top-menus-left-right'; + } elseif ( $left_menu_active ) { + $top_menus_class .= ' top-menus-left'; + } elseif ( $right_menu_active ) { + $top_menus_class .= ' top-menus-right'; + } + + return apply_filters( 'pressbook_top_menus_class', $top_menus_class ); + } +} diff --git a/inc/core/Options.php b/inc/core/Options.php new file mode 100644 index 0000000..eb53437 --- /dev/null +++ b/inc/core/Options.php @@ -0,0 +1,27 @@ +. + * + * @package PressBook + */ + +namespace PressBook\Options; + +use \WP_Customize_Control; + +if ( class_exists( '\WP_Customize_Control' ) ) { + /** + * Alpha color picker control class. + */ + class AlphaColorControl extends WP_Customize_Control { + /** + * Control name. + * + * @var string + */ + public $type = 'alpha-color'; + + /** + * Add support for palettes to be passed in. + * + * Supported palette values are true, false, or an array of RGBa and Hex colors. + * + * @var bool + */ + public $palette; + + /** + * Add support for showing the opacity value on the slider handle. + * + * @var array + */ + public $show_opacity; + + /** + * Enqueue scripts and styles. + */ + public function enqueue() { + wp_enqueue_style( 'alpha-color-picker', get_theme_file_uri( 'inc/alpha-color-picker.css' ), array( 'wp-color-picker' ), PRESSBOOK_VERSION ); + + wp_enqueue_script( 'alpha-color-picker', get_theme_file_uri( 'js/alpha-color-picker.js' ), array( 'jquery', 'wp-color-picker' ), PRESSBOOK_VERSION, true ); + } + + /** + * Render the control. + */ + public function render_content() { + // Process the palette. + if ( is_array( $this->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'; + + // Output the label and description if they were passed in. + if ( isset( $this->label ) && ( '' !== $this->label ) ) { + echo '' . esc_html( $this->label ) . ''; + } + if ( isset( $this->description ) && ( '' !== $this->description ) ) { + echo '' . esc_html( $this->description ) . ''; + } + ?> + + + Title ]. + * + * @return array + */ + public function pattern_blocks_choices() { + $pattern_blocks = get_posts( + array( + 'post_type' => 'wp_block', + 'numberposts' => 100, + ) + ); + + $pattern_blocks_choices = array( 0 => esc_html__( 'Select a block', 'pressbook' ) ); + foreach ( $pattern_blocks as $block ) { + $pattern_blocks_choices[ $block->ID ] = $block->post_title; + } + + return $pattern_blocks_choices; + } + + /** + * Block description. + * + * @return string + */ + public function block_description() { + return wp_kses( + sprintf( + /* translators: %s: URL to the pattern-blocks admin page. */ + __( 'This is the content of the block section. You can create or edit the block section in the Pattern Blocks Manager (opens in a new window).
After creating the pattern block, you may need to refresh this customizer page and then select the newly created block.
The selected block content will appear on the block section.', 'pressbook' ), + esc_url( admin_url( 'edit.php?post_type=wp_block' ) ) + ), + array( + 'a' => array( + 'href' => array(), + 'target' => array(), + ), + 'br' => array(), + ) + ); + } +} diff --git a/inc/core/Options/Blog.php b/inc/core/Options/Blog.php new file mode 100644 index 0000000..a84a51a --- /dev/null +++ b/inc/core/Options/Blog.php @@ -0,0 +1,493 @@ +sec_blog( $wp_customize ); + + $this->set_archive_post_layout_lg( $wp_customize ); + + $this->set_archive_content( $wp_customize ); + + $this->set_show_archv_title( $wp_customize ); + + $this->set_hide_post_meta_all( $wp_customize ); + $this->set_hide_post_meta_date( $wp_customize ); + $this->set_hide_post_meta_author( $wp_customize ); + $this->set_hide_post_meta_cat( $wp_customize ); + $this->set_hide_post_meta_tag( $wp_customize ); + + $this->set_featured_label( $wp_customize ); + } + + /** + * Section: Blog Options. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function sec_blog( $wp_customize ) { + $wp_customize->add_section( + 'sec_blog', + array( + 'title' => esc_html__( 'Blog Options', 'pressbook' ), + 'description' => esc_html__( 'You can customize the blog options in here.', 'pressbook' ), + 'priority' => 156, + ) + ); + } + + /** + * Add setting: Archive Post Layout (Large-Screen Devices). + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_archive_post_layout_lg( $wp_customize ) { + $wp_customize->add_setting( + 'set_archive_post_layout_lg', + array( + 'default' => self::get_archive_post_layout_lg( true ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_select' ), + ) + ); + + $wp_customize->add_control( + 'set_archive_post_layout_lg', + array( + 'section' => 'sec_blog', + 'type' => 'radio', + 'choices' => array( + 'rows' => esc_html__( 'Thumbnail-Content - Rows', 'pressbook' ), + 'columns' => esc_html__( 'Thumbnail-Content - Columns (Contain)', 'pressbook' ), + 'cover' => esc_html__( 'Thumbnail-Content - Columns (Cover)', 'pressbook' ), + ), + 'label' => esc_html__( 'Blog Archive Post Layout (Large-Screen Devices)', 'pressbook' ), + 'description' => esc_html__( 'Select the layout for the blog post in archive pages. Default: Thumbnail-Content - Columns (Cover)', 'pressbook' ), + ) + ); + } + + /** + * Get setting: Archive Post Layout (Large-Screen Devices). + * + * @param bool $get_default Get default. + * @return string + */ + public static function get_archive_post_layout_lg( $get_default = false ) { + $default = apply_filters( 'pressbook_default_archive_post_layout_lg', 'cover' ); + if ( $get_default ) { + return $default; + } + + return get_theme_mod( 'set_archive_post_layout_lg', $default ); + } + + /** + * Add setting: Archive Content. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_archive_content( $wp_customize ) { + $wp_customize->add_setting( + 'set_archive_content', + array( + 'default' => self::get_archive_content( true ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_select' ), + ) + ); + + $wp_customize->add_control( + 'set_archive_content', + array( + 'section' => 'sec_blog', + 'type' => 'radio', + 'choices' => array( + 'full' => esc_html__( 'Full text', 'pressbook' ), + 'excerpt' => esc_html__( 'Summary', 'pressbook' ), + ), + 'label' => esc_html__( 'Blog Archive Content', 'pressbook' ), + 'description' => esc_html__( 'Select the content to show in the blog archive pages. Default: Summary', 'pressbook' ), + ) + ); + } + + /** + * Get setting: Archive Content. + * + * @param bool $get_default Get default. + * @return string + */ + public static function get_archive_content( $get_default = false ) { + $default = apply_filters( 'pressbook_default_archive_content', 'excerpt' ); + if ( $get_default ) { + return $default; + } + + return get_theme_mod( 'set_archive_content', $default ); + } + + /** + * Add setting: Show Archive Page Title. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_show_archv_title( $wp_customize ) { + $wp_customize->add_setting( + 'set_show_archv_title', + array( + 'type' => 'theme_mod', + 'default' => self::get_show_archv_title( true ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_show_archv_title', + array( + 'section' => 'sec_blog', + 'type' => 'checkbox', + 'label' => esc_html__( 'Show Archive Page Title', 'pressbook' ), + 'description' => esc_html__( 'In archive pages, you can show the archive title and archive description. This is applicable to any archive pages like tag, category, etc.', 'pressbook' ), + ) + ); + } + + /** + * Get setting: Show Archive Page Title. + * + * @param bool $get_default Get default. + * @return bool + */ + public static function get_show_archv_title( $get_default = false ) { + $default = apply_filters( 'pressbook_default_show_archive_title', true ); + if ( $get_default ) { + return $default; + } + + return get_theme_mod( 'set_show_archv_title', $default ); + } + + /** + * Add setting: Hide Post Meta: All. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_hide_post_meta_all( $wp_customize ) { + $wp_customize->add_setting( + 'set_hide_post_meta[all]', + array( + 'type' => 'theme_mod', + 'default' => self::get_hide_post_meta_default( 'all' ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_hide_post_meta[all]', + array( + 'section' => 'sec_blog', + 'type' => 'checkbox', + 'label' => esc_html__( 'Post Meta: Hide All', 'pressbook' ), + 'description' => esc_html__( 'Hide all the post meta data including date, author, number of comments, etc.', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Hide Post Meta: Date. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_hide_post_meta_date( $wp_customize ) { + $wp_customize->add_setting( + 'set_hide_post_meta[date]', + array( + 'type' => 'theme_mod', + 'default' => self::get_hide_post_meta_default( 'date' ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_hide_post_meta[date]', + array( + 'section' => 'sec_blog', + 'type' => 'checkbox', + 'label' => esc_html__( 'Post Meta: Hide Date', 'pressbook' ), + 'description' => esc_html__( 'Hide only the post date. Checking the "Post Meta: Hide All" option will override this option.', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Hide Post Meta: Author. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_hide_post_meta_author( $wp_customize ) { + $wp_customize->add_setting( + 'set_hide_post_meta[author]', + array( + 'type' => 'theme_mod', + 'default' => self::get_hide_post_meta_default( 'author' ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_hide_post_meta[author]', + array( + 'section' => 'sec_blog', + 'type' => 'checkbox', + 'label' => esc_html__( 'Post Meta: Hide Author', 'pressbook' ), + 'description' => esc_html__( 'Hide only the post author. Checking the "Post Meta: Hide All" option will override this option.', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Hide Post: Hide Categories. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_hide_post_meta_cat( $wp_customize ) { + $wp_customize->add_setting( + 'set_hide_post_meta[cat]', + array( + 'type' => 'theme_mod', + 'default' => self::get_hide_post_meta_default( 'cat' ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_hide_post_meta[cat]', + array( + 'section' => 'sec_blog', + 'type' => 'checkbox', + 'label' => esc_html__( 'Post: Hide Categories', 'pressbook' ), + 'description' => esc_html__( 'Hide the post categories.', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Hide Post: Hide Tags. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_hide_post_meta_tag( $wp_customize ) { + $wp_customize->add_setting( + 'set_hide_post_meta[tag]', + array( + 'type' => 'theme_mod', + 'default' => self::get_hide_post_meta_default( 'tag' ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_hide_post_meta[tag]', + array( + 'section' => 'sec_blog', + 'type' => 'checkbox', + 'label' => esc_html__( 'Post: Hide Tags', 'pressbook' ), + 'description' => esc_html__( 'Hide the post tags.', 'pressbook' ), + ) + ); + } + + /** + * Get setting: Hide Post Meta. + * + * @return array + */ + public static function get_hide_post_meta() { + return wp_parse_args( + get_theme_mod( 'set_hide_post_meta', array() ), + self::get_hide_post_meta_default() + ); + } + + /** + * Get default setting: Hide Post Meta. + * + * @param string $key Setting key. + * @return mixed|array + */ + public static function get_hide_post_meta_default( $key = '' ) { + $default = apply_filters( + 'pressbook_default_hide_post_meta', + array( + 'all' => false, + 'date' => false, + 'author' => false, + 'cat' => false, + 'tag' => false, + ) + ); + + if ( array_key_exists( $key, $default ) ) { + return $default[ $key ]; + } + + return $default; + } + + /** + * Add setting: Featured (Sticky Post) Label. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_featured_label( $wp_customize ) { + $wp_customize->add_setting( + 'set_featured_label', + array( + 'default' => self::get_featured_label( true ), + 'transport' => 'refresh', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + $wp_customize->add_control( + 'set_featured_label', + array( + 'section' => 'sec_blog', + 'type' => 'text', + 'label' => esc_html__( 'Featured (Sticky Post) Label', 'pressbook' ), + 'description' => esc_html__( 'You can change the "Featured" label for the sticky posts. Leave it empty for default text.', 'pressbook' ), + ) + ); + } + + /** + * Get setting: Featured (Sticky Post) Label. + * + * @param bool $get_default Get default. + * @return string + */ + public static function get_featured_label( $get_default = false ) { + $default = apply_filters( 'pressbook_default_featured_label', '' ); + + if ( $get_default ) { + return $default; + } + + return get_theme_mod( 'set_featured_label', $default ); + } + + /** + * Get text: Featured (Sticky Post) Label. + * + * @return string + */ + public static function featured_label_text() { + $label = self::get_featured_label(); + if ( '' !== $label ) { + return $label; + } + + return esc_html_x( 'Featured', 'Label for sticky posts', 'pressbook' ); + } + + /** + * Get entry meta class. + * + * @return string + */ + public static function entry_meta_class() { + $hide_post_meta = self::get_hide_post_meta(); + + $entry_meta_class = 'entry-meta'; + if ( $hide_post_meta['all'] ) { + $entry_meta_class .= ' hide-entry-meta'; + } + if ( $hide_post_meta['date'] ) { + $entry_meta_class .= ' hide-posted-on'; + } + if ( $hide_post_meta['author'] ) { + $entry_meta_class .= ' hide-posted-by'; + } + + return apply_filters( 'pressbook_entry_meta_class', $entry_meta_class ); + } + + /** + * Get entry meta categories class. + * + * @return string + */ + public static function entry_meta_cat_class() { + $hide_post_meta = self::get_hide_post_meta(); + + $entry_meta_cat_class = 'cat-links'; + if ( $hide_post_meta['cat'] ) { + $entry_meta_cat_class .= ' hide-clip'; + } + + return apply_filters( 'pressbook_entry_meta_cat_class', $entry_meta_cat_class ); + } + + /** + * Get entry meta tags class. + * + * @return string + */ + public static function entry_meta_tag_class() { + $hide_post_meta = self::get_hide_post_meta(); + + $entry_meta_tag_class = 'tag-links'; + if ( $hide_post_meta['tag'] ) { + $entry_meta_tag_class .= ' hide-clip'; + } + + return apply_filters( 'pressbook_entry_meta_tag_class', $entry_meta_tag_class ); + } + + /** + * Get archive title class and option. + * + * @return array + */ + public static function archv_title() { + $show_archv_title = self::get_show_archv_title(); + $archv_title_class = 'page-title'; + $archv_header_class = 'pb-archv-header'; + if ( $show_archv_title ) { + $archv_title_class .= ' pb-archv-title'; + $archv_header_class .= ' pb-archv-header-show'; + } else { + $archv_title_class .= ' screen-reader-text'; + } + + return array( + 'show' => $show_archv_title, + 'class' => apply_filters( 'pressbook_archv_title_class', $archv_title_class ), + 'header' => apply_filters( 'pressbook_archv_header_class', $archv_header_class ), + ); + } +} diff --git a/inc/core/Options/Colors.php b/inc/core/Options/Colors.php new file mode 100644 index 0000000..4062579 --- /dev/null +++ b/inc/core/Options/Colors.php @@ -0,0 +1,194 @@ +set_header_bg_color( $wp_customize ); + $this->set_site_title_color( $wp_customize ); + $this->set_tagline_color( $wp_customize ); + + $this->set_button_bg_color_1( $wp_customize ); + $this->set_button_bg_color_2( $wp_customize ); + } + + /** + * Add setting: Header Background Color. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_header_bg_color( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[header_bg_color]', + array( + 'default' => CSSRules::default_styles( 'header_bg_color' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_alpha_color' ), + ) + ); + + $wp_customize->add_control( + new AlphaColorControl( + $wp_customize, + 'set_styles[header_bg_color]', + array( + 'section' => 'colors', + 'label' => esc_html__( 'Header Background Color', 'pressbook' ), + 'settings' => 'set_styles[header_bg_color]', + 'palette' => self::default_alpha_palette(), + 'show_opacity' => true, + ) + ) + ); + } + + /** + * Add setting: Site Title Color. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_site_title_color( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[site_title_color]', + array( + 'default' => CSSRules::default_styles( 'site_title_color' ), + 'transport' => 'postMessage', + 'sanitize_callback' => 'sanitize_hex_color', + ) + ); + + $wp_customize->add_control( + new \WP_Customize_Color_Control( + $wp_customize, + 'set_styles[site_title_color]', + array( + 'section' => 'colors', + 'label' => esc_html__( 'Site Title Color', 'pressbook' ), + ) + ) + ); + } + + /** + * Add setting: Tagline Color. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_tagline_color( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[tagline_color]', + array( + 'default' => CSSRules::default_styles( 'tagline_color' ), + 'transport' => 'postMessage', + 'sanitize_callback' => 'sanitize_hex_color', + ) + ); + + $wp_customize->add_control( + new \WP_Customize_Color_Control( + $wp_customize, + 'set_styles[tagline_color]', + array( + 'section' => 'colors', + 'label' => esc_html__( 'Tagline Color', 'pressbook' ), + ) + ) + ); + } + + /** + * Add setting: Button Background Color 1. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_button_bg_color_1( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[button_bg_color_1]', + array( + 'default' => CSSRules::default_styles( 'button_bg_color_1' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_alpha_color' ), + ) + ); + + $wp_customize->add_control( + new AlphaColorControl( + $wp_customize, + 'set_styles[button_bg_color_1]', + array( + 'section' => 'colors', + 'label' => esc_html__( 'Button Gradient Background 1', 'pressbook' ), + 'settings' => 'set_styles[button_bg_color_1]', + 'palette' => true, + 'show_opacity' => true, + ) + ) + ); + } + + /** + * Add setting: Button Background Color 2. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_button_bg_color_2( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[button_bg_color_2]', + array( + 'default' => CSSRules::default_styles( 'button_bg_color_2' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_alpha_color' ), + ) + ); + + $wp_customize->add_control( + new AlphaColorControl( + $wp_customize, + 'set_styles[button_bg_color_2]', + array( + 'section' => 'colors', + 'label' => esc_html__( 'Button Gradient Background 2', 'pressbook' ), + 'settings' => 'set_styles[button_bg_color_2]', + 'palette' => true, + 'show_opacity' => true, + ) + ) + ); + } + + /** + * Get default alpha color palette. + * + * @return array + */ + public static function default_alpha_palette() { + return apply_filters( + 'pressbook_default_alpha_color_palette', + array( + '#ffffff', + '#000000', + 'rgba(28,28,28,0.95)', + 'rgba(7,18,66,0.95)', + 'rgba(0,33,21,0.95)', + 'rgba(0,0,0,0.8)', + 'rgba(22,0,0,0.95)', + ) + ); + } +} diff --git a/inc/core/Options/Content.php b/inc/core/Options/Content.php new file mode 100644 index 0000000..c84b28c --- /dev/null +++ b/inc/core/Options/Content.php @@ -0,0 +1,176 @@ +sec_content( $wp_customize ); + + $this->set_content_layout_no_t_padding( $wp_customize ); + $this->set_content_layout_no_b_padding( $wp_customize ); + $this->set_content_layout_no_x_padding( $wp_customize ); + } + + /** + * Section: Content Layout Options. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function sec_content( $wp_customize ) { + $wp_customize->add_section( + 'sec_content', + array( + 'title' => esc_html__( 'Content Layout', 'pressbook' ), + 'description' => esc_html__( 'You can customize the content layout options in here.', 'pressbook' ), + 'priority' => 154, + ) + ); + } + + /** + * Add setting: Remove Top Padding. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_content_layout_no_t_padding( $wp_customize ) { + $wp_customize->add_setting( + 'set_content_layout[no_t_padding]', + array( + 'default' => self::get_content_layout_default( 'no_t_padding' ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_content_layout[no_t_padding]', + array( + 'section' => 'sec_content', + 'type' => 'checkbox', + 'label' => esc_html__( 'Remove Top Padding', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Remove Bottom Padding. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_content_layout_no_b_padding( $wp_customize ) { + $wp_customize->add_setting( + 'set_content_layout[no_b_padding]', + array( + 'default' => self::get_content_layout_default( 'no_b_padding' ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_content_layout[no_b_padding]', + array( + 'section' => 'sec_content', + 'type' => 'checkbox', + 'label' => esc_html__( 'Remove Bottom Padding', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Remove Horizontal Padding. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_content_layout_no_x_padding( $wp_customize ) { + $wp_customize->add_setting( + 'set_content_layout[no_x_padding]', + array( + 'default' => self::get_content_layout_default( 'no_x_padding' ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_content_layout[no_x_padding]', + array( + 'section' => 'sec_content', + 'type' => 'checkbox', + 'label' => esc_html__( 'Remove Horizontal Padding', 'pressbook' ), + ) + ); + } + + /** + * Get setting: Content Layout. + * + * @return array + */ + public static function get_content_layout() { + return wp_parse_args( + get_theme_mod( 'set_content_layout', array() ), + self::get_content_layout_default() + ); + } + + /** + * Get default setting: Content Layout. + * + * @param string $key Setting key. + * @return mixed|array + */ + public static function get_content_layout_default( $key = '' ) { + $default = apply_filters( + 'pressbook_default_content_layout', + array( + 'no_t_padding' => false, + 'no_b_padding' => false, + 'no_x_padding' => false, + ) + ); + + if ( array_key_exists( $key, $default ) ) { + return $default[ $key ]; + } + + return $default; + } + + /** + * Get body classes for content layout. + * + * @return string + */ + public static function get_content_layout_body_class() { + $content_layout = self::get_content_layout(); + + $body_class = ''; + if ( $content_layout['no_t_padding'] ) { + $body_class .= ' content-no-t-padding'; + } + if ( $content_layout['no_b_padding'] ) { + $body_class .= ' content-no-b-padding'; + } + if ( $content_layout['no_x_padding'] ) { + $body_class .= ' content-no-x-padding'; + } + + return ltrim( $body_class ); + } +} diff --git a/inc/core/Options/Fonts.php b/inc/core/Options/Fonts.php new file mode 100644 index 0000000..e0d4292 --- /dev/null +++ b/inc/core/Options/Fonts.php @@ -0,0 +1,147 @@ +sec_fonts( $wp_customize ); + + $this->set_button_font_wgt( $wp_customize ); + $this->set_heading_font_wgt( $wp_customize ); + $this->set_site_title_font_wgt( $wp_customize ); + } + + /** + * Section: Fonts Options. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function sec_fonts( $wp_customize ) { + $wp_customize->add_section( + 'sec_fonts', + array( + 'title' => esc_html__( 'Fonts', 'pressbook' ), + 'description' => esc_html__( 'You can customize the fonts options in here.', 'pressbook' ), + 'priority' => 42, + ) + ); + } + + /** + * Add setting: Button Font Weight. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_button_font_wgt( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[button_font_wgt]', + array( + 'default' => CSSRules::default_styles( 'button_font_wgt' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_select' ), + ) + ); + + $wp_customize->add_control( + 'set_styles[button_font_wgt]', + array( + 'section' => 'sec_fonts', + 'type' => 'select', + 'choices' => $this->font_weights(), + 'label' => esc_html__( 'Button Font Weight', 'pressbook' ), + 'description' => esc_html__( 'Default: 600', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Heading Font Weight. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_heading_font_wgt( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[heading_font_wgt]', + array( + 'default' => CSSRules::default_styles( 'heading_font_wgt' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_select' ), + ) + ); + + $wp_customize->add_control( + 'set_styles[heading_font_wgt]', + array( + 'section' => 'sec_fonts', + 'type' => 'select', + 'choices' => $this->font_weights(), + 'label' => esc_html__( 'Heading Font Weight', 'pressbook' ), + 'description' => esc_html__( 'Default: 700', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Site Title Font Weight. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_site_title_font_wgt( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[site_title_font_wgt]', + array( + 'default' => CSSRules::default_styles( 'site_title_font_wgt' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_select' ), + ) + ); + + $wp_customize->add_control( + 'set_styles[site_title_font_wgt]', + array( + 'section' => 'sec_fonts', + 'type' => 'select', + 'choices' => $this->font_weights(), + 'label' => esc_html__( 'Site Title Font Weight', 'pressbook' ), + 'description' => esc_html__( 'Default: 700', 'pressbook' ), + ) + ); + } + + /** + * Font Weights. + * + * @return array + */ + public function font_weights() { + return array( + '400' => esc_html_x( '400', 'Font Weight', 'pressbook' ), + '500' => esc_html_x( '500', 'Font Weight', 'pressbook' ), + '600' => esc_html_x( '600', 'Font Weight', 'pressbook' ), + '700' => esc_html_x( '700', 'Font Weight', 'pressbook' ), + ); + } +} diff --git a/inc/core/Options/Footer.php b/inc/core/Options/Footer.php new file mode 100644 index 0000000..7e00e53 --- /dev/null +++ b/inc/core/Options/Footer.php @@ -0,0 +1,237 @@ +sec_footer( $wp_customize ); + + $this->set_copyright_text( $wp_customize ); + $this->set_hide_go_to_top( $wp_customize ); + + $this->set_footer_bg_color( $wp_customize ); + $this->set_footer_credit_link_color( $wp_customize ); + } + + /** + * Section: Footer Options. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function sec_footer( $wp_customize ) { + $wp_customize->add_section( + 'sec_footer', + array( + 'title' => esc_html__( 'Footer Options', 'pressbook' ), + 'description' => esc_html__( 'You can customize the footer options in here.', 'pressbook' ), + 'priority' => 160, + ) + ); + } + + /** + * Add setting: Copyright Text. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_copyright_text( $wp_customize ) { + $wp_customize->add_setting( + 'set_copyright_text', + array( + 'default' => self::get_copyright_text( true ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_copyright_text' ), + ) + ); + + $wp_customize->add_control( + 'set_copyright_text', + array( + 'section' => 'sec_footer', + 'type' => 'textarea', + 'label' => esc_html__( 'Copyright Text', 'pressbook' ), + 'description' => esc_html__( 'You can change the copyright text in the footer. You may use the following tags: em, strong, span, a, br.', 'pressbook' ), + ) + ); + + $wp_customize->selective_refresh->add_partial( + 'set_copyright_text', + array( + 'selector' => '.copyright-text', + 'container_inclusive' => true, + 'render_callback' => array( $this, 'render_copyright_text' ), + ) + ); + } + + /** + * Get setting: Copyright Text. + * + * @param bool $get_default Get default. + * @return string + */ + public static function get_copyright_text( $get_default = false ) { + $default = apply_filters( + 'pressbook_default_copyright_text', + sprintf( + /* translators: 1: current year, 2: blog name */ + esc_html__( 'Copyright © %1$s %2$s.', 'pressbook' ), + esc_html( date_i18n( _x( 'Y', 'copyright date format', 'pressbook' ) ) ), + get_bloginfo( 'name', 'display' ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ) + ); + + if ( $get_default ) { + return $default; + } + + return get_theme_mod( 'set_copyright_text', $default ); + } + + /** + * Render copyright text for selective refresh. + * + * @return void + */ + public function render_copyright_text() { + get_template_part( 'template-parts/footer/copyright-text' ); + } + + /** + * Add setting: Hide Go To Top Button. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_hide_go_to_top( $wp_customize ) { + $wp_customize->add_setting( + 'set_hide_go_to_top', + array( + 'type' => 'theme_mod', + 'default' => self::get_hide_go_to_top( true ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_hide_go_to_top', + array( + 'section' => 'sec_footer', + 'type' => 'checkbox', + 'label' => esc_html__( 'Hide Go To Top Button', 'pressbook' ), + ) + ); + } + + /** + * Get setting: Hide Go To Top Button. + * + * @param bool $get_default Get default. + * @return bool + */ + public static function get_hide_go_to_top( $get_default = false ) { + $default = apply_filters( 'pressbook_default_hide_go_to_top', false ); + if ( $get_default ) { + return $default; + } + + return get_theme_mod( 'set_hide_go_to_top', $default ); + } + + + /** + * Add setting: Footer Background Color. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_footer_bg_color( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[footer_bg_color]', + array( + 'default' => CSSRules::default_styles( 'footer_bg_color' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_alpha_color' ), + ) + ); + + $wp_customize->add_control( + new AlphaColorControl( + $wp_customize, + 'set_styles[footer_bg_color]', + array( + 'section' => 'sec_footer', + 'label' => esc_html__( 'Footer Background Color', 'pressbook' ), + 'settings' => 'set_styles[footer_bg_color]', + 'palette' => Colors::default_alpha_palette(), + 'show_opacity' => true, + ) + ) + ); + } + + /** + * Add setting: Footer Credit Link Color. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_footer_credit_link_color( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[footer_credit_link_color]', + array( + 'default' => CSSRules::default_styles( 'footer_credit_link_color' ), + 'transport' => 'postMessage', + 'sanitize_callback' => 'sanitize_hex_color', + ) + ); + + $wp_customize->add_control( + new \WP_Customize_Color_Control( + $wp_customize, + 'set_styles[footer_credit_link_color]', + array( + 'section' => 'sec_footer', + 'label' => esc_html__( 'Footer Credit Link Color', 'pressbook' ), + ) + ) + ); + } + + /** + * Get allowed tags for copyright text. + * + * @return array + */ + public static function copyright_text_allowed_tags() { + return apply_filters( + 'pressbook_copyright_text_allowed_tags', + array( + 'span' => array( 'class' => array() ), + 'em' => array(), + 'strong' => array(), + 'br' => array(), + 'a' => array( + 'href' => array(), + 'title' => array(), + 'rel' => array(), + 'class' => array(), + ), + ) + ); + } +} diff --git a/inc/core/Options/FooterBlock.php b/inc/core/Options/FooterBlock.php new file mode 100644 index 0000000..82be14f --- /dev/null +++ b/inc/core/Options/FooterBlock.php @@ -0,0 +1,332 @@ +sec_footer_block( $wp_customize ); + + $this->set_footer_block( $wp_customize, 1 ); + $this->selective_refresh_block_1( $wp_customize, 1 ); + } + + /** + * Section: Footer Block Options. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function sec_footer_block( $wp_customize ) { + $wp_customize->add_section( + 'sec_footer_block', + array( + 'title' => esc_html__( 'Footer Block', 'pressbook' ), + 'description' => esc_html__( 'You can customize the footer block options in here.', 'pressbook' ), + 'priority' => 153, + ) + ); + } + + /** + * Add setting: Footer Block. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + * @param int $number Block number. + */ + public function set_footer_block( $wp_customize, $number = 1 ) { + $setting_key = ( 'set_footer_block[' . absint( $number ) . ']' ); + + $set_id = ( $setting_key . '[id]' ); + + $wp_customize->add_setting( + $set_id, + array( + 'type' => 'theme_mod', + 'default' => self::get_footer_block_default( 'id' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_block_post' ), + ) + ); + + $wp_customize->add_control( + $set_id, + array( + 'section' => 'sec_footer_block', + 'type' => 'select', + 'choices' => $this->pattern_blocks_choices(), + 'label' => sprintf( + /* translators: %s: footer block number */ + esc_html__( 'Footer Block %s', 'pressbook' ), + absint( $number ) + ), + 'description' => $this->block_description(), + ) + ); + + $set_full_width = ( $setting_key . '[full_width]' ); + + $wp_customize->add_setting( + $set_full_width, + array( + 'type' => 'theme_mod', + 'default' => self::get_footer_block_default( 'full_width' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_full_width, + array( + 'section' => 'sec_footer_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Set Full Width', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: footer block number */ + esc_html__( 'Footer Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + + $set_b_margin = ( $setting_key . '[b_margin]' ); + + $wp_customize->add_setting( + $set_b_margin, + array( + 'type' => 'theme_mod', + 'default' => self::get_footer_block_default( 'b_margin' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_b_margin, + array( + 'section' => 'sec_footer_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Bottom Margin', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: footer block number */ + esc_html__( 'Footer Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + + $set_in_front = ( $setting_key . '[in_front]' ); + + $wp_customize->add_setting( + $set_in_front, + array( + 'type' => 'theme_mod', + 'default' => self::get_footer_block_default( 'in_front' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_in_front, + array( + 'section' => 'sec_footer_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Show in Front Page', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: footer block number */ + esc_html__( 'Footer Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + + $set_in_blog = ( $setting_key . '[in_blog]' ); + + $wp_customize->add_setting( + $set_in_blog, + array( + 'type' => 'theme_mod', + 'default' => self::get_footer_block_default( 'in_blog' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_in_blog, + array( + 'section' => 'sec_footer_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Show in Blog Page', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: footer block number */ + esc_html__( 'Footer Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + + $set_in_archive = ( $setting_key . '[in_archive]' ); + + $wp_customize->add_setting( + $set_in_archive, + array( + 'type' => 'theme_mod', + 'default' => self::get_footer_block_default( 'in_archive' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_in_archive, + array( + 'section' => 'sec_footer_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Show in Archive Pages', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: footer block number */ + esc_html__( 'Footer Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + + $set_in_post = ( $setting_key . '[in_post]' ); + + $wp_customize->add_setting( + $set_in_post, + array( + 'type' => 'theme_mod', + 'default' => self::get_footer_block_default( 'in_post' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_in_post, + array( + 'section' => 'sec_footer_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Show in Posts', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: footer block number */ + esc_html__( 'Footer Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + + $set_in_page = ( $setting_key . '[in_page]' ); + + $wp_customize->add_setting( + $set_in_page, + array( + 'type' => 'theme_mod', + 'default' => self::get_footer_block_default( 'in_page' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_in_page, + array( + 'section' => 'sec_footer_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Show in Pages', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: footer block number */ + esc_html__( 'Footer Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + } + + /** + * Get setting: Footer Block. + * + * @param int $number Block number. + * @return array. + */ + public static function get_footer_block( $number = 1 ) { + $setting_key = get_theme_mod( 'set_footer_block', array() ); + + if ( array_key_exists( $number, $setting_key ) ) { + return wp_parse_args( + $setting_key[ $number ], + self::get_footer_block_default() + ); + } + + return self::get_footer_block_default(); + } + + /** + * Get default setting: Footer Block. + * + * @param string $key Setting key. + * @return mixed|array + */ + public static function get_footer_block_default( $key = '' ) { + $default = apply_filters( + 'pressbook_default_footer_block', + array( + 'id' => '', + 'full_width' => false, + 'b_margin' => true, + 'in_front' => true, + 'in_blog' => true, + 'in_archive' => false, + 'in_post' => false, + 'in_page' => false, + ) + ); + + if ( array_key_exists( $key, $default ) ) { + return $default[ $key ]; + } + + return $default; + } + + /** + * Selective Refresh: Footer Block 1. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + * @param int $number Block number. + */ + public function selective_refresh_block_1( $wp_customize, $number ) { + $setting_key = ( 'set_footer_block[' . absint( $number ) . ']' ); + + foreach ( static::SETTING_KEYS as $key ) { + $wp_customize->selective_refresh->add_partial( + ( $setting_key . '[' . $key . ']' ), + array( + 'selector' => '.footer-block-' . absint( $number ), + 'container_inclusive' => true, + 'render_callback' => function() { + get_template_part( 'template-parts/footer/block-section' ); + }, + ) + ); + } + } +} diff --git a/inc/core/Options/General.php b/inc/core/Options/General.php new file mode 100644 index 0000000..3635baf --- /dev/null +++ b/inc/core/Options/General.php @@ -0,0 +1,127 @@ +sec_general( $wp_customize ); + + $this->set_search_form_button_text( $wp_customize ); + $this->set_read_more_text( $wp_customize ); + } + + /** + * Section: General Options. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function sec_general( $wp_customize ) { + $wp_customize->add_section( + 'sec_general', + array( + 'title' => esc_html__( 'General Options', 'pressbook' ), + 'description' => esc_html__( 'You can customize the general options in here.', 'pressbook' ), + 'priority' => 156, + ) + ); + } + + /** + * Add setting: Search Form Button Text. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_search_form_button_text( $wp_customize ) { + $wp_customize->add_setting( + 'set_search_form_button_text', + array( + 'default' => self::get_search_form_button_text( true ), + 'transport' => 'refresh', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + $wp_customize->add_control( + 'set_search_form_button_text', + array( + 'section' => 'sec_general', + 'type' => 'text', + 'label' => esc_html__( 'Search Form Button Text', 'pressbook' ), + 'description' => esc_html__( 'You can change the search form button text. Leave it empty for default text. This does not change the button text of search form widget block. To change that, you can directly edit the search form widget block in the editor itself.', 'pressbook' ), + ) + ); + } + + /** + * Get setting: Search Form Button Text. + * + * @param bool $get_default Get default. + * @return string + */ + public static function get_search_form_button_text( $get_default = false ) { + $default = apply_filters( 'pressbook_default_search_form_button_text', '' ); + + if ( $get_default ) { + return $default; + } + + return get_theme_mod( 'set_search_form_button_text', $default ); + } + + /** + * Add setting: Read More Text. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_read_more_text( $wp_customize ) { + $wp_customize->add_setting( + 'set_read_more_text', + array( + 'default' => self::get_read_more_text( true ), + 'transport' => 'refresh', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + $wp_customize->add_control( + 'set_read_more_text', + array( + 'section' => 'sec_general', + 'type' => 'text', + 'label' => esc_html__( 'Read More Text', 'pressbook' ), + 'description' => esc_html__( 'You can change the "Read More" text. Leave it empty for default text.', 'pressbook' ), + ) + ); + } + + /** + * Get setting: Read More Text. + * + * @param bool $get_default Get default. + * @return string + */ + public static function get_read_more_text( $get_default = false ) { + $default = apply_filters( 'pressbook_default_read_more_text', '' ); + + if ( $get_default ) { + return $default; + } + + return get_theme_mod( 'set_read_more_text', $default ); + } +} diff --git a/inc/core/Options/HeaderBlock.php b/inc/core/Options/HeaderBlock.php new file mode 100644 index 0000000..e7811dd --- /dev/null +++ b/inc/core/Options/HeaderBlock.php @@ -0,0 +1,332 @@ +sec_header_block( $wp_customize ); + + $this->set_header_block( $wp_customize, 1 ); + $this->selective_refresh_block_1( $wp_customize, 1 ); + } + + /** + * Section: Header Block Options. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function sec_header_block( $wp_customize ) { + $wp_customize->add_section( + 'sec_header_block', + array( + 'title' => esc_html__( 'Header Block', 'pressbook' ), + 'description' => esc_html__( 'You can customize the header block options in here.', 'pressbook' ), + 'priority' => 153, + ) + ); + } + + /** + * Add setting: Header Block. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + * @param int $number Block number. + */ + public function set_header_block( $wp_customize, $number = 1 ) { + $setting_key = ( 'set_header_block[' . absint( $number ) . ']' ); + + $set_id = ( $setting_key . '[id]' ); + + $wp_customize->add_setting( + $set_id, + array( + 'type' => 'theme_mod', + 'default' => self::get_header_block_default( 'id' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_block_post' ), + ) + ); + + $wp_customize->add_control( + $set_id, + array( + 'section' => 'sec_header_block', + 'type' => 'select', + 'choices' => $this->pattern_blocks_choices(), + 'label' => sprintf( + /* translators: %s: header block number */ + esc_html__( 'Header Block %s', 'pressbook' ), + absint( $number ) + ), + 'description' => $this->block_description(), + ) + ); + + $set_full_width = ( $setting_key . '[full_width]' ); + + $wp_customize->add_setting( + $set_full_width, + array( + 'type' => 'theme_mod', + 'default' => self::get_header_block_default( 'full_width' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_full_width, + array( + 'section' => 'sec_header_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Set Full Width', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: header block number */ + esc_html__( 'Header Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + + $set_t_margin = ( $setting_key . '[t_margin]' ); + + $wp_customize->add_setting( + $set_t_margin, + array( + 'type' => 'theme_mod', + 'default' => self::get_header_block_default( 't_margin' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_t_margin, + array( + 'section' => 'sec_header_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Top Margin', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: header block number */ + esc_html__( 'Header Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + + $set_in_front = ( $setting_key . '[in_front]' ); + + $wp_customize->add_setting( + $set_in_front, + array( + 'type' => 'theme_mod', + 'default' => self::get_header_block_default( 'in_front' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_in_front, + array( + 'section' => 'sec_header_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Show in Front Page', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: header block number */ + esc_html__( 'Header Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + + $set_in_blog = ( $setting_key . '[in_blog]' ); + + $wp_customize->add_setting( + $set_in_blog, + array( + 'type' => 'theme_mod', + 'default' => self::get_header_block_default( 'in_blog' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_in_blog, + array( + 'section' => 'sec_header_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Show in Blog Page', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: header block number */ + esc_html__( 'Header Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + + $set_in_archive = ( $setting_key . '[in_archive]' ); + + $wp_customize->add_setting( + $set_in_archive, + array( + 'type' => 'theme_mod', + 'default' => self::get_header_block_default( 'in_archive' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_in_archive, + array( + 'section' => 'sec_header_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Show in Archive Pages', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: header block number */ + esc_html__( 'Header Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + + $set_in_post = ( $setting_key . '[in_post]' ); + + $wp_customize->add_setting( + $set_in_post, + array( + 'type' => 'theme_mod', + 'default' => self::get_header_block_default( 'in_post' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_in_post, + array( + 'section' => 'sec_header_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Show in Posts', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: header block number */ + esc_html__( 'Header Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + + $set_in_page = ( $setting_key . '[in_page]' ); + + $wp_customize->add_setting( + $set_in_page, + array( + 'type' => 'theme_mod', + 'default' => self::get_header_block_default( 'in_page' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + $set_in_page, + array( + 'section' => 'sec_header_block', + 'type' => 'checkbox', + 'label' => esc_html__( 'Show in Pages', 'pressbook' ), + 'description' => sprintf( + /* translators: %s: header block number */ + esc_html__( 'Header Block %s', 'pressbook' ), + absint( $number ) + ), + ) + ); + } + + /** + * Get setting: Header Block. + * + * @param int $number Block number. + * @return array. + */ + public static function get_header_block( $number = 1 ) { + $setting_key = get_theme_mod( 'set_header_block', array() ); + + if ( array_key_exists( $number, $setting_key ) ) { + return wp_parse_args( + $setting_key[ $number ], + self::get_header_block_default() + ); + } + + return self::get_header_block_default(); + } + + /** + * Get default setting: Header Block. + * + * @param string $key Setting key. + * @return mixed|array + */ + public static function get_header_block_default( $key = '' ) { + $default = apply_filters( + 'pressbook_default_header_block', + array( + 'id' => '', + 'full_width' => false, + 't_margin' => true, + 'in_front' => true, + 'in_blog' => true, + 'in_archive' => false, + 'in_post' => false, + 'in_page' => false, + ) + ); + + if ( array_key_exists( $key, $default ) ) { + return $default[ $key ]; + } + + return $default; + } + + /** + * Selective Refresh: Header Block 1. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + * @param int $number Block number. + */ + public function selective_refresh_block_1( $wp_customize, $number ) { + $setting_key = ( 'set_header_block[' . absint( $number ) . ']' ); + + foreach ( static::SETTING_KEYS as $key ) { + $wp_customize->selective_refresh->add_partial( + ( $setting_key . '[' . $key . ']' ), + array( + 'selector' => '.header-block-' . absint( $number ), + 'container_inclusive' => true, + 'render_callback' => function() { + get_template_part( 'template-parts/header/block-section' ); + }, + ) + ); + } + } +} diff --git a/inc/core/Options/HeaderImage.php b/inc/core/Options/HeaderImage.php new file mode 100644 index 0000000..b11e495 --- /dev/null +++ b/inc/core/Options/HeaderImage.php @@ -0,0 +1,154 @@ +set_header_bg_position( $wp_customize ); + $this->set_header_bg_repeat( $wp_customize ); + $this->set_header_bg_size( $wp_customize ); + } + + /** + * Add setting: Header Background Position. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_header_bg_position( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[header_bg_position]', + array( + 'default' => CSSRules::default_styles( 'header_bg_position' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_select' ), + ) + ); + + $wp_customize->add_control( + 'set_styles[header_bg_position]', + array( + 'section' => 'header_image', + 'type' => 'select', + 'choices' => $this->background_positions(), + 'label' => esc_html__( 'Header Background Position', 'pressbook' ), + 'description' => esc_html__( 'Default: Center Center', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Header Background Repeat. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_header_bg_repeat( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[header_bg_repeat]', + array( + 'default' => CSSRules::default_styles( 'header_bg_repeat' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_select' ), + ) + ); + + $wp_customize->add_control( + 'set_styles[header_bg_repeat]', + array( + 'section' => 'header_image', + 'type' => 'radio', + 'choices' => $this->background_repeat(), + 'label' => esc_html__( 'Header Background Repeat', 'pressbook' ), + 'description' => esc_html__( 'Default: Repeat', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Header Background Size. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_header_bg_size( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[header_bg_size]', + array( + 'default' => CSSRules::default_styles( 'header_bg_size' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_select' ), + ) + ); + + $wp_customize->add_control( + 'set_styles[header_bg_size]', + array( + 'section' => 'header_image', + 'type' => 'radio', + 'choices' => $this->background_sizes(), + 'label' => esc_html__( 'Header Background Size', 'pressbook' ), + 'description' => esc_html__( 'Default: Contain', 'pressbook' ), + ) + ); + } + + /** + * Background Positions. + * + * @return array + */ + public function background_positions() { + return array( + 'left-top' => esc_html__( 'Left Top', 'pressbook' ), + 'left-center' => esc_html__( 'Left Center', 'pressbook' ), + 'left-bottom' => esc_html__( 'Left Bottom', 'pressbook' ), + 'right-top' => esc_html__( 'Right Top', 'pressbook' ), + 'right-center' => esc_html__( 'Right Center', 'pressbook' ), + 'right-bottom' => esc_html__( 'Right Bottom', 'pressbook' ), + 'center-top' => esc_html__( 'Center Top', 'pressbook' ), + 'center-center' => esc_html__( 'Center Center', 'pressbook' ), + 'center-bottom' => esc_html__( 'Center Bottom', 'pressbook' ), + ); + } + + /** + * Background Repeat. + * + * @return array + */ + public function background_repeat() { + return array( + 'repeat' => esc_html__( 'Repeat', 'pressbook' ), + 'repeat-x' => esc_html__( 'Repeat X', 'pressbook' ), + 'repeat-y' => esc_html__( 'Repeat Y', 'pressbook' ), + 'no-repeat' => esc_html__( 'No Repeat', 'pressbook' ), + ); + } + + /** + * Background Sizes. + * + * @return array + */ + public function background_sizes() { + return array( + 'auto' => esc_html__( 'Auto', 'pressbook' ), + 'cover' => esc_html__( 'Cover', 'pressbook' ), + 'contain' => esc_html__( 'Contain', 'pressbook' ), + ); + } +} diff --git a/inc/core/Options/PrimaryNavbar.php b/inc/core/Options/PrimaryNavbar.php new file mode 100644 index 0000000..712277d --- /dev/null +++ b/inc/core/Options/PrimaryNavbar.php @@ -0,0 +1,115 @@ +sec_primary_navbar( $wp_customize ); + + $this->set_primary_navbar_bg_color( $wp_customize ); + $this->set_primary_navbar_search( $wp_customize ); + } + + /** + * Section: Primary Navbar Options. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function sec_primary_navbar( $wp_customize ) { + $wp_customize->add_section( + 'sec_primary_navbar', + array( + 'title' => esc_html__( 'Primary Navbar', 'pressbook' ), + 'description' => esc_html__( 'You can customize the primary navbar options in here.', 'pressbook' ), + 'priority' => 153, + ) + ); + } + + /** + * Add setting: Primary Navbar Background Color. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_primary_navbar_bg_color( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[primary_navbar_bg_color]', + array( + 'default' => CSSRules::default_styles( 'primary_navbar_bg_color' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_alpha_color' ), + ) + ); + + $wp_customize->add_control( + new AlphaColorControl( + $wp_customize, + 'set_styles[primary_navbar_bg_color]', + array( + 'section' => 'sec_primary_navbar', + 'label' => esc_html__( 'Primary Navbar Background Color', 'pressbook' ), + 'settings' => 'set_styles[primary_navbar_bg_color]', + 'palette' => true, + 'show_opacity' => true, + ) + ) + ); + } + + /** + * Add setting: Enable Primary Navbar Search Form. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_primary_navbar_search( $wp_customize ) { + $wp_customize->add_setting( + 'set_primary_navbar_search', + array( + 'type' => 'theme_mod', + 'default' => self::get_primary_navbar_search( true ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_primary_navbar_search', + array( + 'section' => 'sec_primary_navbar', + 'type' => 'checkbox', + 'label' => esc_html__( 'Enable Primary Navbar Search Form', 'pressbook' ), + ) + ); + } + + /** + * Get setting: Enable Primary Navbar Search Form. + * + * @param bool $get_default Get default. + * @return bool + */ + public static function get_primary_navbar_search( $get_default = false ) { + $default = apply_filters( 'pressbook_default_primary_navbar_search', true ); + if ( $get_default ) { + return $default; + } + + return get_theme_mod( 'set_primary_navbar_search', $default ); + } +} diff --git a/inc/core/Options/Sanitizer.php b/inc/core/Options/Sanitizer.php new file mode 100644 index 0000000..7cf9165 --- /dev/null +++ b/inc/core/Options/Sanitizer.php @@ -0,0 +1,89 @@ +default The input from the setting or the default setting. + */ + public static function sanitize_select( $input, $setting ) { + $input = sanitize_key( $input ); + $choices = $setting->manager->get_control( $setting->id )->choices; + return ( array_key_exists( $input, $choices ) ? $input : $setting->default ); + } + + /** + * Sanitize block post. + * + * @param int $input post id. + * @return int + */ + public static function sanitize_block_post( $input ) { + $post_id = absint( $input ); + if ( $post_id && 'wp_block' === get_post_type( $post_id ) ) { + return $post_id; + } + return 0; + } + + /** + * Function to sanitize alpha color. + * + * @param string $value Hex or RGBA color. + * + * @return string + */ + public static function sanitize_alpha_color( $value ) { + // This pattern will check and match 3/6/8-character hex, rgb, rgba, hsl, & hsla colors. + $pattern = '/^(\#[\da-f]{3}|\#[\da-f]{6}|\#[\da-f]{8}|rgba\(((\d{1,2}|1\d\d|2([0-4]\d|5[0-5]))\s*,\s*){2}((\d{1,2}|1\d\d|2([0-4]\d|5[0-5]))\s*)(,\s*(0\.\d+|1))\)|hsla\(\s*((\d{1,2}|[1-2]\d{2}|3([0-5]\d|60)))\s*,\s*((\d{1,2}|100)\s*%)\s*,\s*((\d{1,2}|100)\s*%)(,\s*(0\.\d+|1))\)|rgb\(((\d{1,2}|1\d\d|2([0-4]\d|5[0-5]))\s*,\s*){2}((\d{1,2}|1\d\d|2([0-4]\d|5[0-5]))\s*)|hsl\(\s*((\d{1,2}|[1-2]\d{2}|3([0-5]\d|60)))\s*,\s*((\d{1,2}|100)\s*%)\s*,\s*((\d{1,2}|100)\s*%)\))$/'; + \preg_match( $pattern, $value, $matches ); + // Return the 1st match found. + if ( isset( $matches[0] ) ) { + if ( is_string( $matches[0] ) ) { + return $matches[0]; + } + if ( is_array( $matches[0] ) && isset( $matches[0][0] ) ) { + return $matches[0][0]; + } + } + // If no match was found, return an empty string. + return ''; + } + + /** + * Sanitize copyright text. + * + * @param string $input Input text. + * @return string + */ + public static function sanitize_copyright_text( $input ) { + $allowed = Footer::copyright_text_allowed_tags(); + return wp_kses( $input, $allowed ); + } +} diff --git a/inc/core/Options/Sidebar.php b/inc/core/Options/Sidebar.php new file mode 100644 index 0000000..3c83410 --- /dev/null +++ b/inc/core/Options/Sidebar.php @@ -0,0 +1,341 @@ +sec_sidebar( $wp_customize ); + + $this->set_side_widget_layout_double_lg( $wp_customize ); + + $this->set_side_widget_border_color( $wp_customize ); + + $this->set_side_widget_no_t_padding( $wp_customize ); + $this->set_side_widget_no_b_padding( $wp_customize ); + $this->set_side_widget_no_x_padding( $wp_customize ); + $this->set_side_widget_no_shadow( $wp_customize ); + + $this->set_sticky_sidebar( $wp_customize ); + } + + /** + * Section: Sidebar Layout Options. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function sec_sidebar( $wp_customize ) { + $wp_customize->add_section( + 'sec_sidebar', + array( + 'title' => esc_html__( 'Sidebar Layout', 'pressbook' ), + 'description' => esc_html__( 'You can customize the sidebar layout options in here.', 'pressbook' ), + 'priority' => 155, + ) + ); + } + + /** + * Add setting: Double Sidebars Layout (Large-Screen Devices). + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_side_widget_layout_double_lg( $wp_customize ) { + $wp_customize->add_setting( + 'set_side_widget[layout_double_lg]', + array( + 'default' => self::get_side_widget_default( 'layout_double_lg' ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_select' ), + ) + ); + + $wp_customize->add_control( + 'set_side_widget[layout_double_lg]', + array( + 'section' => 'sec_sidebar', + 'type' => 'radio', + 'choices' => array( + '' => esc_html__( 'One Left and One Right', 'pressbook' ), + 'left' => esc_html__( 'Both Sidebars to the Left', 'pressbook' ), + 'right' => esc_html__( 'Both Sidebars to the Right', 'pressbook' ), + ), + 'label' => esc_html__( 'Double Sidebars Layout (Large-Screen Devices)', 'pressbook' ), + 'description' => esc_html__( 'Set the layout for the double sidebars. This applies only when both the sidebars (left and right) are active. A sidebar is active when there is at least one widget in it.', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Side Widget Border Color. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_side_widget_border_color( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[side_widget_border_color]', + array( + 'default' => CSSRules::default_styles( 'side_widget_border_color' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_alpha_color' ), + ) + ); + + $wp_customize->add_control( + new AlphaColorControl( + $wp_customize, + 'set_styles[side_widget_border_color]', + array( + 'section' => 'sec_sidebar', + 'label' => esc_html__( 'Side Widget Border Color', 'pressbook' ), + 'settings' => 'set_styles[side_widget_border_color]', + 'palette' => Colors::default_alpha_palette(), + 'show_opacity' => true, + ) + ) + ); + } + + /** + * Add setting: Remove Top Padding. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_side_widget_no_t_padding( $wp_customize ) { + $wp_customize->add_setting( + 'set_side_widget[no_t_padding]', + array( + 'default' => self::get_side_widget_default( 'no_t_padding' ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_side_widget[no_t_padding]', + array( + 'section' => 'sec_sidebar', + 'type' => 'checkbox', + 'label' => esc_html__( 'Remove Top Padding', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Remove Bottom Padding. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_side_widget_no_b_padding( $wp_customize ) { + $wp_customize->add_setting( + 'set_side_widget[no_b_padding]', + array( + 'default' => self::get_side_widget_default( 'no_b_padding' ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_side_widget[no_b_padding]', + array( + 'section' => 'sec_sidebar', + 'type' => 'checkbox', + 'label' => esc_html__( 'Remove Bottom Padding', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Remove Horizontal Padding. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_side_widget_no_x_padding( $wp_customize ) { + $wp_customize->add_setting( + 'set_side_widget[no_x_padding]', + array( + 'default' => self::get_side_widget_default( 'no_x_padding' ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_side_widget[no_x_padding]', + array( + 'section' => 'sec_sidebar', + 'type' => 'checkbox', + 'label' => esc_html__( 'Remove Horizontal Padding', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Remove Box Shadow. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_side_widget_no_shadow( $wp_customize ) { + $wp_customize->add_setting( + 'set_side_widget[no_shadow]', + array( + 'default' => self::get_side_widget_default( 'no_shadow' ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_side_widget[no_shadow]', + array( + 'section' => 'sec_sidebar', + 'type' => 'checkbox', + 'label' => esc_html__( 'Remove Box Shadow', 'pressbook' ), + ) + ); + } + + /** + * Get setting: Side Widget. + * + * @return array + */ + public static function get_side_widget() { + return wp_parse_args( + get_theme_mod( 'set_side_widget', array() ), + self::get_side_widget_default() + ); + } + + /** + * Get default setting: Side Widget. + * + * @param string $key Setting key. + * @return mixed|array + */ + public static function get_side_widget_default( $key = '' ) { + $default = apply_filters( + 'pressbook_default_side_widget', + array( + 'layout_double_lg' => '', + 'no_t_padding' => false, + 'no_b_padding' => false, + 'no_x_padding' => false, + 'no_shadow' => false, + ) + ); + + if ( array_key_exists( $key, $default ) ) { + return $default[ $key ]; + } + + return $default; + } + + /** + * Add setting: Sticky Sidebar. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_sticky_sidebar( $wp_customize ) { + $wp_customize->add_setting( + 'set_sticky_sidebar', + array( + 'default' => self::get_sticky_sidebar( true ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_sticky_sidebar', + array( + 'section' => 'sec_sidebar', + 'type' => 'checkbox', + 'label' => esc_html__( 'Sticky-Floating Sidebar', 'pressbook' ), + 'description' => esc_html__( 'You can enable or disable sticky sidebar that floats on scrolling.', 'pressbook' ), + ) + ); + } + + /** + * Get setting: Sticky Sidebar. + * + * @param bool $get_default Get default. + * @return bool + */ + public static function get_sticky_sidebar( $get_default = false ) { + $default = apply_filters( 'pressbook_default_sticky_sidebar', true ); + if ( $get_default ) { + return $default; + } + + return get_theme_mod( 'set_sticky_sidebar', $default ); + } + + /** + * Get body classes for side widget. + * + * @return string + */ + public static function get_side_widget_body_class() { + $side_widget = self::get_side_widget(); + + $body_class = ''; + if ( $side_widget['layout_double_lg'] ) { + $body_class .= ' side-widget-ld-lg-' . esc_attr( $side_widget['layout_double_lg'] ); + } + if ( $side_widget['no_t_padding'] ) { + $body_class .= ' side-widget-no-t-padding'; + } + if ( $side_widget['no_b_padding'] ) { + $body_class .= ' side-widget-no-b-padding'; + } + if ( $side_widget['no_x_padding'] ) { + $body_class .= ' side-widget-no-x-padding'; + } + if ( $side_widget['no_shadow'] ) { + $body_class .= ' side-widget-no-shadow'; + } + + return ltrim( $body_class ); + } + + /** + * Get sticky sidebar breakpoint screen width. + * + * @return int + */ + public static function get_sticky_breakpoint() { + $double_bp = 1279; + $single_bp = 1023; + + if ( is_active_sidebar( 'sidebar-1' ) ) { + if ( is_active_sidebar( 'sidebar-2' ) ) { + return $double_bp; + } else { + return $single_bp; + } + } elseif ( is_active_sidebar( 'sidebar-2' ) ) { + return $single_bp; + } else { + return $single_bp; + } + } +} diff --git a/inc/core/Options/SiteIdentity.php b/inc/core/Options/SiteIdentity.php new file mode 100644 index 0000000..5eaf891 --- /dev/null +++ b/inc/core/Options/SiteIdentity.php @@ -0,0 +1,450 @@ +get_setting( 'blogname' )->transport = 'postMessage'; + + // Selective refresh for site tagline. + $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; + + $this->set_hide_site_title( $wp_customize ); + $this->set_hide_site_tagline( $wp_customize ); + + foreach ( self::SETTING_NAMES as $name ) { + foreach ( self::SETTING_SIZES as $size ) { + $this->set_size( $wp_customize, $name, $size ); + $this->selective_refresh_size( $wp_customize, $name, $size ); + } + } + } + + /** + * Add setting: Hide Site Title. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_hide_site_title( $wp_customize ) { + $wp_customize->add_setting( + 'set_hide_site_title', + array( + 'type' => 'theme_mod', + 'default' => self::get_hide_site_title( true ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_hide_site_title', + array( + 'section' => 'title_tagline', + 'type' => 'checkbox', + 'label' => esc_html__( 'Hide Site Title', 'pressbook' ), + ) + ); + + $wp_customize->selective_refresh->add_partial( + 'set_hide_site_title', + array( + 'selector' => '.site-branding', + 'container_inclusive' => true, + 'render_callback' => array( $this, 'render_site_branding' ), + ) + ); + } + + /** + * Get setting: Hide Site Title. + * + * @param bool $get_default Get default. + * @return bool + */ + public static function get_hide_site_title( $get_default = false ) { + $default = apply_filters( 'pressbook_default_hide_site_title', false ); + if ( $get_default ) { + return $default; + } + + return get_theme_mod( 'set_hide_site_title', $default ); + } + + /** + * Add setting: Hide Site Tagline. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_hide_site_tagline( $wp_customize ) { + $wp_customize->add_setting( + 'set_hide_site_tagline', + array( + 'type' => 'theme_mod', + 'default' => self::get_hide_site_tagline( true ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_hide_site_tagline', + array( + 'section' => 'title_tagline', + 'type' => 'checkbox', + 'label' => esc_html__( 'Hide Site Tagline', 'pressbook' ), + ) + ); + + $wp_customize->selective_refresh->add_partial( + 'set_hide_site_tagline', + array( + 'selector' => '.site-branding', + 'container_inclusive' => true, + 'render_callback' => array( $this, 'render_site_branding' ), + ) + ); + } + + /** + * Get setting: Hide Site Tagline. + * + * @param bool $get_default Get default. + * @return bool + */ + public static function get_hide_site_tagline( $get_default = false ) { + $default = apply_filters( 'pressbook_default_hide_site_tagline', false ); + if ( $get_default ) { + return $default; + } + + return get_theme_mod( 'set_hide_site_tagline', $default ); + } + + /** + * Add setting: Size. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + * @param string $name Setting name. + * @param string $size Screen size. + */ + public function set_size( $wp_customize, $name, $size ) { + $key = ( 'set_' . $name . '_size[' . $size . ']' ); + + $wp_customize->add_setting( + $key, + array( + 'type' => 'theme_mod', + 'default' => self::get_size_default( $name, $size ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_select' ), + ) + ); + + $method_label = ( 'get_' . $name . '_size_label' ); + + $wp_customize->add_control( + $key, + array( + 'section' => 'title_tagline', + 'type' => 'select', + 'choices' => $this->sizes(), + 'label' => self::$method_label()['label'][ $size ], + 'description' => self::$method_label()['desc'][ $size ], + ) + ); + } + + /** + * Get setting: Size. + * + * @param string $name Setting name. + * @return array + */ + public static function get_size( $name ) { + return wp_parse_args( + get_theme_mod( ( 'set_' . $name . '_size' ), array() ), + self::get_size_default( $name ) + ); + } + + /** + * Get default setting: Size. + * + * @param string $name Setting name. + * @param string $size Screen size. + * @return array|string + */ + public static function get_size_default( $name, $size = '' ) { + $method_default = ( 'get_' . $name . '_size_default' ); + + $default = apply_filters( + ( 'pressbook_default_' . $name . '_size' ), + self::$method_default() + ); + + if ( '' === $size ) { + return $default; + } + + if ( array_key_exists( $size, $default ) ) { + return $default[ $size ]; + } + + return ''; + } + + /** + * Get default setting: Logo Size. + * + * @return array + */ + public static function get_logo_size_default() { + return array( + 'sm' => 1, + 'md' => 1, + 'lg' => 1, + ); + } + + /** + * Get default setting: Size Title Size. + * + * @return array + */ + public static function get_site_title_size_default() { + return array( + 'sm' => 2, + 'md' => 2, + 'lg' => 2, + ); + } + + /** + * Get default setting: Tagline Size. + * + * @return array + */ + public static function get_tagline_size_default() { + return array( + 'sm' => 2, + 'md' => 2, + 'lg' => 2, + ); + } + + /** + * Get setting label: Logo Size. + * + * @return array + */ + public static function get_logo_size_label() { + return array( + 'label' => array( + 'sm' => esc_html__( 'Logo Size (Small-Screen Devices)', 'pressbook' ), + 'md' => esc_html__( 'Logo Size (Medium-Screen Devices)', 'pressbook' ), + 'lg' => esc_html__( 'Logo Size (Large-Screen Devices)', 'pressbook' ), + ), + 'desc' => array( + 'sm' => esc_html_x( 'Default: Size 1', 'Default: Logo Size (Small-Screen Devices)', 'pressbook' ), + 'md' => esc_html_x( 'Default: Size 1', 'Default: Logo Size (Medium-Screen Devices)', 'pressbook' ), + 'lg' => esc_html_x( 'Default: Size 1', 'Default: Logo Size (Large-Screen Devices)', 'pressbook' ), + ), + ); + } + + /** + * Get setting label: Site Title Size. + * + * @return array + */ + public static function get_site_title_size_label() { + return array( + 'label' => array( + 'sm' => esc_html__( 'Site Title Size (Small-Screen Devices)', 'pressbook' ), + 'md' => esc_html__( 'Site Title Size (Medium-Screen Devices)', 'pressbook' ), + 'lg' => esc_html__( 'Site Title Size (Large-Screen Devices)', 'pressbook' ), + ), + 'desc' => array( + 'sm' => esc_html_x( 'Default: Size 2', 'Default: Site Title Size (Small-Screen Devices)', 'pressbook' ), + 'md' => esc_html_x( 'Default: Size 2', 'Default: Site Title Size (Medium-Screen Devices)', 'pressbook' ), + 'lg' => esc_html_x( 'Default: Size 2', 'Default: Site Title Size (Large-Screen Devices)', 'pressbook' ), + ), + ); + } + + /** + * Get setting label: Tagline Size. + * + * @return array + */ + public static function get_tagline_size_label() { + return array( + 'label' => array( + 'sm' => esc_html__( 'Tagline Size (Small-Screen Devices)', 'pressbook' ), + 'md' => esc_html__( 'Tagline Size (Medium-Screen Devices)', 'pressbook' ), + 'lg' => esc_html__( 'Tagline Size (Large-Screen Devices)', 'pressbook' ), + ), + 'desc' => array( + 'sm' => esc_html_x( 'Default: Size 2', 'Default: Tagline Size (Small-Screen Devices)', 'pressbook' ), + 'md' => esc_html_x( 'Default: Size 2', 'Default: Tagline Size (Medium-Screen Devices)', 'pressbook' ), + 'lg' => esc_html_x( 'Default: Size 2', 'Default: Tagline Size (Large-Screen Devices)', 'pressbook' ), + ), + ); + } + + /** + * Selective Refresh: Size. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + * @param string $name Setting name. + * @param string $size Screen size. + */ + public function selective_refresh_size( $wp_customize, $name, $size ) { + $wp_customize->selective_refresh->add_partial( + ( 'set_' . $name . '_size[' . $size . ']' ), + array( + 'selector' => '.site-branding', + 'container_inclusive' => true, + 'render_callback' => array( $this, 'render_site_branding' ), + ) + ); + } + + /** + * Render site branding for selective refresh. + * + * @return void + */ + public function render_site_branding() { + get_template_part( 'template-parts/header/site-branding' ); + } + + /** + * Get available sizes. + * + * @return array. + */ + public function sizes() { + return array( + '1' => esc_html__( 'Size 1', 'pressbook' ), + '2' => esc_html__( 'Size 2', 'pressbook' ), + '3' => esc_html__( 'Size 3', 'pressbook' ), + '4' => esc_html__( 'Size 4', 'pressbook' ), + '5' => esc_html__( 'Size 5', 'pressbook' ), + ); + } + + /** + * Binds JS handlers to make theme customizer preview reload changes asynchronously. + */ + public function customize_preview_scripts() { + wp_enqueue_script( 'pressbook-customizer', get_template_directory_uri() . '/js/customizer.js', array( 'customize-preview', 'jquery' ), PRESSBOOK_VERSION, true ); + + wp_localize_script( + 'pressbook-customizer', + 'pressbook', + array( + 'styles' => CSSRules::output_array(), + 'handle_id' => apply_filters( 'pressbook_inline_style_handle_id', 'pressbook-style-inline-css' ), + ) + ); + } + + /** + * Get site logo title class. + * + * @return string + */ + public static function logo_title_class() { + $logo_title_classs = 'site-logo-title'; + if ( self::get_hide_site_title() && self::get_hide_site_tagline() ) { + $logo_title_classs .= ' site-logo-only'; + } + + $top_banner = TopBanner::get_top_banner(); + if ( '' !== wp_get_attachment_image( $top_banner['image'] ) ) { + if ( ! $top_banner['hide_sm'] ) { + $logo_title_classs .= ' has-banner-next-sm'; + } + + if ( ! $top_banner['hide_md'] ) { + $logo_title_classs .= ' has-banner-next-md'; + } + + $logo_title_classs .= ' has-banner-next-lg'; + } + + $logo = self::get_size( 'logo' ); + foreach ( self::SETTING_SIZES as $size ) { + $logo_title_classs .= ( ' logo--' . $size . '-size-' . $logo[ $size ] ); + } + + return apply_filters( 'pressbook_site_logo_title_classs', $logo_title_classs ); + } + + /** + * Get site title class. + * + * @return string + */ + public static function title_class() { + $title_class = 'site-title'; + if ( self::get_hide_site_title() ) { + $title_class .= ' hide-clip'; + } + + $site_title = self::get_size( 'site_title' ); + foreach ( self::SETTING_SIZES as $size ) { + $title_class .= ( ' site-title--' . $size . '-size-' . $site_title[ $size ] ); + } + + return apply_filters( 'pressbook_site_title_class', $title_class ); + } + + /** + * Get site tagline class. + * + * @return string + */ + public static function tagline_class() { + $tagline_class = 'site-tagline'; + if ( self::get_hide_site_tagline() ) { + $tagline_class .= ' hide-clip'; + } + + $site_tagline = self::get_size( 'tagline' ); + foreach ( self::SETTING_SIZES as $size ) { + $tagline_class .= ( ' tagline--' . $size . '-size-' . $site_tagline[ $size ] ); + } + + return apply_filters( 'pressbook_site_tagline_class', $tagline_class ); + } +} diff --git a/inc/core/Options/TopBanner.php b/inc/core/Options/TopBanner.php new file mode 100644 index 0000000..267a735 --- /dev/null +++ b/inc/core/Options/TopBanner.php @@ -0,0 +1,473 @@ +sec_top_banner( $wp_customize ); + + $this->set_top_banner_image( $wp_customize ); + $this->set_top_banner_link_url( $wp_customize ); + $this->set_top_banner_link_title( $wp_customize ); + $this->set_top_banner_link_rel( $wp_customize ); + $this->set_top_banner_link_new_tab( $wp_customize ); + $this->set_top_banner_shadow( $wp_customize ); + $this->set_top_banner_max_height( $wp_customize ); + $this->set_top_banner_hide_sm( $wp_customize ); + $this->set_top_banner_hide_md( $wp_customize ); + $this->selective_refresh_top_banner_main_keys( $wp_customize ); + $this->selective_refresh_top_banner_device_keys( $wp_customize ); + + $this->set_top_banner_block( $wp_customize ); + } + + /** + * Section: Top Banner Options. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function sec_top_banner( $wp_customize ) { + $wp_customize->add_section( + 'sec_top_banner', + array( + 'title' => esc_html__( 'Top Banner', 'pressbook' ), + 'description' => esc_html__( 'You can customize the top banner options in here.', 'pressbook' ), + 'priority' => 152, + ) + ); + } + + /** + * Add setting: Top Banner Image. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_top_banner_image( $wp_customize ) { + $wp_customize->add_setting( + 'set_top_banner[image]', + array( + 'default' => self::get_top_banner_default( 'image' ), + 'transport' => 'postMessage', + 'sanitize_callback' => 'absint', + ) + ); + + $wp_customize->add_control( + new \WP_Customize_Cropped_Image_Control( + $wp_customize, + 'set_top_banner[image]', + array( + 'section' => 'sec_top_banner', + 'label' => esc_html__( 'Top Banner Image', 'pressbook' ), + 'description' => esc_html__( 'Select the top banner image. The theme works best with an image size of 728 x 90 pixels. ', 'pressbook' ), + 'flex_width' => true, + 'flex_height' => true, + 'width' => 728, + 'height' => 90, + ) + ) + ); + } + + /** + * Add setting: Top Banner Link - URL. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_top_banner_link_url( $wp_customize ) { + $wp_customize->add_setting( + 'set_top_banner[link_url]', + array( + 'default' => self::get_top_banner_default( 'link_url' ), + 'transport' => 'postMessage', + 'sanitize_callback' => 'esc_url_raw', + ) + ); + + $wp_customize->add_control( + 'set_top_banner[link_url]', + array( + 'section' => 'sec_top_banner', + 'type' => 'url', + 'label' => esc_html__( 'Top Banner Link - URL', 'pressbook' ), + 'description' => esc_html__( 'Enter the URL for the banner link.', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Top Banner Link - Title. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_top_banner_link_title( $wp_customize ) { + $wp_customize->add_setting( + 'set_top_banner[link_title]', + array( + 'default' => self::get_top_banner_default( 'link_title' ), + 'transport' => 'postMessage', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + $wp_customize->add_control( + 'set_top_banner[link_title]', + array( + 'section' => 'sec_top_banner', + 'type' => 'text', + 'label' => esc_html__( 'Top Banner Link - Title', 'pressbook' ), + 'description' => esc_html__( 'Enter the "title" attribute for the banner link.', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Top Banner Link - Rel. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_top_banner_link_rel( $wp_customize ) { + $wp_customize->add_setting( + 'set_top_banner[link_rel]', + array( + 'default' => self::get_top_banner_default( 'link_rel' ), + 'transport' => 'postMessage', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + $wp_customize->add_control( + 'set_top_banner[link_rel]', + array( + 'section' => 'sec_top_banner', + 'type' => 'text', + 'label' => esc_html__( 'Top Banner Link - Rel', 'pressbook' ), + 'description' => esc_html__( 'Enter the "rel" attribute for the banner link.', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Top Banner Link - Open in New Tab. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_top_banner_link_new_tab( $wp_customize ) { + $wp_customize->add_setting( + 'set_top_banner[link_new_tab]', + array( + 'default' => self::get_top_banner_default( 'link_new_tab' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_top_banner[link_new_tab]', + array( + 'section' => 'sec_top_banner', + 'type' => 'checkbox', + 'label' => esc_html__( 'Top Banner Link - Open in New Tab', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Top Banner Shadow Effect. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_top_banner_shadow( $wp_customize ) { + $wp_customize->add_setting( + 'set_top_banner[shadow]', + array( + 'default' => self::get_top_banner_default( 'shadow' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_top_banner[shadow]', + array( + 'section' => 'sec_top_banner', + 'type' => 'checkbox', + 'label' => esc_html__( 'Top Banner Shadow Effect', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Top Banner Maximum Height. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_top_banner_max_height( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[top_banner_max_height]', + array( + 'default' => CSSRules::default_styles( 'top_banner_max_height' ), + 'transport' => 'postMessage', + 'sanitize_callback' => 'absint', + ) + ); + + $wp_customize->add_control( + 'set_styles[top_banner_max_height]', + array( + 'section' => 'sec_top_banner', + 'type' => 'number', + 'label' => esc_html__( 'Top Banner Maximum Height', 'pressbook' ), + 'description' => esc_html__( 'Set the maximum height allowed for the top banner image in pixels. Default: 150', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Hide in Small-Screen Devices. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_top_banner_hide_sm( $wp_customize ) { + $wp_customize->add_setting( + 'set_top_banner[hide_sm]', + array( + 'default' => self::get_top_banner_default( 'hide_sm' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_top_banner[hide_sm]', + array( + 'section' => 'sec_top_banner', + 'type' => 'checkbox', + 'label' => esc_html__( 'Hide in Small-Screen Devices', 'pressbook' ), + ) + ); + } + + /** + * Add setting: Hide in Medium-Screen Devices. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_top_banner_hide_md( $wp_customize ) { + $wp_customize->add_setting( + 'set_top_banner[hide_md]', + array( + 'default' => self::get_top_banner_default( 'hide_md' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'set_top_banner[hide_md]', + array( + 'section' => 'sec_top_banner', + 'type' => 'checkbox', + 'label' => esc_html__( 'Hide in Medium-Screen Devices', 'pressbook' ), + ) + ); + } + + /** + * Get setting: Top Banner. + * + * @return array + */ + public static function get_top_banner() { + return wp_parse_args( + get_theme_mod( 'set_top_banner', array() ), + self::get_top_banner_default() + ); + } + + /** + * Get default setting: Top Banner. + * + * @param string $key Setting key. + * @return mixed|array + */ + public static function get_top_banner_default( $key = '' ) { + $default = apply_filters( + 'pressbook_default_top_banner', + array( + 'image' => '', + 'link_url' => '#', + 'link_title' => '', + 'link_rel' => '', + 'link_new_tab' => true, + 'shadow' => false, + 'hide_sm' => true, + 'hide_md' => false, + ) + ); + + if ( array_key_exists( $key, $default ) ) { + return $default[ $key ]; + } + + return $default; + } + + /** + * Selective Refresh: Top Banner Main Keys. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function selective_refresh_top_banner_main_keys( $wp_customize ) { + foreach ( self::MAIN_SETTING_KEYS as $key ) { + $wp_customize->selective_refresh->add_partial( + ( 'set_top_banner[' . $key . ']' ), + array( + 'selector' => '.top-banner', + 'container_inclusive' => true, + 'render_callback' => function() { + get_template_part( 'template-parts/header/top-banner' ); + }, + ) + ); + } + } + + /** + * Selective Refresh: Top Banner Device Keys. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function selective_refresh_top_banner_device_keys( $wp_customize ) { + foreach ( self::DEVICE_SETTING_KEYS as $key ) { + $wp_customize->selective_refresh->add_partial( + ( 'set_top_banner[' . $key . ']' ), + array( + 'selector' => '.site-branding', + 'container_inclusive' => true, + 'render_callback' => function() { + get_template_part( 'template-parts/header/site-branding' ); + }, + ) + ); + } + } + + /** + * Get top banner class. + * + * @param array $top_banner Top banner settings. + * @return string + */ + public static function top_banner_class( $top_banner ) { + $top_banner_class = 'top-banner'; + if ( $top_banner['shadow'] ) { + $top_banner_class .= ' top-banner-shadow'; + } + + if ( $top_banner['hide_sm'] ) { + $top_banner_class .= ' top-banner-hide-sm'; + } + if ( $top_banner['hide_md'] ) { + $top_banner_class .= ' top-banner-hide-md'; + } + + return apply_filters( 'pressbook_top_banner_class', $top_banner_class, $top_banner ); + } + + /** + * Add setting: Top Banner Block Section. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_top_banner_block( $wp_customize ) { + $wp_customize->add_setting( + 'set_top_banner_block', + array( + 'type' => 'theme_mod', + 'default' => self::get_top_banner_block( true ), + 'transport' => 'refresh', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_block_post' ), + ) + ); + + $wp_customize->add_control( + 'set_top_banner_block', + array( + 'section' => 'sec_top_banner', + 'type' => 'select', + 'choices' => $this->pattern_blocks_choices(), + 'label' => esc_html__( 'Top Banner Block Section', 'pressbook' ), + 'description' => wp_kses( + sprintf( + /* translators: %s: URL to the pattern-blocks admin page. */ + __( 'You can use this to replace top banner image and use any custom block (For example: "Custom HTML block"). This is the content of the block section. You can create or edit the block section in the Pattern Blocks Manager (opens in a new window).
After creating the pattern block, you may need to refresh this customizer page and then select the newly created block.
The selected block content will appear on the block section, replacing the top banner image and overriding its related options.', 'pressbook' ), + esc_url( admin_url( 'edit.php?post_type=wp_block' ) ) + ), + array( + 'a' => array( + 'href' => array(), + 'target' => array(), + ), + 'br' => array(), + ) + ), + ) + ); + } + + /** + * Get setting: Top Banner Block Section. + * + * @param bool $get_default Get default. + * @return string + */ + public static function get_top_banner_block( $get_default = false ) { + $default = apply_filters( 'pressbook_top_banner_block_default', '' ); + if ( $get_default ) { + return $default; + } + + return get_theme_mod( 'set_top_banner_block', $default ); + } + + /** + * Get an array of pattern-blocks formatted as [ ID => Title ]. + * + * @return array + */ + public function pattern_blocks_choices() { + $pattern_blocks = get_posts( + array( + 'post_type' => 'wp_block', + 'numberposts' => 100, + ) + ); + + $pattern_blocks_choices = array( 0 => esc_html__( 'Select a block', 'pressbook' ) ); + foreach ( $pattern_blocks as $block ) { + $pattern_blocks_choices[ $block->ID ] = $block->post_title; + } + + return $pattern_blocks_choices; + } +} diff --git a/inc/core/Options/TopNavbar.php b/inc/core/Options/TopNavbar.php new file mode 100644 index 0000000..f9d4474 --- /dev/null +++ b/inc/core/Options/TopNavbar.php @@ -0,0 +1,104 @@ +sec_top_navbar( $wp_customize ); + + $this->set_top_navbar_bg_color_1( $wp_customize ); + $this->set_top_navbar_bg_color_2( $wp_customize ); + } + + /** + * Section: Top Navbar Options. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function sec_top_navbar( $wp_customize ) { + $wp_customize->add_section( + 'sec_top_navbar', + array( + 'title' => esc_html__( 'Top Navbar', 'pressbook' ), + 'description' => esc_html__( 'You can customize the top navbar options in here.', 'pressbook' ), + 'priority' => 151, + ) + ); + } + + /** + * Add setting: Top Navbar Background Color 1. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_top_navbar_bg_color_1( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[top_navbar_bg_color_1]', + array( + 'default' => CSSRules::default_styles( 'top_navbar_bg_color_1' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_alpha_color' ), + ) + ); + + $wp_customize->add_control( + new AlphaColorControl( + $wp_customize, + 'set_styles[top_navbar_bg_color_1]', + array( + 'section' => 'sec_top_navbar', + 'label' => esc_html__( 'Top Navbar Gradient Background 1', 'pressbook' ), + 'settings' => 'set_styles[top_navbar_bg_color_1]', + 'palette' => true, + 'show_opacity' => true, + ) + ) + ); + } + + /** + * Add setting: Top Navbar Background Color 1. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function set_top_navbar_bg_color_2( $wp_customize ) { + $wp_customize->add_setting( + 'set_styles[top_navbar_bg_color_2]', + array( + 'default' => CSSRules::default_styles( 'top_navbar_bg_color_2' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( Sanitizer::class, 'sanitize_alpha_color' ), + ) + ); + + $wp_customize->add_control( + new AlphaColorControl( + $wp_customize, + 'set_styles[top_navbar_bg_color_2]', + array( + 'section' => 'sec_top_navbar', + 'label' => esc_html__( 'Top Navbar Gradient Background 2', 'pressbook' ), + 'settings' => 'set_styles[top_navbar_bg_color_2]', + 'palette' => true, + 'show_opacity' => true, + ) + ) + ); + } +} diff --git a/inc/core/Options/Upsell.php b/inc/core/Options/Upsell.php new file mode 100644 index 0000000..f365c09 --- /dev/null +++ b/inc/core/Options/Upsell.php @@ -0,0 +1,229 @@ +sec_upsell( $wp_customize ); + } + + /** + * Section: Upsell. + * + * @param WP_Customize_Manager $wp_customize Theme Customizer object. + */ + public function sec_upsell( $wp_customize ) { + if ( method_exists( $wp_customize, 'register_section_type' ) ) { + $wp_customize->register_section_type( \PressBook_Upsell_Section::class ); + } + + if ( method_exists( $wp_customize, 'register_control_type' ) ) { + $wp_customize->register_control_type( \PressBook_Upsell_Control::class ); + } + + $wp_customize->add_section( + new \PressBook_Upsell_Section( + $wp_customize, + 'pressbook_premium', + array( + 'title' => esc_html__( 'Premium Available', 'pressbook' ), + 'button_text' => esc_html__( 'Get Premium', 'pressbook' ), + 'button_url' => esc_url( Helpers::get_upsell_buy_url() ), + 'priority' => 1, + ) + ) + ); + + $wp_customize->add_control( + new \PressBook_Upsell_Control( + $wp_customize, + 'addon_colors', + array( + 'section' => 'colors', + 'type' => 'pressbook-addon', + 'label' => esc_html__( 'Learn More', 'pressbook' ), + 'description' => esc_html__( 'More color options like button text color, link color, theme accent color, RGBA colors, fonts selector, and many more options are available in our premium version.', 'pressbook' ), + 'url' => ( esc_url( Helpers::get_upsell_detail_url() ) ), + 'priority' => 999, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + + $wp_customize->add_control( + new \PressBook_Upsell_Control( + $wp_customize, + 'sec_fonts', + array( + 'section' => 'sec_fonts', + 'type' => 'pressbook-addon', + 'label' => esc_html__( 'Learn More', 'pressbook' ), + 'description' => esc_html__( 'Advanced typography settings: font-family, font-size, body font-weight, line-height, over 50+ Google fonts, and custom Google font loader are available to select for the headings and body text in our premium version.', 'pressbook' ), + 'url' => ( esc_url( Helpers::get_upsell_detail_url() ) ), + 'priority' => 999, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + + $wp_customize->add_control( + new \PressBook_Upsell_Control( + $wp_customize, + 'sec_top_navbar', + array( + 'section' => 'sec_top_navbar', + 'type' => 'pressbook-addon', + 'label' => esc_html__( 'Learn More', 'pressbook' ), + 'description' => esc_html__( 'Multiple eye-catching block patterns, custom gradient color options, header blocks, footer blocks, and many more options are available in our premium version.', 'pressbook' ), + 'url' => ( esc_url( Helpers::get_upsell_detail_url() ) . '#description' ), + 'priority' => 999, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + + $wp_customize->add_control( + new \PressBook_Upsell_Control( + $wp_customize, + 'sec_top_banner', + array( + 'section' => 'sec_top_banner', + 'type' => 'pressbook-addon', + 'label' => esc_html__( 'Learn More', 'pressbook' ), + 'description' => esc_html__( 'Multiple eye-catching block patterns, custom gradient color scheme, header blocks, footer blocks are available in our premium version.', 'pressbook' ), + 'url' => ( esc_url( Helpers::get_upsell_detail_url() ) . '#description' ), + 'priority' => 999, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + + $wp_customize->add_control( + new \PressBook_Upsell_Control( + $wp_customize, + 'sec_primary_navbar', + array( + 'section' => 'sec_primary_navbar', + 'type' => 'pressbook-addon', + 'label' => esc_html__( 'Learn More', 'pressbook' ), + 'description' => esc_html__( 'More color options for primary navigation are available in our premium version.', 'pressbook' ), + 'url' => ( esc_url( Helpers::get_upsell_detail_url() ) . '#description' ), + 'priority' => 999, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + + $wp_customize->add_control( + new \PressBook_Upsell_Control( + $wp_customize, + 'sec_header_block', + array( + 'section' => 'sec_header_block', + 'type' => 'pressbook-addon', + 'label' => esc_html__( 'Learn More', 'pressbook' ), + 'description' => esc_html__( 'More header blocks and footer blocks are available in our premium version.', 'pressbook' ), + 'url' => ( esc_url( Helpers::get_upsell_detail_url() ) ), + 'priority' => 999, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + + $wp_customize->add_control( + new \PressBook_Upsell_Control( + $wp_customize, + 'sec_footer_block', + array( + 'section' => 'sec_footer_block', + 'type' => 'pressbook-addon', + 'label' => esc_html__( 'Learn More', 'pressbook' ), + 'description' => esc_html__( 'More footer blocks and header blocks are available in our premium version.', 'pressbook' ), + 'url' => ( esc_url( Helpers::get_upsell_detail_url() ) ), + 'priority' => 999, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + + $wp_customize->add_control( + new \PressBook_Upsell_Control( + $wp_customize, + 'sec_content', + array( + 'section' => 'sec_content', + 'type' => 'pressbook-addon', + 'label' => esc_html__( 'Learn More', 'pressbook' ), + 'description' => esc_html__( 'Content background, text color, button color, link color and many more options are available in our premium version.', 'pressbook' ), + 'url' => ( esc_url( Helpers::get_upsell_detail_url() ) ), + 'priority' => 999, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + + $wp_customize->add_control( + new \PressBook_Upsell_Control( + $wp_customize, + 'sec_sidebar', + array( + 'section' => 'sec_sidebar', + 'type' => 'pressbook-addon', + 'label' => esc_html__( 'Learn More', 'pressbook' ), + 'description' => esc_html__( 'Sidebar background, text color, post meta color, and many more options are available in our premium version.', 'pressbook' ), + 'url' => ( esc_url( Helpers::get_upsell_detail_url() ) ), + 'priority' => 999, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + + $wp_customize->add_control( + new \PressBook_Upsell_Control( + $wp_customize, + 'sec_blog', + array( + 'section' => 'sec_blog', + 'type' => 'pressbook-addon', + 'label' => esc_html__( 'Learn More', 'pressbook' ), + 'description' => esc_html__( 'More blog options and advanced theme options are available in our premium version.', 'pressbook' ), + 'url' => ( esc_url( Helpers::get_upsell_detail_url() ) ), + 'priority' => 999, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + + $wp_customize->add_control( + new \PressBook_Upsell_Control( + $wp_customize, + 'sec_footer', + array( + 'section' => 'sec_footer', + 'type' => 'pressbook-addon', + 'label' => esc_html__( 'Learn More', 'pressbook' ), + 'description' => esc_html__( 'More footer and color options are available in our premium version.', 'pressbook' ), + 'url' => ( esc_url( Helpers::get_upsell_detail_url() ) ), + 'priority' => 999, + 'settings' => ( isset( $wp_customize->selective_refresh ) ) ? array() : 'blogname', + ) + ) + ); + } +} diff --git a/inc/core/PageSettings.php b/inc/core/PageSettings.php new file mode 100644 index 0000000..8cec165 --- /dev/null +++ b/inc/core/PageSettings.php @@ -0,0 +1,235 @@ +post_type, array( 'page' ), true ) ) { + return; + } + + if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { + return; + } + + if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { + return; + } + + if ( wp_is_post_revision( $post ) ) { + return; + } + + $hide_title = array_key_exists( 'pressbook_hide_title', $_POST ) ? (bool) $_POST['pressbook_hide_title'] : self::get_meta_default( 'hide_title' ); + + $no_t_margin = array_key_exists( 'pressbook_no_t_margin', $_POST ) ? (bool) $_POST['pressbook_no_t_margin'] : self::get_meta_default( 'no_t_margin' ); + + $no_b_margin = array_key_exists( 'pressbook_no_b_margin', $_POST ) ? (bool) $_POST['pressbook_no_b_margin'] : self::get_meta_default( 'no_b_margin' ); + + $no_t_padding = array_key_exists( 'pressbook_no_t_padding', $_POST ) ? (bool) $_POST['pressbook_no_t_padding'] : self::get_meta_default( 'no_t_padding' ); + + $no_b_padding = array_key_exists( 'pressbook_no_b_padding', $_POST ) ? (bool) $_POST['pressbook_no_b_padding'] : self::get_meta_default( 'no_b_padding' ); + + $no_x_padding = array_key_exists( 'pressbook_no_x_padding', $_POST ) ? (bool) $_POST['pressbook_no_x_padding'] : self::get_meta_default( 'no_x_padding' ); + + $transparent_bg = array_key_exists( 'pressbook_transparent_bg', $_POST ) ? (bool) $_POST['pressbook_transparent_bg'] : self::get_meta_default( 'transparent_bg' ); + + if ( metadata_exists( 'post', $post_id, self::META_KEY ) || + // Add meta key only if any of the setting is not same as the default setting. + ( ( self::get_meta_default( 'hide_title' ) !== $hide_title ) || + ( self::get_meta_default( 'no_t_margin' ) !== $no_t_margin ) || + ( self::get_meta_default( 'no_b_margin' ) !== $no_b_margin ) || + ( self::get_meta_default( 'no_t_padding' ) !== $no_t_padding ) || + ( self::get_meta_default( 'no_b_padding' ) !== $no_b_padding ) || + ( self::get_meta_default( 'no_x_padding' ) !== $no_x_padding ) || + ( self::get_meta_default( 'transparent_bg' ) !== $transparent_bg ) + ) + ) { + update_post_meta( + $post_id, + self::META_KEY, + array( + 'hide_title' => $hide_title, + 'no_t_margin' => $no_t_margin, + 'no_b_margin' => $no_b_margin, + 'no_t_padding' => $no_t_padding, + 'no_b_padding' => $no_b_padding, + 'no_x_padding' => $no_x_padding, + 'transparent_bg' => $transparent_bg, + ) + ); + } + } + + /** + * Metabox HTML output. + * + * @param WP_Post $post post object. + */ + public function metabox_html( $post ) { + $settings = self::get_meta( $post->ID ); + + $nonce_key = ( 'pressbook_settings_nonce_' . $post->ID ); + ?> + + +

+ id="pressbook_hide_title" type="checkbox" name="pressbook_hide_title" value="1"> + +

+ +

+ id="pressbook_no_t_margin" type="checkbox" name="pressbook_no_t_margin" value="1"> + +

+ +

+ id="pressbook_no_b_margin" type="checkbox" name="pressbook_no_b_margin" value="1"> + +

+ +

+ +

+ id="pressbook_no_t_padding" type="checkbox" name="pressbook_no_t_padding" value="1"> + +

+ +

+ id="pressbook_no_b_padding" type="checkbox" name="pressbook_no_b_padding" value="1"> + +

+ +

+ id="pressbook_no_x_padding" type="checkbox" name="pressbook_no_x_padding" value="1"> + +

+ +

+ id="pressbook_transparent_bg" type="checkbox" name="pressbook_transparent_bg" value="1"> + +

+ false, + 'no_t_margin' => false, + 'no_b_margin' => false, + 'no_t_padding' => false, + 'no_b_padding' => false, + 'no_x_padding' => false, + 'transparent_bg' => false, + ) + ); + + if ( array_key_exists( $key, $default ) ) { + return $default[ $key ]; + } + + return $default; + } + + /** + * Get meta settings for template parts. + * + * @param int $id Post ID. + * @return array + */ + public static function get_meta_config( $id ) { + $meta = self::get_meta( $id ); + + if ( $meta['no_t_margin'] ) { + $wrapper_class = ' no-t-margin'; + } else { + $wrapper_class = ''; + } + + $site_main_class = ''; + if ( $meta['no_b_margin'] ) { + $site_main_class .= ' no-b-margin'; + } + if ( $meta['no_t_padding'] ) { + $site_main_class .= ' no-t-padding'; + } + if ( $meta['no_b_padding'] ) { + $site_main_class .= ' no-b-padding'; + } + if ( $meta['no_x_padding'] ) { + $site_main_class .= ' no-x-padding'; + } + if ( $meta['transparent_bg'] ) { + $site_main_class .= ' u-transparent-bg'; + } + + return array( + 'page_content' => ( $meta['hide_title'] ? 'page-no-title' : 'page' ), + 'wrapper_class' => $wrapper_class, + 'site_main_class' => $site_main_class, + ); + } +} diff --git a/inc/core/Scripts.php b/inc/core/Scripts.php new file mode 100644 index 0000000..a68c7a0 --- /dev/null +++ b/inc/core/Scripts.php @@ -0,0 +1,103 @@ + .pb-content-sidebar > .c-sidebar",{topSpacing:100,bottomSpacing:0,containerSelector:".site-content > .pb-content-sidebar",minWidth:' . esc_attr( $pressbook_sticky_bp ) . '});new StickySidebar(".site-content > .pb-content-sidebar > .c-sidebar-right",{topSpacing:100,bottomSpacing:0,containerSelector:".site-content > .pb-content-sidebar",minWidth:' . esc_attr( $pressbook_sticky_bp ) . '});}catch(e){}' + ); + } + } + + /** + * Get fonts URL. + */ + public static function fonts_url() { + $fonts_url = ''; + + $font_families = array(); + + $query_params = array(); + + /* translators: If there are characters in your language that are not supported by Inter, translate this to 'off'. Do not translate into your own language. */ + $inter = _x( 'on', 'Inter font: on or off', 'pressbook' ); + if ( 'off' !== $inter ) { + array_push( $font_families, 'Inter:wght@400;600' ); + } + + /* translators: If there are characters in your language that are not supported by Lato, translate this to 'off'. Do not translate into your own language. */ + $lato = _x( 'on', 'Lato font: on or off', 'pressbook' ); + if ( 'off' !== $lato ) { + array_push( $font_families, 'Lato:ital,wght@0,400;0,700;1,400;1,700' ); + } + + if ( count( $font_families ) > 0 ) { + foreach ( $font_families as $font_family ) { + array_push( $query_params, ( 'family=' . $font_family ) ); + } + + array_push( $query_params, 'display=swap' ); + + $fonts_url = ( 'https://fonts.googleapis.com/css2?' . implode( '&', $query_params ) ); + } + + $fonts_url = apply_filters( 'pressbook_fonts_url', $fonts_url ); + + $fonts_url = esc_url_raw( $fonts_url ); + + if ( function_exists( 'wptt_get_webfont_url' ) ) { + return wptt_get_webfont_url( $fonts_url ); + } + + return $fonts_url; + } +} diff --git a/inc/core/Serviceable.php b/inc/core/Serviceable.php new file mode 100644 index 0000000..4f188b1 --- /dev/null +++ b/inc/core/Serviceable.php @@ -0,0 +1,18 @@ + tag in the document head, and expect WordPress to + * provide it for us. + */ + add_theme_support( 'title-tag' ); + + /* + * Enable support for Post Thumbnails on posts and pages. + * + * @link https://developer.wordpress.org/themes/functionality/featured-images-post-thumbnails/ + */ + add_theme_support( 'post-thumbnails' ); + + /* + * Switch default core markup for search form, comment form, and comments + * to output valid HTML5. + */ + add_theme_support( + 'html5', + apply_filters( + 'pressbook_html5_args', + array( + 'navigation-widgets', + 'search-form', + 'comment-form', + 'comment-list', + 'gallery', + 'caption', + 'style', + 'script', + ) + ) + ); + + // Set up the WordPress core custom background feature. + add_theme_support( + 'custom-background', + apply_filters( + 'pressbook_custom_background_args', + array( + 'default-color' => self::DEFAULT_BACKGROUND, + 'default-image' => '', + ) + ) + ); + + // Add support for block styles. + add_theme_support( 'wp-block-styles' ); + + // Add support for wide alignment. + add_theme_support( 'align-wide' ); + + // Add support for responsive embedded content. + add_theme_support( 'responsive-embeds' ); + + // Add theme support for selective refresh for widgets. + add_theme_support( 'customize-selective-refresh-widgets' ); + + // Add support for custom line height controls. + add_theme_support( 'custom-line-height' ); + + // Add theme support for padding controls. + add_theme_support( 'custom-spacing' ); + } +} diff --git a/inc/core/TemplateTags.php b/inc/core/TemplateTags.php new file mode 100644 index 0000000..6defadc --- /dev/null +++ b/inc/core/TemplateTags.php @@ -0,0 +1,167 @@ + +
+ +
+ + + + + + + Posted on %s', 'post date', 'pressbook' ), + array( + 'span' => array( + 'class' => array(), + ), + ) + ), + sprintf( + ( ( get_the_time( 'U' ) !== get_the_modified_time( 'U' ) ) ? '' : '' ), + esc_attr( get_the_date( DATE_W3C ) ), + esc_html( get_the_date() ), + esc_attr( get_the_modified_date( DATE_W3C ) ), + esc_html( get_the_modified_date() ) + ) + ) + ?> + + + + %s', 'post author', 'pressbook' ), + array( + 'span' => array( + 'class' => array(), + ), + ) + ), + esc_html( get_the_author() ) + ) + ?> + + + + + + + » ', '' ); + } + + /** + * Prints HTML with meta information for the categories. + */ + public static function post_categories() { + if ( 'post' === get_post_type() && has_category() ) { + ?> + + + + + + ' . esc_html_x( 'Tags:', 'String to use before the tags for screen readers.', 'pressbook' ) . '' ), ', ' ); + ?> + + register(); + } +} diff --git a/inc/core/Widget.php b/inc/core/Widget.php new file mode 100644 index 0000000..aefa0ba --- /dev/null +++ b/inc/core/Widget.php @@ -0,0 +1,144 @@ + esc_html__( 'Left Sidebar', 'pressbook' ), + 'id' => 'sidebar-2', + 'description' => esc_html__( 'Add widgets here.', 'pressbook' ), + 'before_widget' => '
', + 'after_widget' => '
', + 'before_title' => '

', + 'after_title' => '

', + ) + ); + + register_sidebar( + array( + 'name' => esc_html__( 'Right Sidebar', 'pressbook' ), + 'id' => 'sidebar-1', + 'description' => esc_html__( 'Add widgets here.', 'pressbook' ), + 'before_widget' => '
', + 'after_widget' => '
', + 'before_title' => '

', + 'after_title' => '

', + ) + ); + + for ( $i = 1; $i <= self::FOOTER_WIDGETS_COUNT; $i++ ) { + register_sidebar( + array( + /* translators: %s: footer widgets area number */ + 'name' => sprintf( esc_html__( 'Footer Widgets Area %s', 'pressbook' ), $i ), + 'id' => 'footer-' . $i, + 'description' => esc_html__( 'Add widgets here.', 'pressbook' ), + 'before_widget' => '
', + 'after_widget' => '
', + 'before_title' => '

', + 'after_title' => '

', + ) + ); + } + } + + /** + * Get total number of active footer widgets area. + * return int. + */ + public static function get_active_footer_widgets() { + $total_active = 0; + + for ( $i = 1; $i <= self::FOOTER_WIDGETS_COUNT; $i++ ) { + if ( is_active_sidebar( 'footer-' . $i ) ) { + $total_active++; + } + } + + return $total_active; + } + + /** + * Remove theme inline style. + */ + public function print_styles() { + if ( wp_style_is( 'pressbook-style', 'enqueued' ) ) { + wp_style_add_data( 'pressbook-style', 'after', '' ); + } + } + + /** + * Enqueue styles and scripts. + */ + public function enqueue_assets() { + if ( $this->is_block_screen() ) { + wp_enqueue_style( 'pressbook-widgets-editor-legacy-style', get_template_directory_uri() . '/inc/widgets-editor-legacy.css', array(), PRESSBOOK_VERSION ); + wp_style_add_data( 'pressbook-widgets-editor-legacy-style', 'rtl', 'replace' ); + + // Add output of customizer settings as inline style. + wp_add_inline_style( 'pressbook-widgets-editor-legacy-style', CSSRules::output_widgets_editor_legacy() ); + } + } + + /** + * Check if block editor screen. + * + * @return bool + */ + public function is_block_screen() { + if ( function_exists( '\get_current_screen' ) ) { + $current_screen = get_current_screen(); + if ( $current_screen ) { + if ( \method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) { + return true; + } + } + } + + return false; + } + + /** + * Styles keys for the widgets editor legacy CSS output. + * + * @return array + */ + public static function legacy_styles_keys() { + return apply_filters( + 'pressbook_default_widgets_editor_legacy_styles_keys', + array( + 'button_bg_color_1', + 'button_bg_color_2', + 'button_font_wgt', + ) + ); + } +} diff --git a/inc/core/WooCommerce.php b/inc/core/WooCommerce.php new file mode 100644 index 0000000..336fc99 --- /dev/null +++ b/inc/core/WooCommerce.php @@ -0,0 +1,163 @@ + array( + 'default_rows' => 8, + 'min_rows' => 5, + 'max_rows' => 10, + 'default_columns' => 4, + 'min_columns' => 2, + 'max_columns' => 4, + ), + ) + ); + + // Add support for WooCommerce features. + add_theme_support( 'wc-product-gallery-zoom' ); + add_theme_support( 'wc-product-gallery-lightbox' ); + add_theme_support( 'wc-product-gallery-slider' ); + + // Remove default WooCommerce wrappers. + remove_action( 'woocommerce_before_main_content', 'woocommerce_output_content_wrapper', 10 ); + remove_action( 'woocommerce_after_main_content', 'woocommerce_output_content_wrapper_end', 10 ); + remove_action( 'woocommerce_sidebar', 'woocommerce_get_sidebar', 10 ); + } + + /** + * Register shop widget area. + */ + public function widgets_init() { + register_sidebar( + array( + 'name' => esc_html__( 'Shop Sidebar', 'pressbook' ), + 'id' => 'sidebar-shop', + 'description' => esc_html__( 'Add widgets here.', 'pressbook' ), + 'before_widget' => '
', + 'after_widget' => '
', + 'before_title' => '

', + 'after_title' => '

', + ) + ); + } + + /** + * Modify WooCommerce templates. + */ + public function woocommerce_modify() { + add_action( 'woocommerce_before_main_content', array( $this, 'woocommerce_open_wrapper_columns' ), 7 ); + + add_action( 'woocommerce_before_main_content', array( $this, 'woocommerce_open_content_column' ), 9 ); + + add_action( 'woocommerce_after_main_content', array( $this, 'woocommerce_close_content_column' ), 7 ); + + if ( is_shop() || is_archive() ) { + // Output the shop sidebar. + add_action( 'woocommerce_after_main_content', 'woocommerce_get_sidebar', 9 ); + } + + add_action( 'woocommerce_after_main_content', array( $this, 'woocommerce_close_wrapper_columns' ), 11 ); + } + + /** + * Opening wrapper. + */ + public function woocommerce_open_wrapper_columns() { + ?> + + +
+ +
> + +
+
+ +
+
+ +
+ +
+ json['url'] = esc_url( $this->url ); + } + + /** + * Outputs the template. + * + * @return void + */ + public function content_template() { + ?> +

{{{ data.description }}}

+ + {{ data.label }} + + button_url; + + if ( ! $this->button_url && $theme->get( 'ThemeURI' ) ) { + // Fall back to the `Theme URI` defined in `style.css`. + $button_url = $theme->get( 'ThemeURI' ); + + } elseif ( ! $this->button_url && $theme->get( 'AuthorURI' ) ) { + // Fall back to the `Author URI` defined in `style.css`. + $button_url = $theme->get( 'AuthorURI' ); + } + + $json['button_text'] = $this->button_text ? esc_html( $this->button_text ) : $theme->get( 'Name' ); + $json['button_url'] = esc_url( $button_url ); + + return $json; + } + + /** + * Outputs the template. + * + * @return void + */ + protected function render_template() { + ?> +
  • +

    + {{ data.title }} + <# if ( data.button_text && data.button_url ) { #> + {{ data.button_text }} + <# } #> +

    +
  • + 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 ) ); + + + + // 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', 'pressbook' ), + 'menu_title' => __( 'Install Plugins', 'pressbook' ), + /* translators: %s: plugin name. */ + 'installing' => __( 'Installing Plugin: %s', 'pressbook' ), + /* translators: %s: plugin name. */ + 'updating' => __( 'Updating Plugin: %s', 'pressbook' ), + 'oops' => __( 'Something went wrong with the plugin API.', 'pressbook' ), + /* translators: 1: plugin name(s). */ + 'notice_can_install_required' => _n_noop( + 'This theme requires the following plugin: %1$s.', + 'This theme requires the following plugins: %1$s.', + 'pressbook' + ), + /* translators: 1: plugin name(s). */ + 'notice_can_install_recommended' => _n_noop( + 'This theme recommends the following plugin: %1$s.', + 'This theme recommends the following plugins: %1$s.', + 'pressbook' + ), + /* translators: 1: plugin name(s). */ + 'notice_ask_to_update' => _n_noop( + '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.', + 'pressbook' + ), + /* translators: 1: plugin name(s). */ + 'notice_ask_to_update_maybe' => _n_noop( + 'There is an update available for: %1$s.', + 'There are updates available for the following plugins: %1$s.', + 'pressbook' + ), + /* translators: 1: plugin name(s). */ + 'notice_can_activate_required' => _n_noop( + 'The following required plugin is currently inactive: %1$s.', + 'The following required plugins are currently inactive: %1$s.', + 'pressbook' + ), + /* translators: 1: plugin name(s). */ + 'notice_can_activate_recommended' => _n_noop( + 'The following recommended plugin is currently inactive: %1$s.', + 'The following recommended plugins are currently inactive: %1$s.', + 'pressbook' + ), + 'install_link' => _n_noop( + 'Begin installing plugin', + 'Begin installing plugins', + 'pressbook' + ), + 'update_link' => _n_noop( + 'Begin updating plugin', + 'Begin updating plugins', + 'pressbook' + ), + 'activate_link' => _n_noop( + 'Begin activating plugin', + 'Begin activating plugins', + 'pressbook' + ), + 'return' => __( 'Return to Required Plugins Installer', 'pressbook' ), + 'dashboard' => __( 'Return to the Dashboard', 'pressbook' ), + 'plugin_activated' => __( 'Plugin activated successfully.', 'pressbook' ), + 'activated_successfully' => __( 'The following plugin was activated successfully:', 'pressbook' ), + /* translators: 1: plugin name. */ + 'plugin_already_active' => __( 'No action taken. Plugin %1$s was already active.', 'pressbook' ), + /* 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.', 'pressbook' ), + /* translators: 1: dashboard link. */ + 'complete' => __( 'All plugins installed and activated successfully. %1$s', 'pressbook' ), + 'dismiss' => __( 'Dismiss this notice', 'pressbook' ), + 'notice_cannot_install_activate' => __( 'There are one or more required or recommended plugins to install, update or activate.', 'pressbook' ), + 'contact_admin' => __( 'Please contact the administrator of this site for help.', 'pressbook' ), + ); + + 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' ) ); + } + } + + + + + + + + /** + * 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.', 'pressbook' ), + esc_html__( 'Update Required', 'pressbook' ) + ); + + 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 ) { + $this->page_hook = add_theme_page( $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', 'pressbook' ) . '' ), '

    '; + 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.', 'pressbook' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'pressbook' ), 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.', 'pressbook' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'pressbook' ), 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', 'pressbook' ) . ' ' . $last_plugin ); + + $rendered .= sprintf( + $line_template, + sprintf( + translate_nooped_plural( $this->strings[ $type ], $count, 'pressbook' ), + $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, 'pressbook' ), + 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, 'pressbook' ), + 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, 'pressbook' ), + 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', 'pressbook' ), + 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', 'pressbook' ); + } + + return __( 'Recommended', 'pressbook' ); + } + + /** + * 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', 'pressbook' ); + break; + case 'external': + $string = __( 'External Source', 'pressbook' ); + break; + case 'bundled': + $string = __( 'Pre-Packaged', 'pressbook' ); + 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', 'pressbook' ); + } + + if ( ! $this->tgmpa->is_plugin_active( $slug ) ) { + $install_status = __( 'Installed But Not Activated', 'pressbook' ); + } else { + $install_status = __( 'Active', 'pressbook' ); + } + + $update_status = ''; + + if ( $this->tgmpa->does_plugin_require_update( $slug ) && false === $this->tgmpa->does_plugin_have_update( $slug ) ) { + $update_status = __( 'Required Update not Available', 'pressbook' ); + + } elseif ( $this->tgmpa->does_plugin_require_update( $slug ) ) { + $update_status = __( 'Requires Update', 'pressbook' ); + + } elseif ( false !== $this->tgmpa->does_plugin_have_update( $slug ) ) { + $update_status = __( 'Update recommended', 'pressbook' ); + } + + if ( '' === $update_status ) { + return $install_status; + } + + return sprintf( + /* translators: 1: install status, 2: update status */ + _x( '%1$s, %2$s', 'Install/Update Status', 'pressbook' ), + $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', 'pressbook' ); + break; + case 'install': + /* translators: 1: number of plugins. */ + $text = _n( 'To Install (%s)', 'To Install (%s)', $count, 'pressbook' ); + break; + case 'update': + /* translators: 1: number of plugins. */ + $text = _n( 'Update Available (%s)', 'Update Available (%s)', $count, 'pressbook' ); + break; + case 'activate': + /* translators: 1: number of plugins. */ + $text = _n( 'To Activate (%s)', 'To Activate (%s)', $count, 'pressbook' ); + 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"', 'pressbook' ); + + $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:', 'pressbook' ) . '

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

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

    ', + $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:', 'pressbook' ) . '

    ', + $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.', 'pressbook' ) . ' ' . esc_html__( 'Return to the Dashboard', 'pressbook' ) . ''; + 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', 'pressbook' ), + 'source' => __( 'Source', 'pressbook' ), + 'type' => __( 'Type', 'pressbook' ), + ); + + if ( 'all' === $this->view_context || 'update' === $this->view_context ) { + $columns['version'] = __( 'Version', 'pressbook' ); + $columns['status'] = __( 'Status', 'pressbook' ); + } + + 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', 'pressbook' ); + } 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', 'pressbook' ); + } + + // 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', 'pressbook' ); + } + } + + // 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', 'pressbook' ); + } + } + + if ( 'install' !== $this->view_context ) { + if ( current_user_can( 'update_plugins' ) ) { + $actions['tgmpa-bulk-update'] = __( 'Update', 'pressbook' ); + } + if ( current_user_can( 'activate_plugins' ) ) { + $actions['tgmpa-bulk-activate'] = __( 'Activate', 'pressbook' ); + } + } + + 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.', 'pressbook' ); + } else { + $message = __( 'No plugins were selected to be updated. No action taken.', 'pressbook' ); + } + + 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.', 'pressbook' ); + } else { + $message = __( 'No plugins are available to be updated at this time.', 'pressbook' ); + } + + 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.', 'pressbook' ), '

    '; + + 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.', 'pressbook' ), '

    '; + + 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', 'pressbook' ) . ' ' . $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, 'pressbook' ) ), + $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.', 'pressbook' ); + $this->strings['activation_success'] = __( 'Plugin activated successfully.', 'pressbook' ); + } + + /** + * 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)', 'pressbook' ); + } else { + global $wp_version; + + /* translators: 1: plugin name, 2: error message. */ + $this->upgrader->strings['skin_update_failed_error'] = __( 'An error occurred while installing %1$s: %2$s.', 'pressbook' ); + /* translators: 1: plugin name. */ + $this->upgrader->strings['skin_update_failed'] = __( 'The installation of %1$s failed.', 'pressbook' ); + 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.', 'pressbook' ); + /* translators: 1: plugin name. */ + $this->upgrader->strings['skin_update_successful'] = __( '%1$s installed and activated successfully.', 'pressbook' ) . ' ' . esc_html__( 'Show Details', 'pressbook' ) . '.'; + /* translators: 1: plugin name. */ + $this->upgrader->strings['skin_update_successful'] = __( '%1$s installed and activated successfully.', 'pressbook' ); + $this->upgrader->strings['skin_upgrade_end'] = __( 'All installations and activations have been completed.', 'pressbook' ); + /* 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)', 'pressbook' ); + } 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.', 'pressbook' ); + /* translators: 1: plugin name. */ + $this->upgrader->strings['skin_update_successful'] = esc_html__( '%1$s installed successfully.', 'pressbook' ) . ' ' . esc_html__( 'Show Details', 'pressbook' ) . '.'; + /* translators: 1: plugin name. */ + $this->upgrader->strings['skin_update_successful'] = __( '%1$s installed successfully.', 'pressbook' ); + $this->upgrader->strings['skin_upgrade_end'] = __( 'All installations have been completed.', 'pressbook' ); + /* 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)', 'pressbook' ); + } + + // Add "read more" link only for WP < 4.8. + if ( version_compare( $wp_version, '4.8', '<' ) ) { + $this->upgrader->strings['skin_update_successful'] .= ' ' . esc_html__( 'Show Details', 'pressbook' ) . '.'; + } + } + } + + /** + * 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', 'pressbook' ) . '' + ); + } 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/inc/libs/class-wptt-webfont-loader.php b/inc/libs/class-wptt-webfont-loader.php new file mode 100644 index 0000000..5f70b3b --- /dev/null +++ b/inc/libs/class-wptt-webfont-loader.php @@ -0,0 +1,711 @@ +remote_url = $url; + + // Add a cleanup routine. + $this->schedule_cleanup(); + add_action( 'delete_fonts_folder', array( $this, 'delete_fonts_folder' ) ); + } + + /** + * Get the local URL which contains the styles. + * + * Fallback to the remote URL if we were unable to write the file locally. + * + * @access public + * @since 1.1.0 + * @return string + */ + public function get_url() { + + // Check if the local stylesheet exists. + if ( $this->local_file_exists() ) { + + // Attempt to update the stylesheet. Return the local URL on success. + if ( $this->write_stylesheet() ) { + return $this->get_local_stylesheet_url(); + } + } + + // If the local file exists, return its URL, with a fallback to the remote URL. + return file_exists( $this->get_local_stylesheet_path() ) + ? $this->get_local_stylesheet_url() + : $this->remote_url; + } + + /** + * Get the local stylesheet URL. + * + * @access public + * @since 1.1.0 + * @return string + */ + public function get_local_stylesheet_url() { + if ( ! $this->local_stylesheet_url ) { + $this->local_stylesheet_url = str_replace( + $this->get_base_path(), + $this->get_base_url(), + $this->get_local_stylesheet_path() + ); + } + return $this->local_stylesheet_url; + } + + /** + * Get styles with fonts downloaded locally. + * + * @access public + * @since 1.0.0 + * @return string + */ + public function get_styles() { + + // If we already have the local file, return its contents. + $local_stylesheet_contents = $this->get_local_stylesheet_contents(); + if ( $local_stylesheet_contents ) { + return $local_stylesheet_contents; + } + + // Get the remote URL contents. + $this->remote_styles = $this->get_remote_url_contents(); + + // Get an array of locally-hosted files. + $files = $this->get_local_files_from_css(); + + // Convert paths to URLs. + foreach ( $files as $remote => $local ) { + $files[ $remote ] = str_replace( + $this->get_base_path(), + $this->get_base_url(), + $local + ); + } + + $this->css = str_replace( + array_keys( $files ), + array_values( $files ), + $this->remote_styles + ); + + $this->write_stylesheet(); + + return $this->css; + } + + /** + * Get local stylesheet contents. + * + * @access public + * @since 1.1.0 + * @return string|false Returns the remote URL contents. + */ + public function get_local_stylesheet_contents() { + $local_path = $this->get_local_stylesheet_path(); + + // Check if the local stylesheet exists. + if ( $this->local_file_exists() ) { + + // Attempt to update the stylesheet. Return false on fail. + if ( ! $this->write_stylesheet() ) { + return false; + } + } + + ob_start(); + include $local_path; + return ob_get_clean(); + } + + /** + * Get remote file contents. + * + * @access public + * @since 1.0.0 + * @return string Returns the remote URL contents. + */ + public function get_remote_url_contents() { + + /** + * The user-agent we want to use. + * + * The default user-agent is the only one compatible with woff (not woff2) + * which also supports unicode ranges. + */ + $user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8'; + + // Switch to a user-agent supporting woff2 if we don't need to support IE. + if ( 'woff2' === $this->font_format ) { + $user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:73.0) Gecko/20100101 Firefox/73.0'; + } + + // Get the response. + $response = wp_remote_get( $this->remote_url, array( 'user-agent' => $user_agent ) ); + + // Early exit if there was an error. + if ( is_wp_error( $response ) ) { + return ''; + } + + // Get the CSS from our response. + $contents = wp_remote_retrieve_body( $response ); + + return $contents; + } + + /** + * Download files mentioned in our CSS locally. + * + * @access public + * @since 1.0.0 + * @return array Returns an array of remote URLs and their local counterparts. + */ + public function get_local_files_from_css() { + $font_files = $this->get_remote_files_from_css(); + $stored = get_site_option( 'downloaded_font_files', array() ); + $change = false; // If in the end this is true, we need to update the cache option. + + if ( ! defined( 'FS_CHMOD_DIR' ) ) { + define( 'FS_CHMOD_DIR', ( 0755 & ~ umask() ) ); + } + + // If the fonts folder don't exist, create it. + if ( ! file_exists( $this->get_fonts_folder() ) ) { + $this->get_filesystem()->mkdir( $this->get_fonts_folder(), FS_CHMOD_DIR ); + } + + foreach ( $font_files as $font_family => $files ) { + + // The folder path for this font-family. + $folder_path = $this->get_fonts_folder() . '/' . $font_family; + + // If the folder doesn't exist, create it. + if ( ! file_exists( $folder_path ) ) { + $this->get_filesystem()->mkdir( $folder_path, FS_CHMOD_DIR ); + } + + foreach ( $files as $url ) { + + // Get the filename. + $filename = basename( wp_parse_url( $url, PHP_URL_PATH ) ); + $font_path = $folder_path . '/' . $filename; + /** + * In Typekit, the filename will always be the same. We also need to check for query vars in their URLs. + * They provide this font variation description that we can use https://github.com/typekit/fvd + */ + $queries = wp_parse_url( $url, PHP_URL_QUERY ); + if ( ! empty( $queries ) ) { + $query_args = array(); + parse_str( $queries, $query_args ); + if ( array_key_exists( 'fvd', $query_args ) ) { + $font_path .= $query_args['fvd']; + } + } + + // Check if the file already exists. + if ( file_exists( $font_path ) ) { + + // Skip if already cached. + if ( isset( $stored[ $url ] ) ) { + continue; + } + + // Add file to the cache and change the $changed var to indicate we need to update the option. + $stored[ $url ] = $font_path; + $change = true; + + // Since the file exists we don't need to proceed with downloading it. + continue; + } + + /** + * If we got this far, we need to download the file. + */ + + // require file.php if the download_url function doesn't exist. + if ( ! function_exists( 'download_url' ) ) { + require_once wp_normalize_path( ABSPATH . '/wp-admin/includes/file.php' ); + } + + // Download file to temporary location. + $tmp_path = download_url( $url ); + + // Make sure there were no errors. + if ( is_wp_error( $tmp_path ) ) { + continue; + } + + // Move temp file to final destination. + $success = $this->get_filesystem()->move( $tmp_path, $font_path, true ); + if ( $success ) { + $stored[ $url ] = $font_path; + $change = true; + } + } + } + + // If there were changes, update the option. + if ( $change ) { + + // Cleanup the option and then save it. + foreach ( $stored as $url => $path ) { + if ( ! file_exists( $path ) ) { + unset( $stored[ $url ] ); + } + } + update_site_option( 'downloaded_font_files', $stored ); + } + + return $stored; + } + + /** + * Get font files from the CSS. + * + * @access public + * @since 1.0.0 + * @return array Returns an array of font-families and the font-files used. + */ + public function get_remote_files_from_css() { + + $font_faces = explode( '@font-face', $this->remote_styles ); + + $result = array(); + + // Loop all our font-face declarations. + foreach ( $font_faces as $font_face ) { + + // Make sure we only process styles inside this declaration. + $style = explode( '}', $font_face )[0]; + + // Sanity check. + if ( false === strpos( $style, 'font-family' ) ) { + continue; + } + + // Get an array of our font-families. + preg_match_all( '/font-family.*?\;/', $style, $matched_font_families ); + + // Get an array of our font-files. + preg_match_all( '/url\(.*?\)/i', $style, $matched_font_files ); + + // Get the font-family name. + $font_family = 'unknown'; + if ( isset( $matched_font_families[0] ) && isset( $matched_font_families[0][0] ) ) { + $font_family = rtrim( ltrim( $matched_font_families[0][0], 'font-family:' ), ';' ); + $font_family = trim( str_replace( array( "'", ';' ), '', $font_family ) ); + $font_family = sanitize_key( strtolower( str_replace( ' ', '-', $font_family ) ) ); + } + + // Make sure the font-family is set in our array. + if ( ! isset( $result[ $font_family ] ) ) { + $result[ $font_family ] = array(); + } + + // Get files for this font-family and add them to the array. + foreach ( $matched_font_files as $match ) { + + // Sanity check. + if ( ! isset( $match[0] ) ) { + continue; + } + + // Add the file URL. + $font_family_url = rtrim( ltrim( $match[0], 'url(' ), ')' ); + $font_family_url = str_replace( '"', '', $font_family_url ); + + // Make sure to convert relative URLs to absolute. + $font_family_url = $this->get_absolute_path( $font_family_url ); + + $result[ $font_family ][] = $font_family_url; + } + + // Make sure we have unique items. + // We're using array_flip here instead of array_unique for improved performance. + $result[ $font_family ] = array_flip( array_flip( $result[ $font_family ] ) ); + } + + return $result; + } + + /** + * Write the CSS to the filesystem. + * + * @access protected + * @since 1.1.0 + * @return string|false Returns the absolute path of the file on success, or false on fail. + */ + protected function write_stylesheet() { + $file_path = $this->get_local_stylesheet_path(); + $filesystem = $this->get_filesystem(); + + if ( ! defined( 'FS_CHMOD_DIR' ) ) { + define( 'FS_CHMOD_DIR', ( 0755 & ~ umask() ) ); + } + + // If the folder doesn't exist, create it. + if ( ! file_exists( $this->get_fonts_folder() ) ) { + $this->get_filesystem()->mkdir( $this->get_fonts_folder(), FS_CHMOD_DIR ); + } + + // If the file doesn't exist, create it. Return false if it can not be created. + if ( ! $filesystem->exists( $file_path ) && ! $filesystem->touch( $file_path ) ) { + return false; + } + + // If we got this far, we need to write the file. + // Get the CSS. + if ( ! $this->css ) { + $this->get_styles(); + } + + // Put the contents in the file. Return false if that fails. + if ( ! $filesystem->put_contents( $file_path, $this->css ) ) { + return false; + } + + return $file_path; + } + + /** + * Get the stylesheet path. + * + * @access public + * @since 1.1.0 + * @return string + */ + public function get_local_stylesheet_path() { + if ( ! $this->local_stylesheet_path ) { + $this->local_stylesheet_path = $this->get_fonts_folder() . '/' . $this->get_local_stylesheet_filename() . '.css'; + } + return $this->local_stylesheet_path; + } + + /** + * Get the local stylesheet filename. + * + * This is a hash, generated from the site-URL, the wp-content path and the URL. + * This way we can avoid issues with sites changing their URL, or the wp-content path etc. + * + * @access public + * @since 1.1.0 + * @return string + */ + public function get_local_stylesheet_filename() { + return md5( $this->get_base_url() . $this->get_base_path() . $this->remote_url . $this->font_format ); + } + + /** + * Set the font-format to be used. + * + * @access public + * @since 1.0.0 + * @param string $format The format to be used. Use "woff" or "woff2". + * @return void + */ + public function set_font_format( $format = 'woff2' ) { + $this->font_format = $format; + } + + /** + * Check if the local stylesheet exists. + * + * @access public + * @since 1.1.0 + * @return bool + */ + public function local_file_exists() { + return ( ! file_exists( $this->get_local_stylesheet_path() ) ); + } + + /** + * Get the base path. + * + * @access public + * @since 1.1.0 + * @return string + */ + public function get_base_path() { + if ( ! $this->base_path ) { + $this->base_path = apply_filters( 'wptt_get_local_fonts_base_path', $this->get_filesystem()->wp_content_dir() ); + } + return $this->base_path; + } + + /** + * Get the base URL. + * + * @access public + * @since 1.1.0 + * @return string + */ + public function get_base_url() { + if ( ! $this->base_url ) { + $this->base_url = apply_filters( 'wptt_get_local_fonts_base_url', content_url() ); + } + return $this->base_url; + } + + /** + * Get the subfolder name. + * + * @access public + * @since 1.1.0 + * @return string + */ + public function get_subfolder_name() { + if ( ! $this->subfolder_name ) { + $this->subfolder_name = apply_filters( 'wptt_get_local_fonts_subfolder_name', 'fonts' ); + } + return $this->subfolder_name; + } + + /** + * Get the folder for fonts. + * + * @access public + * @return string + */ + public function get_fonts_folder() { + if ( ! $this->fonts_folder ) { + $this->fonts_folder = $this->get_base_path(); + if ( $this->get_subfolder_name() ) { + $this->fonts_folder .= '/' . $this->get_subfolder_name(); + } + } + return $this->fonts_folder; + } + + /** + * Schedule a cleanup. + * + * Deletes the fonts files on a regular basis. + * This way font files will get updated regularly, + * and we avoid edge cases where unused files remain in the server. + * + * @access public + * @since 1.1.0 + * @return void + */ + public function schedule_cleanup() { + if ( ! is_multisite() || ( is_multisite() && is_main_site() ) ) { + if ( ! wp_next_scheduled( 'delete_fonts_folder' ) && ! wp_installing() ) { + wp_schedule_event( time(), self::CLEANUP_FREQUENCY, 'delete_fonts_folder' ); + } + } + } + + /** + * Delete the fonts folder. + * + * This runs as part of a cleanup routine. + * + * @access public + * @since 1.1.0 + * @return bool + */ + public function delete_fonts_folder() { + return $this->get_filesystem()->delete( $this->get_fonts_folder(), true ); + } + + /** + * Get the filesystem. + * + * @access protected + * @since 1.0.0 + * @return \WP_Filesystem_Base + */ + protected function get_filesystem() { + global $wp_filesystem; + + // If the filesystem has not been instantiated yet, do it here. + if ( ! $wp_filesystem ) { + if ( ! function_exists( 'WP_Filesystem' ) ) { + require_once wp_normalize_path( ABSPATH . '/wp-admin/includes/file.php' ); + } + WP_Filesystem(); + } + return $wp_filesystem; + } + + /** + * Get an absolute URL from a relative URL. + * + * @access protected + * + * @param string $url The URL. + * + * @return string + */ + protected function get_absolute_path( $url ) { + + // If dealing with a root-relative URL. + if ( 0 === stripos( $url, '/' ) ) { + $parsed_url = wp_parse_url( $this->remote_url ); + return $parsed_url['scheme'] . '://' . $parsed_url['hostname'] . $url; + } + + return $url; + } + } +} + +if ( ! function_exists( 'wptt_get_webfont_styles' ) ) { + /** + * Get styles for a webfont. + * + * This will get the CSS from the remote API, + * download any fonts it contains, + * replace references to remote URLs with locally-downloaded assets, + * and finally return the resulting CSS. + * + * @since 1.0.0 + * + * @param string $url The URL of the remote webfont. + * @param string $format The font-format. If you need to support IE, change this to "woff". + * + * @return string Returns the CSS. + */ + function wptt_get_webfont_styles( $url, $format = 'woff2' ) { + $font = new WPTT_WebFont_Loader( $url ); + $font->set_font_format( $format ); + return $font->get_styles(); + } +} + +if ( ! function_exists( 'wptt_get_webfont_url' ) ) { + /** + * Get a stylesheet URL for a webfont. + * + * @since 1.1.0 + * + * @param string $url The URL of the remote webfont. + * @param string $format The font-format. If you need to support IE, change this to "woff". + * + * @return string Returns the CSS. + */ + function wptt_get_webfont_url( $url, $format = 'woff2' ) { + $font = new WPTT_WebFont_Loader( $url ); + $font->set_font_format( $format ); + return $font->get_url(); + } +} diff --git a/inc/recommended-plugins.php b/inc/recommended-plugins.php new file mode 100644 index 0000000..b50ea00 --- /dev/null +++ b/inc/recommended-plugins.php @@ -0,0 +1,79 @@ + 'Contact Form Query', + 'slug' => 'contact-form-query', + 'required' => false, + ), + array( + 'name' => 'Social Icons Sticky', + 'slug' => 'share-social-media', + 'required' => false, + ), + ); + + // Don't recommend if pro version already active. + if ( ! defined( 'DARKMODETG_PRO_PLUGIN_VER' ) ) { + array_push( + $plugins, + array( + 'name' => 'Dark Mode Toggle', + 'slug' => 'dark-mode-toggle', + 'required' => false, + ) + ); + } + + // Don't recommend if pro version already active. + if ( ! class_exists( 'STLSP_Login_Security_Pro' ) ) { + array_push( + $plugins, + array( + 'name' => 'Login Security Captcha', + 'slug' => 'login-security-recaptcha', + 'required' => false, + ) + ); + } + + /* + * Array of configuration settings. Amend each line as needed. + * + * TGMPA will start providing localized text strings soon. If you already have translations of our standard + * strings available, please help us make TGMPA even better by giving us access to these translations or by + * sending in a pull-request with .po file(s) with the translations. + * + * Only uncomment the strings in the config array if you want to customize the strings. + */ + $config = array( + 'id' => 'pressbook', // Unique ID for hashing notices for multiple instances of TGMPA. + 'default_path' => '', // Default absolute path to bundled plugins. + 'menu' => 'tgmpa-install-plugins', // Menu slug. + 'has_notices' => true, // Show admin notices or not. + 'dismissable' => true, // If false, a user cannot dismiss the nag message. + 'dismiss_msg' => '', // If 'dismissable' is false, this message will be output at top of nag. + 'is_automatic' => false, // Automatically activate plugins after installation or not. + 'message' => '', // Message to output right before the plugins table. + ); + + tgmpa( $plugins, $config ); + } +} + +add_action( 'tgmpa_register', 'pressbook_register_required_plugins' ); diff --git a/inc/theme-page.css b/inc/theme-page.css new file mode 100644 index 0000000..34f11da --- /dev/null +++ b/inc/theme-page.css @@ -0,0 +1,161 @@ +.pressbook-container { + max-width: 1000px; + margin: 0 auto; + padding: 0 20px; + box-sizing: border-box; +} + +.pressbook-container a { + text-decoration: none; +} + +.pressbook-title { + font-size: 25px; + font-size: 1.55rem; + font-weight: 600; + line-height: 1.5; +} + +.pressbook-title span { + display: inline-block; + margin: 12px 2px; + font-weight: 400; + font-size: 13px; + color: #b4b9be; + vertical-align: middle; +} + +.pressbook-panel { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 15px 25px; + margin-bottom: 15px; + background-color: #fff; +} + +@media screen and (min-width: 688px) { + .pressbook-panel { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } +} + +.pressbook-panel--highlight { + border-left: 3px solid #0073aa; +} + +.pressbook-panel--highlight .button-primary { + font-size: 15px; +} + +.pressbook-panel-title { + display: block; + margin-bottom: 7px; + margin-bottom: .45rem; + font-size: 22px; + font-size: 1.35rem; + line-height: 1.5; +} + +.pressbook-panel-actions { + margin-top: 5px; +} + +@media screen and (min-width: 688px) { + .pressbook-panel-actions { + margin-top: 0; + margin-left: 15px; + } +} + +.pressbook-panel .pressbook-panel-actions a { + margin-top: 5px; + margin-bottom: 5px; + margin-right: 7px; +} + +@media screen and (min-width: 688px) { + .pressbook-panel .pressbook-panel-actions a { + margin-right: 0; + } +} + +.pressbook-panel .pressbook-review-stars-link { + display: block; + margin-top: 6px; + box-shadow: none; +} + +.pressbook-panel-content .description { + font-size: 15px; + font-size: .9375rem; + font-style: normal; +} + +.pressbook-check-list-wrap { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + margin: 1rem 0; +} + +.pressbook-check-list { + font-size: 15px; + font-size: .9375rem; + line-height: 1.55; + margin-top: 0; + margin-bottom: 0; + margin-right: 2rem; +} + +.pressbook-check-list li { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin-bottom: 10px; +} + +.pressbook-check-list li::before { + content: ''; + display: inline-block; + margin-right: 12px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + height: .63em; + width: .3em; + border-bottom: .25em solid #b4b9be; + border-right: .25em solid #b4b9be; +} + +.pressbook-title-wrap { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.pressbook-title { + margin-right: 12px; +} diff --git a/inc/transparency-grid.png b/inc/transparency-grid.png new file mode 100644 index 0000000000000000000000000000000000000000..c60f120d082bbecf3141bdaa1b199d6cedff1ce5 GIT binary patch literal 2646 zcmaJ@eLRzU8+Wo(jz)G6X>yyRL$Vi!wy@SlCR<*nt#c@M+l^r_wrR7@q|nM+QO-$1 zqo^cD)G1D{dMHmSZ%2tqQ_@L7QHOY@Q=R9Jr|15B?)&$k{ zGPE+()6+Ae`B8&)>yYlXG?=gZ+Pv%DqFa_oeb~|vVWd!tUDHP$Dwhqcn=Scm4FKths9uBFgO=yoCnd>g^0xh zA0L!1o0uC(45s>i%%zLGP|;GUh={?+WHPkO6)hA;VQ>TjVNS!v#aV}NmLv+Kpxjv? zvHPSzg(Ms?PbB3D1;CslxK)@S^+M??{rd`h(PvqK!-e98!+Kyna5x`48Aqj3 zSGl{A$!n>rC{)TPE>*}$;6noGCocCNuFDs>b5`JsbeXA;n70k$`ig~o;KP-Pyf4;* z_x+;YM=tlvwP3%<#psH`%nkOx2L0(s=bpLkXWQz6&&G!YI=72;ww48U`|0V;Z>CYn zOnLX|u#BJ=esE?z+M*38_~lzJ#p*k)x2E%YVvApI?xj$(U(XMgww8C6;xrnKC1S^p z$D>nkC#(7}7>sAnq>{gHmNeBr^L~8Xb@Akm*-OPUgC*}Jq^6NO!?SfsR_#eKJ4ol0 zNkvc#a;i?C$Z8jNy`W<=rF40QTw6<(hpTp&-Hjmu+2wY>#=4FbW}Goo8L8{C({7cZ@>d(#m*M7H z&2L!BwfN?7I#-#0vtX}={5rqofKh1#>z`W# z@A*GC2y)Y5)yr0v2=<&e88>LSjwtL>rzBm#J~c5;-i=`KuSppzUuWLx36EM{I2vhK zZMx}Ktbfx|$aK*-;SGGDR>cMmH@567k?sG=B4<8jLCS9Z+fNrXybDW!9Y|DLj=-`C z-w@kFGy~H`Gkv#_qO&G`W9&mgIVoxJ;&pCU1byKTxY-RY|LU1xqJN1u-n2Qu&VnMj zMEptrHep5i@R(`n<&zhT%eSP(%+$|nwfY5LJ#-PibeJ{sXNc9Vzh4uP!)~r3TbjR1 zKCx-SDJVUSA_>`RtPnR+a$L{$!&k$eRZb;B8;vBuKQYUE*Xdm@EaqjxI6ogEFW6WdKq7e z+w7wdm}Gos&o!r+FMP^4>cUtTUygmV0xzAA^@bg$sM@n?v4S`%nxfrLz4}02JNnjkN0%C!gdpZ1=7oZUCHC ze7zG)#sL2bd+qQGRQ;(V$(H!SJ-ckJLC)2&i&V>u zo)wv9*X;`;ZZ0azRX^~Cw>1ql*k{!>D)JtvK)aYQlJ@OF*=%BmVcqtK(Gz)DsL7uc zPXjaL%X%(b^`2BZ{$4d<-8ejW7&lWMwdma8m~rI3(VAB84P!y+$?Kf|^lzO!_CC~> zwzzQLSo~PDXN=P6`wKQxKb#hZ5?+Tp71Z>ww1-*;~Z>h=fmHH}7%186q>>u%@Tt7~j6-*1(cyPVQGAl|s|E;z99 z$)RlW`p48~y?H6f!sJJ*kZ@>A*@hq6)}(6UwwY>85M;WculMuXTV>UCgqCBsvtDjCgG$t5R!)>J;e`xtPZm}YFMmFjoEI`d$C#iSh=7=pp0h)WhW<`I1X1`~7IojrIb3j%vHc<6$=&Au|X+R>j_k2OP3Gjt4(G zW6Ekhzm(fEe7vH#JgLG@VZMuyXWQ!#v?NCo(BcETW6M)@JnMKHeAUM|0-4Dy+g>C# zY;qb@y^3wXb>utJhMrw}eO13Vp*Iy35RqCFPa>!vQ7@vWw{74YO(xz+>=uA)y4ZEE zzO^u_thYF$S*AV%nY6q4ZSHV19t#RQc&dL)Vz>$o%Y;QVdvW1@)QYhWb5|v6jPsnOUDgl6)Z)-?;FlJ zYvq*V$rXE1_`;EuYw=?zvmf8HTo;*YQlwPqg(bcfFj+oRtVbuBe_P!sw;1YjRu2=0 zq3;q7Zce=Z@@E*@;O@=}#tjw0W>D#AmT8|k!fGDMwlLbX#^hY0?L1aY*(lB>pPK9DTEj`mv y>9FTSo1KaR_SAo0S(0e(Xl?eY_K#UZtX^WA`0j6qyjRZs>Ct=`)H7=%cKruXMRiF4 literal 0 HcmV?d00001 diff --git a/inc/vendor/autoload.php b/inc/vendor/autoload.php new file mode 100644 index 0000000..98b3c26 --- /dev/null +++ b/inc/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see http://www.php-fig.org/psr/psr-0/ + * @see http://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/inc/vendor/composer/LICENSE b/inc/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/inc/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/inc/vendor/composer/autoload_classmap.php b/inc/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..7a91153 --- /dev/null +++ b/inc/vendor/composer/autoload_classmap.php @@ -0,0 +1,9 @@ + array($baseDir . '/core'), +); diff --git a/inc/vendor/composer/autoload_real.php b/inc/vendor/composer/autoload_real.php new file mode 100644 index 0000000..c47c4a6 --- /dev/null +++ b/inc/vendor/composer/autoload_real.php @@ -0,0 +1,52 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInite840bf700abba19d8b289215efeb8f1e::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + return $loader; + } +} diff --git a/inc/vendor/composer/autoload_static.php b/inc/vendor/composer/autoload_static.php new file mode 100644 index 0000000..cd36510 --- /dev/null +++ b/inc/vendor/composer/autoload_static.php @@ -0,0 +1,31 @@ + + array ( + 'PressBook\\' => 10, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'PressBook\\' => + array ( + 0 => __DIR__ . '/../..' . '/core', + ), + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInite840bf700abba19d8b289215efeb8f1e::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInite840bf700abba19d8b289215efeb8f1e::$prefixDirsPsr4; + + }, null, ClassLoader::class); + } +} diff --git a/inc/welcome-page.php b/inc/welcome-page.php new file mode 100644 index 0000000..3856aa9 --- /dev/null +++ b/inc/welcome-page.php @@ -0,0 +1,259 @@ + +
    +
    +
    +
    +
    + Version %2$s', 'menu page heading', 'pressbook' ), + array( 'span' => array() ) + ), + esc_html( PressBook\Helpers::get_theme_name() ), + esc_html( wp_get_theme()->get( 'Version' ) ) + ); + ?> +
    +
    +
    + +
    +
    +
    + +

    + +

    +
    +
    + +
    +
    +
    +
    + +

    + Top Banner.', 'pressbook' ); ?> +

    +
    +
    + +
    +
    +
    +
    + +

    + +

    +
    +
    + +
    +
    +
    +
    + +

    + +

    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    + +
    +
    +
    +
    + +

    + Top Navbar.', 'pressbook' ); ?> +

    +
    +
    + +
    +
    +
    +
    + +

    + Primary Navbar.', 'pressbook' ); ?> +

    +
    +
    + +
    +
    +
    +
    + +

    + Header Image and body background image from the Customizer > Background Image. Also, you can change the header and body background color from the Customizer > Colors.', 'pressbook' ); ?> +

    +
    +
    + + + +
    +
    +
    +
    + +

    + Header Block. PressBook comes with 1 header block area.', 'pressbook' ); ?> +

    +
    +
    + + +
    +
    +
    +
    + +

    + Footer Block. PressBook comes with 1 footer block area.', 'pressbook' ); ?> +

    +
    +
    + + +
    +
    +
    +
    + +

    + +

    +
    +
    + +
    +
    +
    +
    + +

    + +

    +
    +
    +
    +
    + +

    + +

    +

    + +

    +
    +
    +
    +
    +
    + +
    +

    + welcome page.', 'pressbook' ), + esc_html( PressBook\Helpers::get_theme_name() ), + esc_url( admin_url( 'themes.php?page=pressbook-options' ) ) + ), + array( 'a' => array( 'href' => array() ) ) + ); + ?> +

    +

    + + + +

    +
    + ul, +.editor-styles-wrapper li>ol { + margin-top: 0; + margin-bottom: 0; + margin-right: 1.5em; +} + +.editor-styles-wrapper li:not(:first-child) { + padding-top: .2em; +} + +.editor-styles-wrapper li:not(:last-child) { + padding-bottom: .2em; +} + +.editor-styles-wrapper li>ul>li:first-child, +.editor-styles-wrapper li>ol>li:first-child { + padding-top: .4em; +} + +.editor-styles-wrapper blockquote { + margin: 0 1.5em; +} + +.editor-styles-wrapper .wp-block-quote p { + margin-bottom: .75em; +} + +.editor-styles-wrapper .wp-block-quote.is-large p, +.editor-styles-wrapper .wp-block-quote.is-style-large p { + font-size: 1.3em; +} + +.editor-styles-wrapper .wp-block-quote__citation, +.editor-styles-wrapper .wp-block-quote cite, +.editor-styles-wrapper .wp-block-quote footer { + font-size: .85em; +} + +.editor-styles-wrapper .wp-block-quote.is-large cite, +.editor-styles-wrapper .wp-block-quote.is-large footer, +.editor-styles-wrapper .wp-block-quote.is-style-large cite, +.editor-styles-wrapper .wp-block-quote.is-style-large footer { + font-size: .95em; +} + +.editor-styles-wrapper .wp-block-quote, +.editor-styles-wrapper .wp-block-quote.is-large, +.editor-styles-wrapper .wp-block-quote.is-style-large { + margin-bottom: 1.75em; +} + +.editor-styles-wrapper .wp-block-pullquote { + padding: 2.4em 0; +} + +.editor-styles-wrapper .wp-block-pullquote p { + font-size: 1.75em; + margin-bottom: 0; +} + +.editor-styles-wrapper .wp-block-pullquote__citation, +.editor-styles-wrapper .wp-block-pullquote cite, +.editor-styles-wrapper .wp-block-pullquote footer { + display: block; + margin-top: 1.5em; +} + +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color blockquote p { + font-size: 1.9em; +} + +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color blockquote { + max-width: 70%; +} + +.editor-styles-wrapper .wp-block-table, +.editor-styles-wrapper .wp-block-video, +.editor-styles-wrapper .wp-block-audio, +.editor-styles-wrapper .wp-block-embed, +.editor-styles-wrapper .wp-block-image, +.editor-styles-wrapper .wp-block-gallery, +.editor-styles-wrapper .wp-block-media-text, +.editor-styles-wrapper .wp-block-calendar { + margin-bottom: 1.5em; +} + +.editor-styles-wrapper .wp-block-calendar table:where(:not(.has-text-color)) { + color: inherit; +} + +.editor-styles-wrapper .wp-block-table table, +.editor-styles-wrapper .wp-block-calendar .wp-calendar-table { + margin-bottom: 0; +} + +.editor-styles-wrapper .wp-block-calendar .wp-calendar-nav { + margin-top: .5em; +} + +.editor-styles-wrapper .wp-block-image img { + display: block; +} + +.editor-styles-wrapper .wp-block-table figcaption, +.editor-styles-wrapper .wp-block-video figcaption, +.editor-styles-wrapper .wp-block-embed figcaption, +.editor-styles-wrapper .wp-block-image figcaption, +.editor-styles-wrapper .wp-block-gallery figcaption { + font-size: .85em; +} + +.editor-styles-wrapper .wp-block-table figcaption, +.editor-styles-wrapper .wp-block-video figcaption, +.editor-styles-wrapper .wp-block-embed figcaption { + margin-top: 1em; + margin-bottom: 0; +} + +.editor-styles-wrapper .wp-block-audio figcaption { + margin-top: .75em; + margin-bottom: 0; + font-size: .8em; +} + +.editor-styles-wrapper .wp-block-table.is-style-stripes { + border-bottom: 0; +} + +.editor-styles-wrapper pre.wp-block-verse { + font-family: 'Courier 10 Pitch', courier, monospace; +} + +.editor-styles-wrapper .wp-block-search .wp-block-search__button { + margin-right: 0; +} + +.editor-styles-wrapper .wp-block-rss { + padding: 0; + list-style-type: none; +} + +.editor-styles-wrapper .wp-block-rss .wp-block-rss__item:not(:last-child) { + margin-bottom: 1em; +} + +.editor-styles-wrapper .wp-block-rss .wp-block-rss__item:not(:first-child) { + padding-top: 0; +} + +.editor-styles-wrapper .wp-block-latest-comments__comment { + line-height: inherit; +} + +.editor-styles-wrapper .wp-block-button__link { + text-decoration: none; +} + +.editor-styles-wrapper .wp-block-social-links .wp-block-social-link { + padding: 0; +} + +.editor-styles-wrapper .more-link, +.editor-styles-wrapper .wp-block-search .wp-block-search__button, +.editor-styles-wrapper button, +.editor-styles-wrapper input[type="button"], +.editor-styles-wrapper input[type="reset"], +.editor-styles-wrapper input[type="submit"], +.editor-styles-wrapper .more-link:active, +.editor-styles-wrapper .more-link:focus, +.editor-styles-wrapper .more-link:hover, +.editor-styles-wrapper .wp-block-search .wp-block-search__button:active, +.editor-styles-wrapper .wp-block-search .wp-block-search__button:focus, +.editor-styles-wrapper .wp-block-search .wp-block-search__button:hover, +.editor-styles-wrapper button:active, +.editor-styles-wrapper button:focus, +.editor-styles-wrapper button:hover, +.editor-styles-wrapper input[type="button"]:active, +.editor-styles-wrapper input[type="button"]:focus, +.editor-styles-wrapper input[type="button"]:hover, +.editor-styles-wrapper input[type="reset"]:active, +.editor-styles-wrapper input[type="reset"]:focus, +.editor-styles-wrapper input[type="reset"]:hover, +.editor-styles-wrapper input[type="submit"]:active, +.editor-styles-wrapper input[type="submit"]:focus, +.editor-styles-wrapper input[type="submit"]:hover { + color: #ffffff; +} \ No newline at end of file diff --git a/inc/widgets-editor-legacy.css b/inc/widgets-editor-legacy.css new file mode 100644 index 0000000..c1b713e --- /dev/null +++ b/inc/widgets-editor-legacy.css @@ -0,0 +1,301 @@ +.editor-styles-wrapper, +.editor-styles-wrapper button, +.editor-styles-wrapper input, +.editor-styles-wrapper select, +.editor-styles-wrapper optgroup, +.editor-styles-wrapper textarea, +.editor-styles-wrapper h1, +.editor-styles-wrapper h2, +.editor-styles-wrapper h3, +.editor-styles-wrapper h4, +.editor-styles-wrapper h5, +.editor-styles-wrapper h6 { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; +} + +.editor-styles-wrapper { + color: #404040; + font-size: 16px; + font-size: 1rem; + line-height: 1.75; + background: #ffffff !important; +} + +@media screen and (min-width: 768px) { + .editor-styles-wrapper { + font-size: 17px; + font-size: 1.0625rem; + } +} + +.editor-styles-wrapper h1, +.editor-styles-wrapper h2, +.editor-styles-wrapper h3, +.editor-styles-wrapper h4, +.editor-styles-wrapper h5, +.editor-styles-wrapper h6 { + line-height: 1.5; +} + +.editor-styles-wrapper h1 { + margin: .67em 0; +} + +.editor-styles-wrapper h2 { + margin: .73em 0; +} + +.editor-styles-wrapper h3 { + margin: .8em 0; +} + +.editor-styles-wrapper h4 { + margin: .89em 0; +} + +.editor-styles-wrapper h5 { + margin: 1em 0; +} + +.editor-styles-wrapper h6 { + margin: 1.14em 0; +} + +.editor-styles-wrapper p { + margin-bottom: 1.5em; +} + +.editor-styles-wrapper a { + text-decoration: underline; + transition: color .2s; +} + +.editor-styles-wrapper.editor-styles-wrapper a { + color: #2271b1; +} + +.editor-styles-wrapper.editor-styles-wrapper a:hover, +.editor-styles-wrapper.editor-styles-wrapper a:focus, +.editor-styles-wrapper.editor-styles-wrapper a:active { + color: #135e96; +} + +.editor-styles-wrapper a:focus { + outline: thin dotted; +} + +.editor-styles-wrapper a:focus:not(:focus-visible), +.editor-styles-wrapper a:hover, +.editor-styles-wrapper a:active { + outline: 0; +} + +.editor-styles-wrapper p.has-text-color a, +.editor-styles-wrapper p.has-text-color a:hover, +.editor-styles-wrapper p.has-text-color a:focus, +.editor-styles-wrapper p.has-text-color a:active { + color: inherit; +} + +.editor-styles-wrapper ul, +.editor-styles-wrapper ol { + margin: 1.5em 0 1.5em 0; + padding-left: 1em; +} + +.editor-styles-wrapper ul { + list-style-type: disc; +} + +.editor-styles-wrapper ol { + list-style-type: decimal; +} + +.editor-styles-wrapper li>ul, +.editor-styles-wrapper li>ol { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.editor-styles-wrapper li:not(:first-child) { + padding-top: .2em; +} + +.editor-styles-wrapper li:not(:last-child) { + padding-bottom: .2em; +} + +.editor-styles-wrapper li>ul>li:first-child, +.editor-styles-wrapper li>ol>li:first-child { + padding-top: .4em; +} + +.editor-styles-wrapper blockquote { + margin: 0 1.5em; +} + +.editor-styles-wrapper .wp-block-quote p { + margin-bottom: .75em; +} + +.editor-styles-wrapper .wp-block-quote.is-large p, +.editor-styles-wrapper .wp-block-quote.is-style-large p { + font-size: 1.3em; +} + +.editor-styles-wrapper .wp-block-quote__citation, +.editor-styles-wrapper .wp-block-quote cite, +.editor-styles-wrapper .wp-block-quote footer { + font-size: .85em; +} + +.editor-styles-wrapper .wp-block-quote.is-large cite, +.editor-styles-wrapper .wp-block-quote.is-large footer, +.editor-styles-wrapper .wp-block-quote.is-style-large cite, +.editor-styles-wrapper .wp-block-quote.is-style-large footer { + font-size: .95em; +} + +.editor-styles-wrapper .wp-block-quote, +.editor-styles-wrapper .wp-block-quote.is-large, +.editor-styles-wrapper .wp-block-quote.is-style-large { + margin-bottom: 1.75em; +} + +.editor-styles-wrapper .wp-block-pullquote { + padding: 2.4em 0; +} + +.editor-styles-wrapper .wp-block-pullquote p { + font-size: 1.75em; + margin-bottom: 0; +} + +.editor-styles-wrapper .wp-block-pullquote__citation, +.editor-styles-wrapper .wp-block-pullquote cite, +.editor-styles-wrapper .wp-block-pullquote footer { + display: block; + margin-top: 1.5em; +} + +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color blockquote p { + font-size: 1.9em; +} + +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color blockquote { + max-width: 70%; +} + +.editor-styles-wrapper .wp-block-table, +.editor-styles-wrapper .wp-block-video, +.editor-styles-wrapper .wp-block-audio, +.editor-styles-wrapper .wp-block-embed, +.editor-styles-wrapper .wp-block-image, +.editor-styles-wrapper .wp-block-gallery, +.editor-styles-wrapper .wp-block-media-text, +.editor-styles-wrapper .wp-block-calendar { + margin-bottom: 1.5em; +} + +.editor-styles-wrapper .wp-block-calendar table:where(:not(.has-text-color)) { + color: inherit; +} + +.editor-styles-wrapper .wp-block-table table, +.editor-styles-wrapper .wp-block-calendar .wp-calendar-table { + margin-bottom: 0; +} + +.editor-styles-wrapper .wp-block-calendar .wp-calendar-nav { + margin-top: .5em; +} + +.editor-styles-wrapper .wp-block-image img { + display: block; +} + +.editor-styles-wrapper .wp-block-table figcaption, +.editor-styles-wrapper .wp-block-video figcaption, +.editor-styles-wrapper .wp-block-embed figcaption, +.editor-styles-wrapper .wp-block-image figcaption, +.editor-styles-wrapper .wp-block-gallery figcaption { + font-size: .85em; +} + +.editor-styles-wrapper .wp-block-table figcaption, +.editor-styles-wrapper .wp-block-video figcaption, +.editor-styles-wrapper .wp-block-embed figcaption { + margin-top: 1em; + margin-bottom: 0; +} + +.editor-styles-wrapper .wp-block-audio figcaption { + margin-top: .75em; + margin-bottom: 0; + font-size: .8em; +} + +.editor-styles-wrapper .wp-block-table.is-style-stripes { + border-bottom: 0; +} + +.editor-styles-wrapper pre.wp-block-verse { + font-family: 'Courier 10 Pitch', courier, monospace; +} + +.editor-styles-wrapper .wp-block-search .wp-block-search__button { + margin-left: 0; +} + +.editor-styles-wrapper .wp-block-rss { + padding: 0; + list-style-type: none; +} + +.editor-styles-wrapper .wp-block-rss .wp-block-rss__item:not(:last-child) { + margin-bottom: 1em; +} + +.editor-styles-wrapper .wp-block-rss .wp-block-rss__item:not(:first-child) { + padding-top: 0; +} + +.editor-styles-wrapper .wp-block-latest-comments__comment { + line-height: inherit; +} + +.editor-styles-wrapper .wp-block-button__link { + text-decoration: none; +} + +.editor-styles-wrapper .wp-block-social-links .wp-block-social-link { + padding: 0; +} + +.editor-styles-wrapper .more-link, +.editor-styles-wrapper .wp-block-search .wp-block-search__button, +.editor-styles-wrapper button, +.editor-styles-wrapper input[type="button"], +.editor-styles-wrapper input[type="reset"], +.editor-styles-wrapper input[type="submit"], +.editor-styles-wrapper .more-link:active, +.editor-styles-wrapper .more-link:focus, +.editor-styles-wrapper .more-link:hover, +.editor-styles-wrapper .wp-block-search .wp-block-search__button:active, +.editor-styles-wrapper .wp-block-search .wp-block-search__button:focus, +.editor-styles-wrapper .wp-block-search .wp-block-search__button:hover, +.editor-styles-wrapper button:active, +.editor-styles-wrapper button:focus, +.editor-styles-wrapper button:hover, +.editor-styles-wrapper input[type="button"]:active, +.editor-styles-wrapper input[type="button"]:focus, +.editor-styles-wrapper input[type="button"]:hover, +.editor-styles-wrapper input[type="reset"]:active, +.editor-styles-wrapper input[type="reset"]:focus, +.editor-styles-wrapper input[type="reset"]:hover, +.editor-styles-wrapper input[type="submit"]:active, +.editor-styles-wrapper input[type="submit"]:focus, +.editor-styles-wrapper input[type="submit"]:hover { + color: #ffffff; +} \ No newline at end of file diff --git a/inc/widgets-editor-style.css b/inc/widgets-editor-style.css new file mode 100644 index 0000000..c2e78f8 --- /dev/null +++ b/inc/widgets-editor-style.css @@ -0,0 +1,20 @@ +.wp-block h1, +.wp-block h2 { + font-size: 1.1em; +} + +.wp-block h3 { + font-size: 1.08em; +} + +.wp-block h4 { + font-size: 1.05em; +} + +.wp-block h5 { + font-size: 1.02em; +} + +.wp-block h6 { + font-size: 1em; +} \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..c71f33f --- /dev/null +++ b/index.php @@ -0,0 +1,70 @@ + + + ' ); + } + ?> + + +
    +

    ' . esc_html( get_search_query() ) . '' ); ?>

    +
    + + + + + + + +} arr + * @param {*} key + * @returns {number} + */ + function getIndex(arr, key) { + var result = -1; + arr.some(function (entry, index) { + if (entry[0] === key) { + result = index; + return true; + } + return false; + }); + return result; + } + return /** @class */ (function () { + function class_1() { + this.__entries__ = []; + } + Object.defineProperty(class_1.prototype, "size", { + /** + * @returns {boolean} + */ + get: function () { + return this.__entries__.length; + }, + enumerable: true, + configurable: true + }); + /** + * @param {*} key + * @returns {*} + */ + class_1.prototype.get = function (key) { + var index = getIndex(this.__entries__, key); + var entry = this.__entries__[index]; + return entry && entry[1]; + }; + /** + * @param {*} key + * @param {*} value + * @returns {void} + */ + class_1.prototype.set = function (key, value) { + var index = getIndex(this.__entries__, key); + if (~index) { + this.__entries__[index][1] = value; + } + else { + this.__entries__.push([key, value]); + } + }; + /** + * @param {*} key + * @returns {void} + */ + class_1.prototype.delete = function (key) { + var entries = this.__entries__; + var index = getIndex(entries, key); + if (~index) { + entries.splice(index, 1); + } + }; + /** + * @param {*} key + * @returns {void} + */ + class_1.prototype.has = function (key) { + return !!~getIndex(this.__entries__, key); + }; + /** + * @returns {void} + */ + class_1.prototype.clear = function () { + this.__entries__.splice(0); + }; + /** + * @param {Function} callback + * @param {*} [ctx=null] + * @returns {void} + */ + class_1.prototype.forEach = function (callback, ctx) { + if (ctx === void 0) { ctx = null; } + for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) { + var entry = _a[_i]; + callback.call(ctx, entry[1], entry[0]); + } + }; + return class_1; + }()); + })(); + + /** + * Detects whether window and document objects are available in current environment. + */ + var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document; + + // Returns global object of a current environment. + var global$1 = (function () { + if (typeof global !== 'undefined' && global.Math === Math) { + return global; + } + if (typeof self !== 'undefined' && self.Math === Math) { + return self; + } + if (typeof window !== 'undefined' && window.Math === Math) { + return window; + } + // eslint-disable-next-line no-new-func + return Function('return this')(); + })(); + + /** + * A shim for the requestAnimationFrame which falls back to the setTimeout if + * first one is not supported. + * + * @returns {number} Requests' identifier. + */ + var requestAnimationFrame$1 = (function () { + if (typeof requestAnimationFrame === 'function') { + // It's required to use a bounded function because IE sometimes throws + // an "Invalid calling object" error if rAF is invoked without the global + // object on the left hand side. + return requestAnimationFrame.bind(global$1); + } + return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); }; + })(); + + // Defines minimum timeout before adding a trailing call. + var trailingTimeout = 2; + /** + * Creates a wrapper function which ensures that provided callback will be + * invoked only once during the specified delay period. + * + * @param {Function} callback - Function to be invoked after the delay period. + * @param {number} delay - Delay after which to invoke callback. + * @returns {Function} + */ + function throttle (callback, delay) { + var leadingCall = false, trailingCall = false, lastCallTime = 0; + /** + * Invokes the original callback function and schedules new invocation if + * the "proxy" was called during current request. + * + * @returns {void} + */ + function resolvePending() { + if (leadingCall) { + leadingCall = false; + callback(); + } + if (trailingCall) { + proxy(); + } + } + /** + * Callback invoked after the specified delay. It will further postpone + * invocation of the original function delegating it to the + * requestAnimationFrame. + * + * @returns {void} + */ + function timeoutCallback() { + requestAnimationFrame$1(resolvePending); + } + /** + * Schedules invocation of the original function. + * + * @returns {void} + */ + function proxy() { + var timeStamp = Date.now(); + if (leadingCall) { + // Reject immediately following calls. + if (timeStamp - lastCallTime < trailingTimeout) { + return; + } + // Schedule new call to be in invoked when the pending one is resolved. + // This is important for "transitions" which never actually start + // immediately so there is a chance that we might miss one if change + // happens amids the pending invocation. + trailingCall = true; + } + else { + leadingCall = true; + trailingCall = false; + setTimeout(timeoutCallback, delay); + } + lastCallTime = timeStamp; + } + return proxy; + } + + // Minimum delay before invoking the update of observers. + var REFRESH_DELAY = 20; + // A list of substrings of CSS properties used to find transition events that + // might affect dimensions of observed elements. + var transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight']; + // Check if MutationObserver is available. + var mutationObserverSupported = typeof MutationObserver !== 'undefined'; + /** + * Singleton controller class which handles updates of ResizeObserver instances. + */ + var ResizeObserverController = /** @class */ (function () { + /** + * Creates a new instance of ResizeObserverController. + * + * @private + */ + function ResizeObserverController() { + /** + * Indicates whether DOM listeners have been added. + * + * @private {boolean} + */ + this.connected_ = false; + /** + * Tells that controller has subscribed for Mutation Events. + * + * @private {boolean} + */ + this.mutationEventsAdded_ = false; + /** + * Keeps reference to the instance of MutationObserver. + * + * @private {MutationObserver} + */ + this.mutationsObserver_ = null; + /** + * A list of connected observers. + * + * @private {Array} + */ + this.observers_ = []; + this.onTransitionEnd_ = this.onTransitionEnd_.bind(this); + this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY); + } + /** + * Adds observer to observers list. + * + * @param {ResizeObserverSPI} observer - Observer to be added. + * @returns {void} + */ + ResizeObserverController.prototype.addObserver = function (observer) { + if (!~this.observers_.indexOf(observer)) { + this.observers_.push(observer); + } + // Add listeners if they haven't been added yet. + if (!this.connected_) { + this.connect_(); + } + }; + /** + * Removes observer from observers list. + * + * @param {ResizeObserverSPI} observer - Observer to be removed. + * @returns {void} + */ + ResizeObserverController.prototype.removeObserver = function (observer) { + var observers = this.observers_; + var index = observers.indexOf(observer); + // Remove observer if it's present in registry. + if (~index) { + observers.splice(index, 1); + } + // Remove listeners if controller has no connected observers. + if (!observers.length && this.connected_) { + this.disconnect_(); + } + }; + /** + * Invokes the update of observers. It will continue running updates insofar + * it detects changes. + * + * @returns {void} + */ + ResizeObserverController.prototype.refresh = function () { + var changesDetected = this.updateObservers_(); + // Continue running updates if changes have been detected as there might + // be future ones caused by CSS transitions. + if (changesDetected) { + this.refresh(); + } + }; + /** + * Updates every observer from observers list and notifies them of queued + * entries. + * + * @private + * @returns {boolean} Returns "true" if any observer has detected changes in + * dimensions of it's elements. + */ + ResizeObserverController.prototype.updateObservers_ = function () { + // Collect observers that have active observations. + var activeObservers = this.observers_.filter(function (observer) { + return observer.gatherActive(), observer.hasActive(); + }); + // Deliver notifications in a separate cycle in order to avoid any + // collisions between observers, e.g. when multiple instances of + // ResizeObserver are tracking the same element and the callback of one + // of them changes content dimensions of the observed target. Sometimes + // this may result in notifications being blocked for the rest of observers. + activeObservers.forEach(function (observer) { return observer.broadcastActive(); }); + return activeObservers.length > 0; + }; + /** + * Initializes DOM listeners. + * + * @private + * @returns {void} + */ + ResizeObserverController.prototype.connect_ = function () { + // Do nothing if running in a non-browser environment or if listeners + // have been already added. + if (!isBrowser || this.connected_) { + return; + } + // Subscription to the "Transitionend" event is used as a workaround for + // delayed transitions. This way it's possible to capture at least the + // final state of an element. + document.addEventListener('transitionend', this.onTransitionEnd_); + window.addEventListener('resize', this.refresh); + if (mutationObserverSupported) { + this.mutationsObserver_ = new MutationObserver(this.refresh); + this.mutationsObserver_.observe(document, { + attributes: true, + childList: true, + characterData: true, + subtree: true + }); + } + else { + document.addEventListener('DOMSubtreeModified', this.refresh); + this.mutationEventsAdded_ = true; + } + this.connected_ = true; + }; + /** + * Removes DOM listeners. + * + * @private + * @returns {void} + */ + ResizeObserverController.prototype.disconnect_ = function () { + // Do nothing if running in a non-browser environment or if listeners + // have been already removed. + if (!isBrowser || !this.connected_) { + return; + } + document.removeEventListener('transitionend', this.onTransitionEnd_); + window.removeEventListener('resize', this.refresh); + if (this.mutationsObserver_) { + this.mutationsObserver_.disconnect(); + } + if (this.mutationEventsAdded_) { + document.removeEventListener('DOMSubtreeModified', this.refresh); + } + this.mutationsObserver_ = null; + this.mutationEventsAdded_ = false; + this.connected_ = false; + }; + /** + * "Transitionend" event handler. + * + * @private + * @param {TransitionEvent} event + * @returns {void} + */ + ResizeObserverController.prototype.onTransitionEnd_ = function (_a) { + var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b; + // Detect whether transition may affect dimensions of an element. + var isReflowProperty = transitionKeys.some(function (key) { + return !!~propertyName.indexOf(key); + }); + if (isReflowProperty) { + this.refresh(); + } + }; + /** + * Returns instance of the ResizeObserverController. + * + * @returns {ResizeObserverController} + */ + ResizeObserverController.getInstance = function () { + if (!this.instance_) { + this.instance_ = new ResizeObserverController(); + } + return this.instance_; + }; + /** + * Holds reference to the controller's instance. + * + * @private {ResizeObserverController} + */ + ResizeObserverController.instance_ = null; + return ResizeObserverController; + }()); + + /** + * Defines non-writable/enumerable properties of the provided target object. + * + * @param {Object} target - Object for which to define properties. + * @param {Object} props - Properties to be defined. + * @returns {Object} Target object. + */ + var defineConfigurable = (function (target, props) { + for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) { + var key = _a[_i]; + Object.defineProperty(target, key, { + value: props[key], + enumerable: false, + writable: false, + configurable: true + }); + } + return target; + }); + + /** + * Returns the global object associated with provided element. + * + * @param {Object} target + * @returns {Object} + */ + var getWindowOf = (function (target) { + // Assume that the element is an instance of Node, which means that it + // has the "ownerDocument" property from which we can retrieve a + // corresponding global object. + var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView; + // Return the local global object if it's not possible extract one from + // provided element. + return ownerGlobal || global$1; + }); + + // Placeholder of an empty content rectangle. + var emptyRect = createRectInit(0, 0, 0, 0); + /** + * Converts provided string to a number. + * + * @param {number|string} value + * @returns {number} + */ + function toFloat(value) { + return parseFloat(value) || 0; + } + /** + * Extracts borders size from provided styles. + * + * @param {CSSStyleDeclaration} styles + * @param {...string} positions - Borders positions (top, right, ...) + * @returns {number} + */ + function getBordersSize(styles) { + var positions = []; + for (var _i = 1; _i < arguments.length; _i++) { + positions[_i - 1] = arguments[_i]; + } + return positions.reduce(function (size, position) { + var value = styles['border-' + position + '-width']; + return size + toFloat(value); + }, 0); + } + /** + * Extracts paddings sizes from provided styles. + * + * @param {CSSStyleDeclaration} styles + * @returns {Object} Paddings box. + */ + function getPaddings(styles) { + var positions = ['top', 'right', 'bottom', 'left']; + var paddings = {}; + for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) { + var position = positions_1[_i]; + var value = styles['padding-' + position]; + paddings[position] = toFloat(value); + } + return paddings; + } + /** + * Calculates content rectangle of provided SVG element. + * + * @param {SVGGraphicsElement} target - Element content rectangle of which needs + * to be calculated. + * @returns {DOMRectInit} + */ + function getSVGContentRect(target) { + var bbox = target.getBBox(); + return createRectInit(0, 0, bbox.width, bbox.height); + } + /** + * Calculates content rectangle of provided HTMLElement. + * + * @param {HTMLElement} target - Element for which to calculate the content rectangle. + * @returns {DOMRectInit} + */ + function getHTMLElementContentRect(target) { + // Client width & height properties can't be + // used exclusively as they provide rounded values. + var clientWidth = target.clientWidth, clientHeight = target.clientHeight; + // By this condition we can catch all non-replaced inline, hidden and + // detached elements. Though elements with width & height properties less + // than 0.5 will be discarded as well. + // + // Without it we would need to implement separate methods for each of + // those cases and it's not possible to perform a precise and performance + // effective test for hidden elements. E.g. even jQuery's ':visible' filter + // gives wrong results for elements with width & height less than 0.5. + if (!clientWidth && !clientHeight) { + return emptyRect; + } + var styles = getWindowOf(target).getComputedStyle(target); + var paddings = getPaddings(styles); + var horizPad = paddings.left + paddings.right; + var vertPad = paddings.top + paddings.bottom; + // Computed styles of width & height are being used because they are the + // only dimensions available to JS that contain non-rounded values. It could + // be possible to utilize the getBoundingClientRect if only it's data wasn't + // affected by CSS transformations let alone paddings, borders and scroll bars. + var width = toFloat(styles.width), height = toFloat(styles.height); + // Width & height include paddings and borders when the 'border-box' box + // model is applied (except for IE). + if (styles.boxSizing === 'border-box') { + // Following conditions are required to handle Internet Explorer which + // doesn't include paddings and borders to computed CSS dimensions. + // + // We can say that if CSS dimensions + paddings are equal to the "client" + // properties then it's either IE, and thus we don't need to subtract + // anything, or an element merely doesn't have paddings/borders styles. + if (Math.round(width + horizPad) !== clientWidth) { + width -= getBordersSize(styles, 'left', 'right') + horizPad; + } + if (Math.round(height + vertPad) !== clientHeight) { + height -= getBordersSize(styles, 'top', 'bottom') + vertPad; + } + } + // Following steps can't be applied to the document's root element as its + // client[Width/Height] properties represent viewport area of the window. + // Besides, it's as well not necessary as the itself neither has + // rendered scroll bars nor it can be clipped. + if (!isDocumentElement(target)) { + // In some browsers (only in Firefox, actually) CSS width & height + // include scroll bars size which can be removed at this step as scroll + // bars are the only difference between rounded dimensions + paddings + // and "client" properties, though that is not always true in Chrome. + var vertScrollbar = Math.round(width + horizPad) - clientWidth; + var horizScrollbar = Math.round(height + vertPad) - clientHeight; + // Chrome has a rather weird rounding of "client" properties. + // E.g. for an element with content width of 314.2px it sometimes gives + // the client width of 315px and for the width of 314.7px it may give + // 314px. And it doesn't happen all the time. So just ignore this delta + // as a non-relevant. + if (Math.abs(vertScrollbar) !== 1) { + width -= vertScrollbar; + } + if (Math.abs(horizScrollbar) !== 1) { + height -= horizScrollbar; + } + } + return createRectInit(paddings.left, paddings.top, width, height); + } + /** + * Checks whether provided element is an instance of the SVGGraphicsElement. + * + * @param {Element} target - Element to be checked. + * @returns {boolean} + */ + var isSVGGraphicsElement = (function () { + // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement + // interface. + if (typeof SVGGraphicsElement !== 'undefined') { + return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; }; + } + // If it's so, then check that element is at least an instance of the + // SVGElement and that it has the "getBBox" method. + // eslint-disable-next-line no-extra-parens + return function (target) { return (target instanceof getWindowOf(target).SVGElement && + typeof target.getBBox === 'function'); }; + })(); + /** + * Checks whether provided element is a document element (). + * + * @param {Element} target - Element to be checked. + * @returns {boolean} + */ + function isDocumentElement(target) { + return target === getWindowOf(target).document.documentElement; + } + /** + * Calculates an appropriate content rectangle for provided html or svg element. + * + * @param {Element} target - Element content rectangle of which needs to be calculated. + * @returns {DOMRectInit} + */ + function getContentRect(target) { + if (!isBrowser) { + return emptyRect; + } + if (isSVGGraphicsElement(target)) { + return getSVGContentRect(target); + } + return getHTMLElementContentRect(target); + } + /** + * Creates rectangle with an interface of the DOMRectReadOnly. + * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly + * + * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions. + * @returns {DOMRectReadOnly} + */ + function createReadOnlyRect(_a) { + var x = _a.x, y = _a.y, width = _a.width, height = _a.height; + // If DOMRectReadOnly is available use it as a prototype for the rectangle. + var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object; + var rect = Object.create(Constr.prototype); + // Rectangle's properties are not writable and non-enumerable. + defineConfigurable(rect, { + x: x, y: y, width: width, height: height, + top: y, + right: x + width, + bottom: height + y, + left: x + }); + return rect; + } + /** + * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates. + * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit + * + * @param {number} x - X coordinate. + * @param {number} y - Y coordinate. + * @param {number} width - Rectangle's width. + * @param {number} height - Rectangle's height. + * @returns {DOMRectInit} + */ + function createRectInit(x, y, width, height) { + return { x: x, y: y, width: width, height: height }; + } + + /** + * Class that is responsible for computations of the content rectangle of + * provided DOM element and for keeping track of it's changes. + */ + var ResizeObservation = /** @class */ (function () { + /** + * Creates an instance of ResizeObservation. + * + * @param {Element} target - Element to be observed. + */ + function ResizeObservation(target) { + /** + * Broadcasted width of content rectangle. + * + * @type {number} + */ + this.broadcastWidth = 0; + /** + * Broadcasted height of content rectangle. + * + * @type {number} + */ + this.broadcastHeight = 0; + /** + * Reference to the last observed content rectangle. + * + * @private {DOMRectInit} + */ + this.contentRect_ = createRectInit(0, 0, 0, 0); + this.target = target; + } + /** + * Updates content rectangle and tells whether it's width or height properties + * have changed since the last broadcast. + * + * @returns {boolean} + */ + ResizeObservation.prototype.isActive = function () { + var rect = getContentRect(this.target); + this.contentRect_ = rect; + return (rect.width !== this.broadcastWidth || + rect.height !== this.broadcastHeight); + }; + /** + * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data + * from the corresponding properties of the last observed content rectangle. + * + * @returns {DOMRectInit} Last observed content rectangle. + */ + ResizeObservation.prototype.broadcastRect = function () { + var rect = this.contentRect_; + this.broadcastWidth = rect.width; + this.broadcastHeight = rect.height; + return rect; + }; + return ResizeObservation; + }()); + + var ResizeObserverEntry = /** @class */ (function () { + /** + * Creates an instance of ResizeObserverEntry. + * + * @param {Element} target - Element that is being observed. + * @param {DOMRectInit} rectInit - Data of the element's content rectangle. + */ + function ResizeObserverEntry(target, rectInit) { + var contentRect = createReadOnlyRect(rectInit); + // According to the specification following properties are not writable + // and are also not enumerable in the native implementation. + // + // Property accessors are not being used as they'd require to define a + // private WeakMap storage which may cause memory leaks in browsers that + // don't support this type of collections. + defineConfigurable(this, { target: target, contentRect: contentRect }); + } + return ResizeObserverEntry; + }()); + + var ResizeObserverSPI = /** @class */ (function () { + /** + * Creates a new instance of ResizeObserver. + * + * @param {ResizeObserverCallback} callback - Callback function that is invoked + * when one of the observed elements changes it's content dimensions. + * @param {ResizeObserverController} controller - Controller instance which + * is responsible for the updates of observer. + * @param {ResizeObserver} callbackCtx - Reference to the public + * ResizeObserver instance which will be passed to callback function. + */ + function ResizeObserverSPI(callback, controller, callbackCtx) { + /** + * Collection of resize observations that have detected changes in dimensions + * of elements. + * + * @private {Array} + */ + this.activeObservations_ = []; + /** + * Registry of the ResizeObservation instances. + * + * @private {Map} + */ + this.observations_ = new MapShim(); + if (typeof callback !== 'function') { + throw new TypeError('The callback provided as parameter 1 is not a function.'); + } + this.callback_ = callback; + this.controller_ = controller; + this.callbackCtx_ = callbackCtx; + } + /** + * Starts observing provided element. + * + * @param {Element} target - Element to be observed. + * @returns {void} + */ + ResizeObserverSPI.prototype.observe = function (target) { + if (!arguments.length) { + throw new TypeError('1 argument required, but only 0 present.'); + } + // Do nothing if current environment doesn't have the Element interface. + if (typeof Element === 'undefined' || !(Element instanceof Object)) { + return; + } + if (!(target instanceof getWindowOf(target).Element)) { + throw new TypeError('parameter 1 is not of type "Element".'); + } + var observations = this.observations_; + // Do nothing if element is already being observed. + if (observations.has(target)) { + return; + } + observations.set(target, new ResizeObservation(target)); + this.controller_.addObserver(this); + // Force the update of observations. + this.controller_.refresh(); + }; + /** + * Stops observing provided element. + * + * @param {Element} target - Element to stop observing. + * @returns {void} + */ + ResizeObserverSPI.prototype.unobserve = function (target) { + if (!arguments.length) { + throw new TypeError('1 argument required, but only 0 present.'); + } + // Do nothing if current environment doesn't have the Element interface. + if (typeof Element === 'undefined' || !(Element instanceof Object)) { + return; + } + if (!(target instanceof getWindowOf(target).Element)) { + throw new TypeError('parameter 1 is not of type "Element".'); + } + var observations = this.observations_; + // Do nothing if element is not being observed. + if (!observations.has(target)) { + return; + } + observations.delete(target); + if (!observations.size) { + this.controller_.removeObserver(this); + } + }; + /** + * Stops observing all elements. + * + * @returns {void} + */ + ResizeObserverSPI.prototype.disconnect = function () { + this.clearActive(); + this.observations_.clear(); + this.controller_.removeObserver(this); + }; + /** + * Collects observation instances the associated element of which has changed + * it's content rectangle. + * + * @returns {void} + */ + ResizeObserverSPI.prototype.gatherActive = function () { + var _this = this; + this.clearActive(); + this.observations_.forEach(function (observation) { + if (observation.isActive()) { + _this.activeObservations_.push(observation); + } + }); + }; + /** + * Invokes initial callback function with a list of ResizeObserverEntry + * instances collected from active resize observations. + * + * @returns {void} + */ + ResizeObserverSPI.prototype.broadcastActive = function () { + // Do nothing if observer doesn't have active observations. + if (!this.hasActive()) { + return; + } + var ctx = this.callbackCtx_; + // Create ResizeObserverEntry instance for every active observation. + var entries = this.activeObservations_.map(function (observation) { + return new ResizeObserverEntry(observation.target, observation.broadcastRect()); + }); + this.callback_.call(ctx, entries, ctx); + this.clearActive(); + }; + /** + * Clears the collection of active observations. + * + * @returns {void} + */ + ResizeObserverSPI.prototype.clearActive = function () { + this.activeObservations_.splice(0); + }; + /** + * Tells whether observer has active observations. + * + * @returns {boolean} + */ + ResizeObserverSPI.prototype.hasActive = function () { + return this.activeObservations_.length > 0; + }; + return ResizeObserverSPI; + }()); + + // Registry of internal observers. If WeakMap is not available use current shim + // for the Map collection as it has all required methods and because WeakMap + // can't be fully polyfilled anyway. + var observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim(); + /** + * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation + * exposing only those methods and properties that are defined in the spec. + */ + var ResizeObserver = /** @class */ (function () { + /** + * Creates a new instance of ResizeObserver. + * + * @param {ResizeObserverCallback} callback - Callback that is invoked when + * dimensions of the observed elements change. + */ + function ResizeObserver(callback) { + if (!(this instanceof ResizeObserver)) { + throw new TypeError('Cannot call a class as a function.'); + } + if (!arguments.length) { + throw new TypeError('1 argument required, but only 0 present.'); + } + var controller = ResizeObserverController.getInstance(); + var observer = new ResizeObserverSPI(callback, controller, this); + observers.set(this, observer); + } + return ResizeObserver; + }()); + // Expose public methods of ResizeObserver. + [ + 'observe', + 'unobserve', + 'disconnect' + ].forEach(function (method) { + ResizeObserver.prototype[method] = function () { + var _a; + return (_a = observers.get(this))[method].apply(_a, arguments); + }; + }); + + var index = (function () { + // Export existing implementation if available. + if (typeof global$1.ResizeObserver !== 'undefined') { + return global$1.ResizeObserver; + } + return ResizeObserver; + })(); + + return index; + +}))); diff --git a/js/ResizeObserver.min.js b/js/ResizeObserver.min.js new file mode 100644 index 0000000..0e34645 --- /dev/null +++ b/js/ResizeObserver.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.ResizeObserver=e()}(this,function(){"use strict";var r=function(){if("undefined"!=typeof Map)return Map;function r(t,n){var r=-1;return t.some(function(t,e){return t[0]===n&&(r=e,!0)}),r}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(t){var e=r(this.__entries__,t),n=this.__entries__[e];return n&&n[1]},t.prototype.set=function(t,e){var n=r(this.__entries__,t);~n?this.__entries__[n][1]=e:this.__entries__.push([t,e])},t.prototype.delete=function(t){var e=this.__entries__,n=r(e,t);~n&&e.splice(n,1)},t.prototype.has=function(t){return!!~r(this.__entries__,t)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(t,e){void 0===e&&(e=null);for(var n=0,r=this.__entries__;n 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 ( hex.length < 6 ) { + for ( var i = 6 - hex.length - 1; i >= 0; 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 ( alpha != 100 ) { + 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/js/customize-controls.js b/js/customize-controls.js new file mode 100644 index 0000000..39d42f4 --- /dev/null +++ b/js/customize-controls.js @@ -0,0 +1,7 @@ +wp.customize.sectionConstructor['pressbook-button'] = wp.customize.Section.extend( { + // No events for this type of section. + attachEvents: function() {}, + + // Always make the section active. + isContextuallyActive: function() { return true; } +} ); diff --git a/js/customizer.js b/js/customizer.js new file mode 100644 index 0000000..4246094 --- /dev/null +++ b/js/customizer.js @@ -0,0 +1,77 @@ +/* global wp, jQuery */ +/** + * File customizer.js. + * + * Theme Customizer enhancements for a better user experience. + * + * Contains handlers to make Theme Customizer preview reload changes asynchronously. + */ + +( function( $ ) { + // Site title. + wp.customize( 'blogname', function( value ) { + value.bind( function( to ) { + $( '.site-title > a' ).text( to ); + } ); + } ); + + // Site tagline. + wp.customize( 'blogdescription', function( value ) { + value.bind( function( to ) { + $( '.site-tagline' ).text( to ); + } ); + } ); + + // Theme CSS output. + var pressbook_css_output, pressbook_prop_value; + + $.each( pressbook.styles, function( key, rules ) { + + wp.customize( 'set_styles[' + key + ']', function( value ) { + + value.bind( function( to ) { + if ( ! $( 'style#pressbook-styles-' + key ).length ) { + $( '' ).insertAfter( '#' + pressbook.handle_id ); + } + + pressbook_css_output = ''; + + $.each( rules, function( selector, values ) { + + $.each( values, function( prop_key, prop_value ) { + if ( prop_value.remove && prop_value.remove.length ) { + $.each( prop_value.remove, function( remove_style_key, remove_style_id ) { + $( 'style#pressbook-styles-' + remove_style_id ).remove(); + } ); + } + + if ( 'header_bg_position' === key ) { + to = to.replaceAll( '-', ' ' ); + } + + pressbook_prop_value = prop_value.place.replaceAll( '_PLACE', to ); + + if ( prop_value.extra && ! $.isEmptyObject( prop_value.extra ) ) { + $.each( prop_value.extra, function( extra_place_key, extra_place ) { + pressbook_prop_value = pressbook_prop_value.replaceAll( extra_place, wp.customize( 'set_styles[' + extra_place_key + ']' ).get() ); + } ); + } + + pressbook_css_output += ( selector + '{' ); + + pressbook_css_output += ( prop_key + ':' + pressbook_prop_value + ';' ); + + pressbook_css_output += '}'; + } ); + + } ); + + $( 'style#pressbook-styles-' + key ).html( pressbook_css_output ); + + } ); + + } ); + + } ); + +}( jQuery ) ); diff --git a/js/script.js b/js/script.js new file mode 100644 index 0000000..eb94f1a --- /dev/null +++ b/js/script.js @@ -0,0 +1,528 @@ +// Namespace. +var pressbook = pressbook || {}; + +/** + * Is the DOM ready? + * + * This implementation is coming from https://gomakethings.com/a-native-javascript-equivalent-of-jquerys-ready-method/ + * + * @param {Function} fn Callback function to run. + */ +function pressbookDomReady( fn ) { + if ( typeof fn !== 'function' ) { + return; + } + + if ( 'interactive' === document.readyState || 'complete' === document.readyState ) { + return fn(); + } + + document.addEventListener( 'DOMContentLoaded', fn, false ); +} + +// Animation curves. +Math.easeInOutQuad = function ( t, b, c, d ) { + t /= d / 2; + if ( t < 1 ) return c / 2 * t * t + b; + t--; + return - c / 2 * ( t* ( t-2 ) - 1 ) + b; +}; + +// Setup main menu. +pressbook.setupMainMenu = { + + init: function() { + const mainNav = document.getElementById( 'site-navigation' ); + if ( mainNav ) { + + const menu = mainNav.getElementsByTagName( 'ul' )[ 0 ] + const toggle = mainNav.querySelector( '.primary-menu-toggle' ); + + // Hide menu toggle button if menu is empty and return early. + if ( 'undefined' === typeof menu ) { + if ( toggle ) { + toggle.style.display = 'none'; + } + + return; + } + + // Add class 'nav-menu' to the menu. + menu.classList.add( 'nav-menu' ); + + const arrows = mainNav.querySelectorAll( '.main-navigation-arrow-btn' ); + const links = mainNav.querySelectorAll( 'li > a' ); + const linksWithoutChildren = mainNav.querySelectorAll( 'li:not(.menu-item-has-children) > a' ); + const lastLinksWithoutChildren = mainNav.querySelectorAll( 'li:last-child:not(.menu-item-has-children) > a' ); + const searchMenu = mainNav.querySelector( '.primary-menu-search' ); + const searchToggle = mainNav.querySelector( '.primary-menu-search-toggle' ); + + // Add class if touch screen device. + this.toggleTouchClass( mainNav ); + + // Toggle navigation when the user clicks the menu toggle button. + this.toggleNavigation( toggle, mainNav ); + + // Collapse menu when the user clicks outside the navigation. + this.collapseIfClickOutside( toggle, mainNav ); + + // Collapse menu when the user presses the escape key. + this.collapseIfEscapeKeyPress( toggle, mainNav ); + + // Collapse menu when the user resizes the window. + this.collapseOnResize( toggle, mainNav ); + + // Toggle sub-menu. + this.toggleSubmenu( arrows, links, linksWithoutChildren, lastLinksWithoutChildren ); + + // Trap focus in modal. + this.trapFocusInModal( mainNav ); + + // Toggle search form. + this.toggleSearch( searchToggle, searchMenu ); + + // Trap focus in search. + this.trapFocusInSearch( searchMenu ); + } + }, + + toggleTouchClass: function( nav ) { + const touchClass = 'main-navigation--touch'; + if ( isTouchDevice() ) { + nav.classList.add( touchClass ); + } + + window.addEventListener( 'resize', function() { + if ( isTouchDevice() ) { + nav.classList.add( touchClass ); + } else { + nav.classList.remove( touchClass ); + } + } ); + + function isTouchDevice() { + return ( ( 'ontouchstart' in window ) || ( navigator.maxTouchPoints > 0 ) || ( navigator.msMaxTouchPoints > 0 ) ); + } + }, + + toggleNavigation: function( button, nav ) { + if ( ! button ) { + return; + } + + button.addEventListener( 'click', function( event ) { + event.preventDefault(); + + nav.classList.toggle( 'toggled' ); + + if ( button ) { + if ( 'true' === button.getAttribute( 'aria-expanded' ) ) { + button.setAttribute( 'aria-expanded', 'false' ); + } else { + button.setAttribute( 'aria-expanded', 'true' ); + } + } + } ); + }, + + collapseIfClickOutside: function( button, nav ) { + const that = this; + document.addEventListener( 'click', function( event ) { + const isClickInside = nav.contains( event.target ); + + if ( ! isClickInside ) { + nav.classList.remove( 'toggled' ); + + if ( button ) { + button.setAttribute( 'aria-expanded', 'false' ); + } + + // Remove all the focus classes in the ul. + [].forEach.call( nav.querySelectorAll( '.focus' ), function( li ) { + li.classList.remove( 'focus' ); + } ); + + // Set aria-expanded to false. + [].forEach.call( nav.querySelectorAll( '.main-navigation-arrow-btn' ), function( button ) { + button.setAttribute( 'aria-expanded', 'false' ); + } ); + + // Collapse search form. + that.collapseSearchForm( nav ); + } + } ); + }, + + collapseIfEscapeKeyPress: function( button, nav ) { + const that = this; + document.addEventListener( 'keyup', function( event ) { + if ( 'Escape' === event.key ) { + nav.classList.remove( 'toggled' ); + + if ( button ) { + button.setAttribute( 'aria-expanded', 'false' ); + } + + // Collapse search form. + that.collapseSearchForm( nav ); + } + } ); + }, + + collapseOnResize: function( button, nav ) { + window.addEventListener( 'resize', function() { + if ( window.matchMedia( 'screen and (min-width: 768px)' ).matches ) { + nav.classList.remove( 'toggled' ); + + if ( button ) { + button.setAttribute( 'aria-expanded', 'false' ); + } + } + } ); + }, + + toggleSubmenu: function( arrows, links, linksWithoutChildren, lastLinksWithoutChildren ) { + [].forEach.call( arrows, function( arrow ) { + arrow.addEventListener( 'click', toggleFocus ); + arrow.addEventListener( 'keydown', toggleSubmenuWithArrow ); + } ); + + [].forEach.call( links, function( link ) { + link.addEventListener( 'focus', closeSubmenuWithLink ); + } ); + + [].forEach.call( linksWithoutChildren, function( link ) { + link.addEventListener( 'focus', openSubmenuWithLink ); + } ); + + [].forEach.call( lastLinksWithoutChildren, function( link ) { + link.addEventListener( 'keydown', closePreviousWithLink ); + } ); + + function toggleFocus() { + var self = this, + addFocusEl = false; // Add focus class to this element. + + // Move up through the ancestors of the current arrow button until we hit ul. + while ( 'ul' !== self.tagName.toLowerCase() ) { + + // If we hit the first li, then save it in addFocusEl if it does not contain the focus class. + if ( 'li' === self.tagName.toLowerCase() && ! addFocusEl ) { + if ( ! self.classList.contains( 'focus' ) ) { + addFocusEl = self; + } + } + + self = self.parentElement; + } + + // Remove all the focus classes in the ul. + [].forEach.call( self.querySelectorAll( '.focus' ), function( li ) { + li.classList.remove( 'focus' ); + } ); + + // Set aria-expanded to false. + [].forEach.call( self.querySelectorAll( '.main-navigation-arrow-btn' ), function( button ) { + button.setAttribute( 'aria-expanded', 'false' ); + } ); + + if ( addFocusEl ) { + // Add focus class to addFocusEl. + addFocusEl.classList.add( 'focus' ); + + // Set aria-expanded to true. + this.setAttribute( 'aria-expanded', 'true' ); + } + } + + function toggleSubmenuWithArrow( event ) { + const parentEl = this.parentElement, + tabKey = ( 'Tab' === event.key ), + shiftKey = event.shiftKey; + + if ( tabKey && shiftKey && parentEl.classList.contains( 'focus' ) ) { + parentEl.classList.remove( 'focus' ); + this.setAttribute( 'aria-expanded', 'false' ); + } else if ( tabKey && ! shiftKey && ! parentEl.classList.contains( 'focus' ) ) { + parentEl.classList.add( 'focus' ); + this.setAttribute( 'aria-expanded', 'true' ); + } + } + + function closeSubmenuWithLink() { + var self = this, + previousClosed = false; + + // Move up through the ancestors of the current link until we hit .nav-menu. + while ( ! self.classList.contains( 'nav-menu' ) ) { + + // Close previous sub-menus before opening next. + if ( ! previousClosed && ( 'ul' === self.tagName.toLowerCase() ) ) { + // Remove all the focus classes in the ul. + [].forEach.call( self.querySelectorAll( '.focus' ), function( li ) { + li.classList.remove( 'focus' ); + } ); + + // Set aria-expanded to false. + [].forEach.call( self.querySelectorAll( '.main-navigation-arrow-btn' ), function( button ) { + button.setAttribute( 'aria-expanded', 'false' ); + } ); + + previousClosed = true; + } + + self = self.parentElement; + } + } + + function openSubmenuWithLink() { + var self = this, + arrow; + + // Move up through the ancestors of the current link until we hit .nav-menu. + while ( ! self.classList.contains( 'nav-menu' ) ) { + + // On li elements add the class .focus and set aria-expanded to true. + if ( 'li' === self.tagName.toLowerCase() && ! self.classList.contains( 'focus' ) ) { + self.classList.add( 'focus' ); + + arrow = self.querySelector( '.main-navigation-arrow-btn' ); + if ( arrow ) { + this.setAttribute( 'aria-expanded', 'true' ); + } + } + + self = self.parentElement; + } + } + + function closePreviousWithLink( event ) { + var self = this, + nextEl = false, + tabKey = ( 'Tab' === event.key ), + shiftKey = event.shiftKey; + + if ( tabKey && ! shiftKey ) { + // Move up through the ancestors of the current link until there is sibling li. + do { + nextEl = ( function( element ) { + do { + element = element.nextSibling; + } while ( element && ( 1 !== element.nodeType ) ); + + return element; + } ) ( self ); + + self = self.parentElement; + } while ( ! nextEl ); + + // Remove all the focus classes in the li. + [].forEach.call( self.querySelectorAll( '.focus' ), function( li ) { + li.classList.remove( 'focus' ); + } ); + + // Set aria-expanded to false. + [].forEach.call( self.querySelectorAll( '.main-navigation-arrow-btn' ), function( button ) { + button.setAttribute( 'aria-expanded', 'false' ); + } ); + } + } + }, + + trapFocusInModal: function( nav ) { + document.addEventListener( 'keydown', function( event ) { + if ( ! nav.classList.contains( 'toggled' ) ) { + return; + } + + const elements = nav.querySelectorAll( 'input, a, button' ); + + if ( elements.length < 1 ) { + return; + } + + const firstEl = elements[ 0 ], + lastEl = elements[ elements.length - 1 ], + activeEl = document.activeElement, + tabKey = ( 'Tab' === event.key ), + shiftKey = event.shiftKey; + + if ( tabKey && ! shiftKey && lastEl === activeEl ) { + event.preventDefault(); + firstEl.focus(); + } + + if ( tabKey && shiftKey && firstEl === activeEl ) { + event.preventDefault(); + lastEl.focus(); + } + } ); + }, + + toggleSearch: function( toggle, search ) { + if ( ! toggle || ! search ) { + return; + } + + toggle.addEventListener( 'click', function( event ) { + event.preventDefault(); + + search.classList.toggle( 'toggled' ); + + if ( 'true' === toggle.getAttribute( 'aria-expanded' ) ) { + toggle.setAttribute( 'aria-expanded', 'false' ); + } else { + toggle.setAttribute( 'aria-expanded', 'true' ); + } + } ); + }, + + collapseSearchForm: function( nav ) { + const search = nav.querySelector( '.primary-menu-search' ); + const toggle = nav.querySelector( '.primary-menu-search-toggle' ); + + if ( search ) { + search.classList.remove( 'toggled' ); + } + + if ( toggle ) { + toggle.setAttribute( 'aria-expanded', 'false' ); + } + }, + + trapFocusInSearch: function( search ) { + document.addEventListener( 'keydown', function( event ) { + if ( ! search || ! search.classList.contains( 'toggled' ) ) { + return; + } + + const toggle = search.querySelector( '.primary-menu-search-toggle' ); + + if ( 'none' === window.getComputedStyle( toggle, null ).display ) { + return; + } + + const elements = search.querySelectorAll( 'input, a, button' ); + + if ( elements.length < 1 ) { + return; + } + + const firstEl = elements[ 0 ], + lastEl = elements[ elements.length - 1 ], + activeEl = document.activeElement, + tabKey = ( 'Tab' === event.key ), + shiftKey = event.shiftKey; + + if ( tabKey && ! shiftKey && lastEl === activeEl ) { + event.preventDefault(); + firstEl.focus(); + } + + if ( tabKey && shiftKey && firstEl === activeEl ) { + event.preventDefault(); + lastEl.focus(); + } + } ); + }, + +}; // pressbook.setupMainMenu + +// Go to top. +pressbook.goToTop = { + + offset: 300, + offsetOpacity: 1200, + scrollDuration: 700, + + init: function() { + const goToTop = document.querySelector( '.go-to-top' ); + if ( goToTop ) { + this.handleScroll( goToTop ); + this.handleClick( goToTop ); + } + }, + + handleScroll: function( goToTop ) { + var offset = this.offset, + offsetOpacity = this.offsetOpacity, + scrolling = false; + + window.addEventListener( 'scroll', function() { + if ( ! scrolling ) { + scrolling = true; + if ( ! window.requestAnimationFrame ) { + setTimeout( toggleOnChangeOffset, 250 ); + } else { + window.requestAnimationFrame( toggleOnChangeOffset ); + } + } + } ); + + function toggleOnChangeOffset() { + var windowTop = window.scrollY || document.documentElement.scrollTop; + + if ( windowTop > offset ) { + goToTop.classList.add( 'go-to-top--show' ) + } else { + goToTop.classList.remove( 'go-to-top--show' ); + goToTop.classList.remove( 'go-to-top--fade-out' ); + } + + if ( windowTop > offsetOpacity ) { + goToTop.classList.add( 'go-to-top--fade-out' ); + } + + scrolling = false; + }; + }, + + handleClick: function( goToTop ) { + goToTop.addEventListener( 'click', function( event ) { + event.preventDefault(); + + if ( ! window.requestAnimationFrame ) { + window.scrollTo( 0, 0 ) + } else { + scrollTo( 0, this.scrollDuration ); + } + + goToTop.blur(); + }.bind( this ) ); + + // Smooth scroll. + function scrollTo( final, duration, cb ) { + var start = window.scrollY || document.documentElement.scrollTop, + currentTime = null; + + var animateScroll = function( timestamp ) { + if ( ! currentTime ) { + currentTime = timestamp; + } + + var progress = timestamp - currentTime; + + if ( progress > duration ) { + progress = duration; + } + + var val = Math.easeInOutQuad( progress, start, final - start, duration ); + + window.scrollTo( 0, val ); + if ( progress < duration ) { + window.requestAnimationFrame( animateScroll ); + } else { + cb && cb(); + } + }; + + window.requestAnimationFrame( animateScroll ); + }; + } + +}; // pressbook.goToTop + +pressbookDomReady( function() { + pressbook.setupMainMenu.init(); // Setup main menu. + pressbook.goToTop.init(); // Setup go to top. +} ); diff --git a/js/script.min.js b/js/script.min.js new file mode 100644 index 0000000..0b47453 --- /dev/null +++ b/js/script.min.js @@ -0,0 +1 @@ +var pressbook=pressbook||{};function pressbookDomReady(e){if("function"==typeof e)return"interactive"===document.readyState||"complete"===document.readyState?e():void document.addEventListener("DOMContentLoaded",e,!1)}Math.easeInOutQuad=function(e,t,n,a){return(e/=a/2)<1?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t},pressbook.setupMainMenu={init:function(){var e,t,n,a,o,i,s,r=document.getElementById("site-navigation");r&&(t=r.getElementsByTagName("ul")[0],e=r.querySelector(".primary-menu-toggle"),void 0===t?e&&(e.style.display="none"):(t.classList.add("nav-menu"),t=r.querySelectorAll(".main-navigation-arrow-btn"),n=r.querySelectorAll("li > a"),a=r.querySelectorAll("li:not(.menu-item-has-children) > a"),o=r.querySelectorAll("li:last-child:not(.menu-item-has-children) > a"),i=r.querySelector(".primary-menu-search"),s=r.querySelector(".primary-menu-search-toggle"),this.toggleTouchClass(r),this.toggleNavigation(e,r),this.collapseIfClickOutside(e,r),this.collapseIfEscapeKeyPress(e,r),this.collapseOnResize(e,r),this.toggleSubmenu(t,n,a,o),this.trapFocusInModal(r),this.toggleSearch(s,i),this.trapFocusInSearch(i)))},toggleTouchClass:function(e){const t="main-navigation--touch";function n(){return"ontouchstart"in window||0 + * @license The MIT License (MIT) + */ + var StickySidebar = function () { + + // --------------------------------- + // # Define Constants + // --------------------------------- + // + var EVENT_KEY = '.stickySidebar'; + var DEFAULTS = { + /** + * Additional top spacing of the element when it becomes sticky. + * @type {Numeric|Function} + */ + topSpacing: 0, + + /** + * Additional bottom spacing of the element when it becomes sticky. + * @type {Numeric|Function} + */ + bottomSpacing: 0, + + /** + * Container sidebar selector to know what the beginning and end of sticky element. + * @type {String|False} + */ + containerSelector: false, + + /** + * Parent element where the scrolling happens. + */ + scrollContainer: false, + + /** + * Inner wrapper selector. + * @type {String} + */ + innerWrapperSelector: '.inner-wrapper-sticky', + + /** + * The name of CSS class to apply to elements when they have become stuck. + * @type {String|False} + */ + stickyClass: 'is-affixed', + + /** + * Detect when sidebar and its container change height so re-calculate their dimensions. + * @type {Boolean} + */ + resizeSensor: true, + + /** + * The sidebar returns to its normal position if its width below this value. + * @type {Numeric} + */ + minWidth: false + }; + + // --------------------------------- + // # Class Definition + // --------------------------------- + // + /** + * Sticky Sidebar Class. + * @public + */ + + var StickySidebar = function () { + + /** + * Sticky Sidebar Constructor. + * @constructor + * @param {HTMLElement|String} sidebar - The sidebar element or sidebar selector. + * @param {Object} options - The options of sticky sidebar. + */ + function StickySidebar(sidebar) { + var _this = this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, StickySidebar); + + this.options = StickySidebar.extend(DEFAULTS, options); + + // Sidebar element query if there's no one, throw error. + this.sidebar = 'string' === typeof sidebar ? document.querySelector(sidebar) : sidebar; + if ('undefined' === typeof this.sidebar) throw new Error("There is no specific sidebar element."); + + this.sidebarInner = false; + this.container = this.sidebar.parentElement; + + // Current Affix Type of sidebar element. + this.affixedType = 'STATIC'; + this.direction = 'down'; + this.support = { + transform: false, + transform3d: false + }; + + this._initialized = false; + this._reStyle = false; + this._breakpoint = false; + + // Dimensions of sidebar, container and screen viewport. + this.dimensions = { + translateY: 0, + maxTranslateY: 0, + topSpacing: 0, + lastTopSpacing: 0, + bottomSpacing: 0, + lastBottomSpacing: 0, + sidebarHeight: 0, + sidebarWidth: 0, + containerTop: 0, + containerHeight: 0, + viewportHeight: 0, + viewportTop: 0, + lastViewportTop: 0 + }; + + // Bind event handlers for referencability. + ['handleEvent'].forEach(function (method) { + _this[method] = _this[method].bind(_this); + }); + + // Initialize sticky sidebar for first time. + this.initialize(); + } + + /** + * Initializes the sticky sidebar by adding inner wrapper, define its container, + * min-width breakpoint, calculating dimensions, adding helper classes and inline style. + * @private + */ + + + _createClass(StickySidebar, [{ + key: 'initialize', + value: function initialize() { + var _this2 = this; + + this._setSupportFeatures(); + + // Get sticky sidebar inner wrapper, if not found, will create one. + if (this.options.innerWrapperSelector) { + this.sidebarInner = this.sidebar.querySelector(this.options.innerWrapperSelector); + + if (null === this.sidebarInner) this.sidebarInner = false; + } + + if (!this.sidebarInner) { + var wrapper = document.createElement('div'); + wrapper.setAttribute('class', 'inner-wrapper-sticky'); + this.sidebar.appendChild(wrapper); + + while (this.sidebar.firstChild != wrapper) { + wrapper.appendChild(this.sidebar.firstChild); + }this.sidebarInner = this.sidebar.querySelector('.inner-wrapper-sticky'); + } + + // Container wrapper of the sidebar. + if (this.options.containerSelector) { + var containers = document.querySelectorAll(this.options.containerSelector); + containers = Array.prototype.slice.call(containers); + + containers.forEach(function (container, item) { + if (!container.contains(_this2.sidebar)) return; + _this2.container = container; + }); + + if (!containers.length) throw new Error("The container does not contains on the sidebar."); + } + + // Get scroll container, if provided + this.scrollContainer = this.options.scrollContainer ? document.querySelector(this.options.scrollContainer) : undefined; + + // If top/bottom spacing is not function parse value to integer. + if ('function' !== typeof this.options.topSpacing) this.options.topSpacing = parseInt(this.options.topSpacing) || 0; + + if ('function' !== typeof this.options.bottomSpacing) this.options.bottomSpacing = parseInt(this.options.bottomSpacing) || 0; + + // Breakdown sticky sidebar if screen width below `options.minWidth`. + this._widthBreakpoint(); + + // Calculate dimensions of sidebar, container and viewport. + this.calcDimensions(); + + // Affix sidebar in proper position. + this.stickyPosition(); + + // Bind all events. + this.bindEvents(); + + // Inform other properties the sticky sidebar is initialized. + this._initialized = true; + } + }, { + key: 'bindEvents', + value: function bindEvents() { + this.eventTarget = this.scrollContainer ? this.scrollContainer : window; + + this.eventTarget.addEventListener('resize', this, { passive: true, capture: false }); + this.eventTarget.addEventListener('scroll', this, { passive: true, capture: false }); + + this.sidebar.addEventListener('update' + EVENT_KEY, this); + + if (this.options.resizeSensor && 'undefined' !== typeof ResizeSensor) { + new ResizeSensor(this.sidebarInner, this.handleEvent); + new ResizeSensor(this.container, this.handleEvent); + } + } + }, { + key: 'handleEvent', + value: function handleEvent(event) { + this.updateSticky(event); + } + }, { + key: 'calcDimensions', + value: function calcDimensions() { + if (this._breakpoint) return; + var dims = this.dimensions; + + // Container of sticky sidebar dimensions. + dims.containerTop = StickySidebar.offsetRelative(this.container).top; + dims.containerHeight = this.container.clientHeight; + dims.containerBottom = dims.containerTop + dims.containerHeight; + + // Sidebar dimensions. + dims.sidebarHeight = this.sidebarInner.offsetHeight; + dims.sidebarWidth = this.sidebarInner.offsetWidth; + + // Screen viewport dimensions. + dims.viewportHeight = window.innerHeight; + + // Maximum sidebar translate Y. + dims.maxTranslateY = dims.containerHeight - dims.sidebarHeight; + + this._calcDimensionsWithScroll(); + } + }, { + key: '_calcDimensionsWithScroll', + value: function _calcDimensionsWithScroll() { + var dims = this.dimensions; + + dims.sidebarLeft = StickySidebar.offsetRelative(this.sidebar).left; + + if (this.scrollContainer) { + dims.viewportTop = this.scrollContainer.scrollTop; + dims.viewportLeft = this.scrollContainer.scrollLeft; + } else { + dims.viewportTop = document.documentElement.scrollTop || document.body.scrollTop; + dims.viewportLeft = document.documentElement.scrollLeft || document.body.scrollLeft; + } + dims.viewportBottom = dims.viewportTop + dims.viewportHeight; + + dims.topSpacing = this.options.topSpacing; + dims.bottomSpacing = this.options.bottomSpacing; + + if ('function' === typeof dims.topSpacing) dims.topSpacing = parseInt(dims.topSpacing(this.sidebar)) || 0; + + if ('function' === typeof dims.bottomSpacing) dims.bottomSpacing = parseInt(dims.bottomSpacing(this.sidebar)) || 0; + + if ('VIEWPORT-TOP' === this.affixedType) { + // Adjust translate Y in the case decrease top spacing value. + if (dims.topSpacing < dims.lastTopSpacing) { + dims.translateY += dims.lastTopSpacing - dims.topSpacing; + this._reStyle = true; + } + } else if ('VIEWPORT-BOTTOM' === this.affixedType) { + // Adjust translate Y in the case decrease bottom spacing value. + if (dims.bottomSpacing < dims.lastBottomSpacing) { + dims.translateY += dims.lastBottomSpacing - dims.bottomSpacing; + this._reStyle = true; + } + } + + dims.lastTopSpacing = dims.topSpacing; + dims.lastBottomSpacing = dims.bottomSpacing; + } + }, { + key: 'isSidebarFitsViewport', + value: function isSidebarFitsViewport() { + var dims = this.dimensions; + var offset = this.scrollDirection === 'down' ? dims.lastBottomSpacing : dims.lastTopSpacing; + return this.dimensions.sidebarHeight + offset < this.dimensions.viewportHeight; + } + }, { + key: 'observeScrollDir', + value: function observeScrollDir() { + var dims = this.dimensions; + if (dims.lastViewportTop === dims.viewportTop) return; + + var furthest = 'down' === this.direction ? Math.min : Math.max; + + // If the browser is scrolling not in the same direction. + if (dims.viewportTop === furthest(dims.viewportTop, dims.lastViewportTop)) this.direction = 'down' === this.direction ? 'up' : 'down'; + } + }, { + key: 'getAffixType', + value: function getAffixType() { + this._calcDimensionsWithScroll(); + var dims = this.dimensions; + var colliderTop = dims.viewportTop + dims.topSpacing; + var affixType = this.affixedType; + + if (colliderTop <= dims.containerTop || dims.containerHeight <= dims.sidebarHeight) { + dims.translateY = 0; + affixType = 'STATIC'; + } else { + affixType = 'up' === this.direction ? this._getAffixTypeScrollingUp() : this._getAffixTypeScrollingDown(); + } + + // Make sure the translate Y is not bigger than container height. + dims.translateY = Math.max(0, dims.translateY); + dims.translateY = Math.min(dims.containerHeight, dims.translateY); + dims.translateY = Math.round(dims.translateY); + + dims.lastViewportTop = dims.viewportTop; + return affixType; + } + }, { + key: '_getAffixTypeScrollingDown', + value: function _getAffixTypeScrollingDown() { + var dims = this.dimensions; + var sidebarBottom = dims.sidebarHeight + dims.containerTop; + var colliderTop = dims.viewportTop + dims.topSpacing; + var colliderBottom = dims.viewportBottom - dims.bottomSpacing; + var affixType = this.affixedType; + + if (this.isSidebarFitsViewport()) { + if (dims.sidebarHeight + colliderTop >= dims.containerBottom) { + dims.translateY = dims.containerBottom - sidebarBottom; + affixType = 'CONTAINER-BOTTOM'; + } else if (colliderTop >= dims.containerTop) { + dims.translateY = colliderTop - dims.containerTop; + affixType = 'VIEWPORT-TOP'; + } + } else { + if (dims.containerBottom <= colliderBottom) { + dims.translateY = dims.containerBottom - sidebarBottom; + affixType = 'CONTAINER-BOTTOM'; + } else if (sidebarBottom + dims.translateY <= colliderBottom) { + dims.translateY = colliderBottom - sidebarBottom; + affixType = 'VIEWPORT-BOTTOM'; + } else if (dims.containerTop + dims.translateY <= colliderTop && 0 !== dims.translateY && dims.maxTranslateY !== dims.translateY) { + affixType = 'VIEWPORT-UNBOTTOM'; + } + } + + return affixType; + } + }, { + key: '_getAffixTypeScrollingUp', + value: function _getAffixTypeScrollingUp() { + var dims = this.dimensions; + var sidebarBottom = dims.sidebarHeight + dims.containerTop; + var colliderTop = dims.viewportTop + dims.topSpacing; + var colliderBottom = dims.viewportBottom - dims.bottomSpacing; + var affixType = this.affixedType; + + if (colliderTop <= dims.translateY + dims.containerTop) { + dims.translateY = colliderTop - dims.containerTop; + affixType = 'VIEWPORT-TOP'; + } else if (dims.containerBottom <= colliderBottom) { + dims.translateY = dims.containerBottom - sidebarBottom; + affixType = 'CONTAINER-BOTTOM'; + } else if (!this.isSidebarFitsViewport()) { + + if (dims.containerTop <= colliderTop && 0 !== dims.translateY && dims.maxTranslateY !== dims.translateY) { + affixType = 'VIEWPORT-UNBOTTOM'; + } + } + + return affixType; + } + }, { + key: '_getStyle', + value: function _getStyle(affixType) { + if ('undefined' === typeof affixType) return; + + var style = { inner: {}, outer: {} }; + var dims = this.dimensions; + + switch (affixType) { + case 'VIEWPORT-TOP': + style.inner = { position: 'fixed', top: dims.topSpacing, + left: dims.sidebarLeft - dims.viewportLeft, width: dims.sidebarWidth }; + break; + case 'VIEWPORT-BOTTOM': + style.inner = { position: 'fixed', top: 'auto', left: dims.sidebarLeft, + bottom: dims.bottomSpacing, width: dims.sidebarWidth }; + break; + case 'CONTAINER-BOTTOM': + case 'VIEWPORT-UNBOTTOM': + var translate = this._getTranslate(0, dims.translateY + 'px'); + + if (translate) style.inner = { transform: translate };else style.inner = { position: 'absolute', top: dims.translateY, width: dims.sidebarWidth }; + break; + } + + switch (affixType) { + case 'VIEWPORT-TOP': + case 'VIEWPORT-BOTTOM': + case 'VIEWPORT-UNBOTTOM': + case 'CONTAINER-BOTTOM': + style.outer = { height: dims.sidebarHeight, position: 'relative' }; + break; + } + + style.outer = StickySidebar.extend({ height: '', position: '' }, style.outer); + style.inner = StickySidebar.extend({ position: 'relative', top: '', left: '', + bottom: '', width: '', transform: '' }, style.inner); + + return style; + } + }, { + key: 'stickyPosition', + value: function stickyPosition(force) { + if (this._breakpoint) return; + + force = this._reStyle || force || false; + + var offsetTop = this.options.topSpacing; + var offsetBottom = this.options.bottomSpacing; + + var affixType = this.getAffixType(); + var style = this._getStyle(affixType); + + if ((this.affixedType != affixType || force) && affixType) { + var affixEvent = 'affix.' + affixType.toLowerCase().replace('viewport-', '') + EVENT_KEY; + StickySidebar.eventTrigger(this.sidebar, affixEvent); + + if ('STATIC' === affixType) StickySidebar.removeClass(this.sidebar, this.options.stickyClass);else StickySidebar.addClass(this.sidebar, this.options.stickyClass); + + for (var key in style.outer) { + var unit = 'number' === typeof style.outer[key] ? 'px' : ''; + this.sidebar.style[key] = style.outer[key] + unit; + } + + for (var _key in style.inner) { + var _unit = 'number' === typeof style.inner[_key] ? 'px' : ''; + this.sidebarInner.style[_key] = style.inner[_key] + _unit; + } + + var affixedEvent = 'affixed.' + affixType.toLowerCase().replace('viewport-', '') + EVENT_KEY; + StickySidebar.eventTrigger(this.sidebar, affixedEvent); + } else { + if (this._initialized) this.sidebarInner.style.left = style.inner.left; + } + + this.affixedType = affixType; + } + }, { + key: '_widthBreakpoint', + value: function _widthBreakpoint() { + + if (window.innerWidth <= this.options.minWidth) { + this._breakpoint = true; + this.affixedType = 'STATIC'; + + this.sidebar.removeAttribute('style'); + StickySidebar.removeClass(this.sidebar, this.options.stickyClass); + this.sidebarInner.removeAttribute('style'); + } else { + this._breakpoint = false; + } + } + }, { + key: 'updateSticky', + value: function updateSticky() { + var _this3 = this; + + var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (this._running) return; + this._running = true; + + (function (eventType) { + requestAnimationFrame(function () { + switch (eventType) { + // When browser is scrolling and re-calculate just dimensions + // within scroll. + case 'scroll': + _this3._calcDimensionsWithScroll(); + _this3.observeScrollDir(); + _this3.stickyPosition(); + break; + + // When browser is resizing or there's no event, observe width + // breakpoint and re-calculate dimensions. + case 'resize': + default: + _this3._widthBreakpoint(); + _this3.calcDimensions(); + _this3.stickyPosition(true); + break; + } + _this3._running = false; + }); + })(event.type); + } + }, { + key: '_setSupportFeatures', + value: function _setSupportFeatures() { + var support = this.support; + + support.transform = StickySidebar.supportTransform(); + support.transform3d = StickySidebar.supportTransform(true); + } + }, { + key: '_getTranslate', + value: function _getTranslate() { + var y = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var x = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + + if (this.support.transform3d) return 'translate3d(' + y + ', ' + x + ', ' + z + ')';else if (this.support.translate) return 'translate(' + y + ', ' + x + ')';else return false; + } + }, { + key: 'destroy', + value: function destroy() { + window.removeEventListener('resize', this, { capture: false }); + window.removeEventListener('scroll', this, { capture: false }); + + this.sidebar.classList.remove(this.options.stickyClass); + this.sidebar.style.minHeight = ''; + + this.sidebar.removeEventListener('update' + EVENT_KEY, this); + + var styleReset = { inner: {}, outer: {} }; + + styleReset.inner = { position: '', top: '', left: '', bottom: '', width: '', transform: '' }; + styleReset.outer = { height: '', position: '' }; + + for (var key in styleReset.outer) { + this.sidebar.style[key] = styleReset.outer[key]; + }for (var _key2 in styleReset.inner) { + this.sidebarInner.style[_key2] = styleReset.inner[_key2]; + }if (this.options.resizeSensor && 'undefined' !== typeof ResizeSensor) { + ResizeSensor.detach(this.sidebarInner, this.handleEvent); + ResizeSensor.detach(this.container, this.handleEvent); + } + } + }], [{ + key: 'supportTransform', + value: function supportTransform(transform3d) { + var result = false, + property = transform3d ? 'perspective' : 'transform', + upper = property.charAt(0).toUpperCase() + property.slice(1), + prefixes = ['Webkit', 'Moz', 'O', 'ms'], + support = document.createElement('support'), + style = support.style; + + (property + ' ' + prefixes.join(upper + ' ') + upper).split(' ').forEach(function (property, i) { + if (style[property] !== undefined) { + result = property; + return false; + } + }); + return result; + } + }, { + key: 'eventTrigger', + value: function eventTrigger(element, eventName, data) { + try { + var event = new CustomEvent(eventName, { detail: data }); + } catch (e) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent(eventName, true, true, data); + } + element.dispatchEvent(event); + } + }, { + key: 'extend', + value: function extend(defaults, options) { + var results = {}; + for (var key in defaults) { + if ('undefined' !== typeof options[key]) results[key] = options[key];else results[key] = defaults[key]; + } + return results; + } + }, { + key: 'offsetRelative', + value: function offsetRelative(element) { + var result = { left: 0, top: 0 }; + + do { + var offsetTop = element.offsetTop; + var offsetLeft = element.offsetLeft; + + if (!isNaN(offsetTop)) result.top += offsetTop; + + if (!isNaN(offsetLeft)) result.left += offsetLeft; + + element = 'BODY' === element.tagName ? element.parentElement : element.offsetParent; + } while (element); + return result; + } + }, { + key: 'addClass', + value: function addClass(element, className) { + if (!StickySidebar.hasClass(element, className)) { + if (element.classList) element.classList.add(className);else element.className += ' ' + className; + } + } + }, { + key: 'removeClass', + value: function removeClass(element, className) { + if (StickySidebar.hasClass(element, className)) { + if (element.classList) element.classList.remove(className);else element.className = element.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); + } + } + }, { + key: 'hasClass', + value: function hasClass(element, className) { + if (element.classList) return element.classList.contains(className);else return new RegExp('(^| )' + className + '( |$)', 'gi').test(element.className); + } + }, { + key: 'defaults', + get: function () { + return DEFAULTS; + } + }]); + + return StickySidebar; + }(); + + return StickySidebar; + }(); + + exports.default = StickySidebar; + + + // Global + // ------------------------- + window.StickySidebar = StickySidebar; +}); +}); + +var stickySidebar$1 = unwrapExports(stickySidebar); + +exports['default'] = stickySidebar$1; +exports.__moduleExports = stickySidebar; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + +//# sourceMappingURL=sticky-sidebar.js.map diff --git a/js/sticky-sidebar.min.js b/js/sticky-sidebar.min.js new file mode 100644 index 0000000..9d42b6d --- /dev/null +++ b/js/sticky-sidebar.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).StickySidebar={})}(this,function(e){"use strict";var t,i,n=(function(e){!function(e){function s(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}Object.defineProperty(e,"__esModule",{value:true});var t=function(){function n(e,t){for(var i=0;i1&&arguments[1]!==undefined?arguments[1]:{};s(this,h);this.options=h.extend(n,i);this.sidebar="string"===typeof e?document.querySelector(e):e;if("undefined"===typeof this.sidebar)throw new Error("There is no specific sidebar element.");this.sidebarInner=false;this.container=this.sidebar.parentElement;this.affixedType="STATIC";this.direction="down";this.support={transform:false,transform3d:false};this._initialized=false;this._reStyle=false;this._breakpoint=false;this.dimensions={translateY:0,maxTranslateY:0,topSpacing:0,lastTopSpacing:0,bottomSpacing:0,lastBottomSpacing:0,sidebarHeight:0,sidebarWidth:0,containerTop:0,containerHeight:0,viewportHeight:0,viewportTop:0,lastViewportTop:0};["handleEvent"].forEach(function(e){t[e]=t[e].bind(t)});this.initialize()}t(h,[{key:"initialize",value:function e(){var i=this;this._setSupportFeatures();if(this.options.innerWrapperSelector){this.sidebarInner=this.sidebar.querySelector(this.options.innerWrapperSelector);if(null===this.sidebarInner)this.sidebarInner=false}if(!this.sidebarInner){var t=document.createElement("div");t.setAttribute("class","inner-wrapper-sticky");this.sidebar.appendChild(t);while(this.sidebar.firstChild!=t){t.appendChild(this.sidebar.firstChild)}this.sidebarInner=this.sidebar.querySelector(".inner-wrapper-sticky")}if(this.options.containerSelector){var n=document.querySelectorAll(this.options.containerSelector);n=Array.prototype.slice.call(n);n.forEach(function(e,t){if(!e.contains(i.sidebar))return;i.container=e});if(!n.length)throw new Error("The container does not contains on the sidebar.")}this.scrollContainer=this.options.scrollContainer?document.querySelector(this.options.scrollContainer):undefined;if("function"!==typeof this.options.topSpacing)this.options.topSpacing=parseInt(this.options.topSpacing)||0;if("function"!==typeof this.options.bottomSpacing)this.options.bottomSpacing=parseInt(this.options.bottomSpacing)||0;this._widthBreakpoint();this.calcDimensions();this.stickyPosition();this.bindEvents();this._initialized=true}},{key:"bindEvents",value:function e(){var t=this;this.eventTarget=this.scrollContainer?this.scrollContainer:window;this.eventTarget.addEventListener("resize",this,{passive:true,capture:false});this.eventTarget.addEventListener("scroll",this,{passive:true,capture:false});this.sidebar.addEventListener("update"+d,this);if("undefined"!==typeof ResizeObserver){var i=new ResizeObserver(function(){return t.handleEvent()});i.observe(this.sidebarInner);i.observe(this.container)}}},{key:"handleEvent",value:function e(t){this.updateSticky(t)}},{key:"calcDimensions",value:function e(){if(this._breakpoint)return;var t=this.dimensions;t.containerTop=h.offsetRelative(this.container).top;t.containerHeight=this.container.clientHeight;t.containerBottom=t.containerTop+t.containerHeight;t.sidebarHeight=this.sidebarInner.offsetHeight;t.sidebarWidth=this.sidebarInner.offsetWidth;t.viewportHeight=window.innerHeight;t.maxTranslateY=t.containerHeight-t.sidebarHeight;this._calcDimensionsWithScroll()}},{key:"_calcDimensionsWithScroll",value:function e(){var t=this.dimensions;t.sidebarLeft=h.offsetRelative(this.sidebar).left;if(this.scrollContainer){t.viewportTop=this.scrollContainer.scrollTop;t.viewportLeft=this.scrollContainer.scrollLeft}else{t.viewportTop=document.documentElement.scrollTop||document.body.scrollTop;t.viewportLeft=document.documentElement.scrollLeft||document.body.scrollLeft}t.viewportBottom=t.viewportTop+t.viewportHeight;t.topSpacing=this.options.topSpacing;t.bottomSpacing=this.options.bottomSpacing;if("function"===typeof t.topSpacing)t.topSpacing=parseInt(t.topSpacing(this.sidebar))||0;if("function"===typeof t.bottomSpacing)t.bottomSpacing=parseInt(t.bottomSpacing(this.sidebar))||0;if("VIEWPORT-TOP"===this.affixedType){if(t.topSpacing=t.containerBottom){t.translateY=t.containerBottom-i;r="CONTAINER-BOTTOM"}else if(n>=t.containerTop){t.translateY=n-t.containerTop;r="VIEWPORT-TOP"}}else{if(t.containerBottom<=s){t.translateY=t.containerBottom-i;r="CONTAINER-BOTTOM"}else if(i+t.translateY<=s){t.translateY=s-i;r="VIEWPORT-BOTTOM"}else if(t.containerTop+t.translateY<=n&&0!==t.translateY&&t.maxTranslateY!==t.translateY){r="VIEWPORT-UNBOTTOM"}}return r}},{key:"_getAffixTypeScrollingUp",value:function e(){var t=this.dimensions;var i=t.sidebarHeight+t.containerTop;var n=t.viewportTop+t.topSpacing;var s=t.viewportBottom-t.bottomSpacing;var r=this.affixedType;if(n<=t.translateY+t.containerTop){t.translateY=n-t.containerTop;r="VIEWPORT-TOP"}else if(t.containerBottom<=s){t.translateY=t.containerBottom-i;r="CONTAINER-BOTTOM"}else if(!this.isSidebarFitsViewport()){if(t.containerTop<=n&&0!==t.translateY&&t.maxTranslateY!==t.translateY){r="VIEWPORT-UNBOTTOM"}}return r}},{key:"_getStyle",value:function e(t){if("undefined"===typeof t)return;var i={inner:{},outer:{}};var n=this.dimensions;switch(t){case"VIEWPORT-TOP":i.inner={position:"fixed",top:n.topSpacing,left:n.sidebarLeft-n.viewportLeft,width:n.sidebarWidth};break;case"VIEWPORT-BOTTOM":i.inner={position:"fixed",top:"auto",left:n.sidebarLeft,bottom:n.bottomSpacing,width:n.sidebarWidth};break;case"CONTAINER-BOTTOM":case"VIEWPORT-UNBOTTOM":var s=this._getTranslate(0,n.translateY+"px");if(s)i.inner={transform:s};else i.inner={position:"absolute",top:n.translateY,width:n.sidebarWidth};break}switch(t){case"VIEWPORT-TOP":case"VIEWPORT-BOTTOM":case"VIEWPORT-UNBOTTOM":case"CONTAINER-BOTTOM":i.outer={height:n.sidebarHeight,position:"relative"};break}i.outer=h.extend({height:"",position:""},i.outer);i.inner=h.extend({position:"relative",top:"",left:"",bottom:"",width:"",transform:""},i.inner);return i}},{key:"stickyPosition",value:function e(t){if(this._breakpoint)return;t=this._reStyle||t||false;var i=this.options.topSpacing;var n=this.options.bottomSpacing;var s=this.getAffixType();var r=this._getStyle(s);if((this.affixedType!=s||t)&&s){var o="affix."+s.toLowerCase().replace("viewport-","")+d;h.eventTrigger(this.sidebar,o);if("STATIC"===s)h.removeClass(this.sidebar,this.options.stickyClass);else h.addClass(this.sidebar,this.options.stickyClass);for(var a in r.outer){var l="number"===typeof r.outer[a]?"px":"";this.sidebar.style[a]=r.outer[a]+l}for(var p in r.inner){var c="number"===typeof r.inner[p]?"px":"";this.sidebarInner.style[p]=r.inner[p]+c}var f="affixed."+s.toLowerCase().replace("viewport-","")+d;h.eventTrigger(this.sidebar,f)}else{if(this._initialized)this.sidebarInner.style.left=r.inner.left}this.affixedType=s}},{key:"_widthBreakpoint",value:function e(){if(window.innerWidth<=this.options.minWidth){this._breakpoint=true;this.affixedType="STATIC";this.sidebar.removeAttribute("style");h.removeClass(this.sidebar,this.options.stickyClass);this.sidebarInner.removeAttribute("style")}else{this._breakpoint=false}}},{key:"updateSticky",value:function e(){var t=this;var i=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};if(this._running)return;this._running=true;(function(e){requestAnimationFrame(function(){switch(e){case"scroll":t._calcDimensionsWithScroll();t.observeScrollDir();t.stickyPosition();break;case"resize":default:t._widthBreakpoint();t.calcDimensions();t.stickyPosition(true);break}t._running=false})})(i.type)}},{key:"_setSupportFeatures",value:function e(){var t=this.support;t.transform=h.supportTransform();t.transform3d=h.supportTransform(true)}},{key:"_getTranslate",value:function e(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0;var i=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:0;if(this.support.transform3d)return"translate3d("+t+", "+i+", "+n+")";else if(this.support.translate)return"translate("+t+", "+i+")";else return false}},{key:"destroy",value:function e(){window.removeEventListener("resize",this,{capture:false});window.removeEventListener("scroll",this,{capture:false});this.sidebar.classList.remove(this.options.stickyClass);this.sidebar.style.minHeight="";this.sidebar.removeEventListener("update"+d,this);var t={inner:{},outer:{}};t.inner={position:"",top:"",left:"",bottom:"",width:"",transform:""};t.outer={height:"",position:""};for(var i in t.outer){this.sidebar.style[i]=t.outer[i]}for(var n in t.inner){this.sidebarInner.style[n]=t.inner[n]}if(this.options.resizeSensor&&"undefined"!==typeof ResizeSensor){ResizeSensor.detach(this.sidebarInner,this.handleEvent);ResizeSensor.detach(this.container,this.handleEvent)}}}],[{key:"supportTransform",value:function e(t){var i=false,n=t?"perspective":"transform",s=n.charAt(0).toUpperCase()+n.slice(1),r=["Webkit","Moz","O","ms"],o=document.createElement("support"),a=o.style;(n+" "+r.join(s+" ")+s).split(" ").forEach(function(e,t){if(a[e]!==undefined){i=e;return false}});return i}},{key:"eventTrigger",value:function e(t,i,n){try{var s=new CustomEvent(i,{detail:n})}catch(e){var s=document.createEvent("CustomEvent");s.initCustomEvent(i,true,true,n)}t.dispatchEvent(s)}},{key:"extend",value:function e(t,i){var n={};for(var s in t){if("undefined"!==typeof i[s])n[s]=i[s];else n[s]=t[s]}return n}},{key:"offsetRelative",value:function e(t){var i={left:0,top:0};do{var n=t.offsetTop;var s=t.offsetLeft;if(!isNaN(n))i.top+=n;if(!isNaN(s))i.left+=s;t="BODY"===t.tagName?t.parentElement:t.offsetParent}while(t);return i}},{key:"addClass",value:function e(t,i){if(!h.hasClass(t,i)){if(t.classList)t.classList.add(i);else t.className+=" "+i}}},{key:"removeClass",value:function e(t,i){if(h.hasClass(t,i)){if(t.classList)t.classList.remove(i);else t.className=t.className.replace(new RegExp("(^|\\b)"+i.split(" ").join("|")+"(\\b|$)","gi")," ")}}},{key:"hasClass",value:function e(t,i){if(t.classList)return t.classList.contains(i);else return new RegExp("(^| )"+i+"( |$)","gi").test(t.className)}},{key:"defaults",get:function(){return n}}]);return h}();return e}();e.default=i,window.StickySidebar=i}(e)}((t={exports:{}},t.exports)),t.exports),s=(i=n)&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i;e.default=s,e.__moduleExports=n,Object.defineProperty(e,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/languages/How-to-use-a-pot-file.txt b/languages/How-to-use-a-pot-file.txt new file mode 100644 index 0000000..fb42f41 --- /dev/null +++ b/languages/How-to-use-a-pot-file.txt @@ -0,0 +1,21 @@ +#How to use the pot file# + +The pot file included in this folder is ready to use. + +1. Start up Poedit. + +2. In Poedit goto File -> New from POT/PO file... + +3. Select and Open the pot file from the languages folder. + +4. Enter your name, email address, your language and country (i.e. French fr_FR, German de_DE) to the setting form. + +5. Click the Update button in the main Poedit UI. + +6. Save the file: + - For a plugin like filename-xx_XX.po with xx_XX for your language and country. + - For a theme xx_XX.po + +7. That's it, go to your WordPress blog and see your translation in action. N'joy your blogging!!! + +Thank you for your contribution. diff --git a/languages/hi_IN.mo b/languages/hi_IN.mo new file mode 100644 index 0000000000000000000000000000000000000000..6c7a5ce2a1605dfff1fa649adbb424787aff143b GIT binary patch literal 735 zcmZ{g&ubGw6vs!ch=J z>p?t};6b662}lo81b@??ibc1fK|5 zRn!(IC)Y&+^tP}-`#jBrgrgB*Gax-JMqF>9s!bSJ)=Ai1&_*a3)1C%nmXvx(tCdEj z8mvLCv}IkBii9nVQ^WcyrbBCU6NlkrrIWmYCWn;}VwxaaN#8l>`Yg)A?J-oIq$yO_(+uIbidbt^_vsI9w4;Sw#NQ9;JN*%v& zowd~nSBUBCONe)${q&i42Y&j>yD!wceRNRXdH3DB*WNwHoUf(x!n-|u+4IvK@7{R# l@lW(UM&Ek(qb&YU)n8-0oBX?Ezg**>Y&`YuL)mmfegmn%3DE!m literal 0 HcmV?d00001 diff --git a/languages/hi_IN.po b/languages/hi_IN.po new file mode 100644 index 0000000..ad8eb13 --- /dev/null +++ b/languages/hi_IN.po @@ -0,0 +1,1808 @@ +# Copyright (C) 2021 ScriptsTown +# This file is distributed under the GNU General Public License v2 or later. +msgid "" +msgstr "" +"Project-Id-Version: PressBook 1.9.1\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/theme/pressbook\n" +"POT-Creation-Date: 2023-07-29T15:16:42+00:00\n" +"PO-Revision-Date: 2023-07-29 20:47+0530\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: hi_IN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n==0 || n==1);\n" +"X-Generator: Poedit 3.3.1\n" +"X-Domain: pressbook\n" + +#. Theme Name of the theme +msgid "PressBook" +msgstr "" + +#. Theme URI of the theme +msgid "https://scriptstown.com/wordpress-themes/pressbook/" +msgstr "" + +#. Description of the theme +msgid "" +"PressBook is a multi-purpose WordPress theme suitable for blogs, news, " +"marketing, and educational websites. The theme offers a fully responsive, " +"clean, modern, and pixel-perfect design that can adjust automatically to fit " +"the content elements in the best possible manner for any screen-size device. " +"It has a minimal dependency, an SEO-friendly layout, and offers high " +"performance with a quick loading time. It supports double sidebars, a single " +"sidebar, footer widgets, an eye-catching gradient colors scheme for buttons " +"and the top bar, a top advertisement banner area with a custom header " +"background, and customizable options. Both the sidebars can be configured to " +"be shown on the left or on the right. This theme is great to publish " +"documentation, tutorials, events, status updates, story updates, technology " +"blogs, reviews, newsfeeds, etc. It comes with sticky sidebars that float " +"with scrolling. The theme supports multiple page templates with page-level " +"layout settings, blog layouts, conditional block areas, page builders, " +"different color settings, footer options, and much more. Also, the theme " +"comes with three menu locations which include a fully accessible multi-level " +"primary menu with a search form, a top bar navigation menu, and social links " +"menu. It is also great for building schools, university, institutes, and " +"academic, or educational websites." +msgstr "" + +#. Author of the theme +msgid "ScriptsTown" +msgstr "" + +#. Author URI of the theme +msgid "https://scriptstown.com/" +msgstr "" + +#. translators: 1: number of comments, 2: post title +#: comments.php:35 +msgctxt "comments title" +msgid "" +"Comment (%1$s) on “%2$s”" +msgid_plural "" +"Comments (%1$s) on “%2$s”" +msgstr[0] "" +msgstr[1] "" + +#: comments.php:70 +msgid "Comments are closed." +msgstr "" + +#: footer.php:30 +msgid "Go to top" +msgstr "शीर्ष पर जाएं" + +#: header.php:24 +msgid "Skip to content" +msgstr "" + +#. translators: %s: WordPress Version. +#: inc/back-compat.php:28 inc/back-compat.php:43 inc/back-compat.php:64 +msgid "" +"This theme requires WordPress 5.3 or newer. You are running version %s. " +"Please upgrade." +msgstr "" + +#. translators: If there are characters in your language that are not supported by Inter, translate this to 'off'. Do not translate into your own language. +#: inc/core/Editor.php:107 +msgctxt "Inter font (in the editor): on or off" +msgid "on" +msgstr "" + +#. translators: If there are characters in your language that are not supported by Lato, translate this to 'off'. Do not translate into your own language. +#: inc/core/Editor.php:113 +msgctxt "Lato font (in the editor): on or off" +msgid "on" +msgstr "" + +#: inc/core/Enhance.php:102 inc/core/Enhance.php:136 +msgid "Read More" +msgstr "" + +#. translators: 1: "Read More" text, 2: Name of current post. Only visible to screen readers +#: inc/core/Enhance.php:108 +msgctxt "excerpt more" +msgid "" +"%1$s “%2$s” »" +msgstr "" + +#. translators: 1: "Read More" text, 2: Name of current post. Only visible to screen readers +#: inc/core/Enhance.php:142 +msgctxt "content more" +msgid "" +"%1$s “%2$s” »" +msgstr "" + +#: inc/core/Menu.php:33 +msgid "Primary" +msgstr "प्राथमिक" + +#: inc/core/Menu.php:34 template-parts/header/top-navbar.php:36 +msgid "Top Menu" +msgstr "" + +#: inc/core/Menu.php:35 +msgid "Social Links Menu" +msgstr "" + +#: inc/core/Menu.php:55 +msgid "Toggle sub-menu" +msgstr "" + +#: inc/core/Menu.php:68 +msgid "Toggle search form" +msgstr "" + +#: inc/core/Options/BlockSection.php:29 inc/core/Options/TopBanner.php:466 +msgid "Select a block" +msgstr "" + +#. translators: %s: URL to the pattern-blocks admin page. +#: inc/core/Options/BlockSection.php:46 +msgid "" +"This is the content of the block section. You can create or edit the block " +"section in the Pattern Blocks Manager " +"(opens in a new window).
    After creating the pattern block, you may " +"need to refresh this customizer page and then select the newly created block." +"
    The selected block content will appear on the block section." +msgstr "" + +#: inc/core/Options/Blog.php:49 +msgid "Blog Options" +msgstr "" + +#: inc/core/Options/Blog.php:50 +msgid "You can customize the blog options in here." +msgstr "" + +#: inc/core/Options/Blog.php:77 +msgid "Thumbnail-Content - Rows" +msgstr "" + +#: inc/core/Options/Blog.php:78 +msgid "Thumbnail-Content - Columns (Contain)" +msgstr "" + +#: inc/core/Options/Blog.php:79 +msgid "Thumbnail-Content - Columns (Cover)" +msgstr "" + +#: inc/core/Options/Blog.php:81 +msgid "Blog Archive Post Layout (Large-Screen Devices)" +msgstr "" + +#: inc/core/Options/Blog.php:82 +msgid "" +"Select the layout for the blog post in archive pages. Default: Thumbnail-" +"Content - Columns (Cover)" +msgstr "" + +#: inc/core/Options/Blog.php:123 +msgid "Full text" +msgstr "" + +#: inc/core/Options/Blog.php:124 +msgid "Summary" +msgstr "" + +#: inc/core/Options/Blog.php:126 +msgid "Blog Archive Content" +msgstr "" + +#: inc/core/Options/Blog.php:127 +msgid "Select the content to show in the blog archive pages. Default: Summary" +msgstr "" + +#: inc/core/Options/Blog.php:168 +msgid "Show Archive Page Title" +msgstr "" + +#: inc/core/Options/Blog.php:169 +msgid "" +"In archive pages, you can show the archive title and archive description. " +"This is applicable to any archive pages like tag, category, etc." +msgstr "" + +#: inc/core/Options/Blog.php:210 +msgid "Post Meta: Hide All" +msgstr "" + +#: inc/core/Options/Blog.php:211 +msgid "" +"Hide all the post meta data including date, author, number of comments, etc." +msgstr "" + +#: inc/core/Options/Blog.php:237 +msgid "Post Meta: Hide Date" +msgstr "" + +#: inc/core/Options/Blog.php:238 +msgid "" +"Hide only the post date. Checking the \"Post Meta: Hide All\" option will " +"override this option." +msgstr "" + +#: inc/core/Options/Blog.php:264 +msgid "Post Meta: Hide Author" +msgstr "" + +#: inc/core/Options/Blog.php:265 +msgid "" +"Hide only the post author. Checking the \"Post Meta: Hide All\" option will " +"override this option." +msgstr "" + +#: inc/core/Options/Blog.php:291 +msgid "Post: Hide Categories" +msgstr "" + +#: inc/core/Options/Blog.php:292 +msgid "Hide the post categories." +msgstr "" + +#: inc/core/Options/Blog.php:318 +msgid "Post: Hide Tags" +msgstr "" + +#: inc/core/Options/Blog.php:319 +msgid "Hide the post tags." +msgstr "" + +#: inc/core/Options/Blog.php:381 +msgid "Featured (Sticky Post) Label" +msgstr "" + +#: inc/core/Options/Blog.php:382 +msgid "" +"You can change the \"Featured\" label for the sticky posts. Leave it empty " +"for default text." +msgstr "" + +#: inc/core/Options/Blog.php:414 +msgctxt "Label for sticky posts" +msgid "Featured" +msgstr "" + +#: inc/core/Options/Colors.php:52 +msgid "Header Background Color" +msgstr "" + +#: inc/core/Options/Colors.php:82 +msgid "Site Title Color" +msgstr "" + +#: inc/core/Options/Colors.php:109 +msgid "Tagline Color" +msgstr "" + +#: inc/core/Options/Colors.php:136 +msgid "Button Gradient Background 1" +msgstr "" + +#: inc/core/Options/Colors.php:166 +msgid "Button Gradient Background 2" +msgstr "" + +#: inc/core/Options/Content.php:38 +msgid "Content Layout" +msgstr "" + +#: inc/core/Options/Content.php:39 +msgid "You can customize the content layout options in here." +msgstr "" + +#: inc/core/Options/Content.php:65 inc/core/Options/Sidebar.php:134 +msgid "Remove Top Padding" +msgstr "" + +#: inc/core/Options/Content.php:90 inc/core/Options/Sidebar.php:159 +msgid "Remove Bottom Padding" +msgstr "" + +#: inc/core/Options/Content.php:115 inc/core/Options/Sidebar.php:184 +msgid "Remove Horizontal Padding" +msgstr "" + +#: inc/core/Options/Fonts.php:46 +msgid "Fonts" +msgstr "" + +#: inc/core/Options/Fonts.php:47 +msgid "You can customize the fonts options in here." +msgstr "" + +#: inc/core/Options/Fonts.php:74 +msgid "Button Font Weight" +msgstr "" + +#: inc/core/Options/Fonts.php:75 +msgid "Default: 600" +msgstr "" + +#: inc/core/Options/Fonts.php:101 +msgid "Heading Font Weight" +msgstr "" + +#: inc/core/Options/Fonts.php:102 inc/core/Options/Fonts.php:129 +msgid "Default: 700" +msgstr "" + +#: inc/core/Options/Fonts.php:128 +msgid "Site Title Font Weight" +msgstr "" + +#: inc/core/Options/Fonts.php:141 +msgctxt "Font Weight" +msgid "400" +msgstr "" + +#: inc/core/Options/Fonts.php:142 +msgctxt "Font Weight" +msgid "500" +msgstr "" + +#: inc/core/Options/Fonts.php:143 +msgctxt "Font Weight" +msgid "600" +msgstr "" + +#: inc/core/Options/Fonts.php:144 +msgctxt "Font Weight" +msgid "700" +msgstr "" + +#: inc/core/Options/Footer.php:41 +msgid "Footer Options" +msgstr "" + +#: inc/core/Options/Footer.php:42 +msgid "You can customize the footer options in here." +msgstr "" + +#: inc/core/Options/Footer.php:68 +msgid "Copyright Text" +msgstr "" + +#: inc/core/Options/Footer.php:69 +msgid "" +"You can change the copyright text in the footer. You may use the following " +"tags: em, strong, span, a, br." +msgstr "" + +#. translators: 1: current year, 2: blog name +#: inc/core/Options/Footer.php:94 +msgid "Copyright © %1$s %2$s." +msgstr "" + +#: inc/core/Options/Footer.php:95 +msgctxt "copyright date format" +msgid "Y" +msgstr "" + +#: inc/core/Options/Footer.php:137 +msgid "Hide Go To Top Button" +msgstr "" + +#: inc/core/Options/Footer.php:179 +msgid "Footer Background Color" +msgstr "" + +#: inc/core/Options/Footer.php:209 +msgid "Footer Credit Link Color" +msgstr "" + +#: inc/core/Options/FooterBlock.php:37 +msgid "Footer Block" +msgstr "" + +#: inc/core/Options/FooterBlock.php:38 +msgid "You can customize the footer block options in here." +msgstr "" + +#. translators: %s: footer block number +#: inc/core/Options/FooterBlock.php:73 inc/core/Options/FooterBlock.php:100 +#: inc/core/Options/FooterBlock.php:126 inc/core/Options/FooterBlock.php:152 +#: inc/core/Options/FooterBlock.php:178 inc/core/Options/FooterBlock.php:204 +#: inc/core/Options/FooterBlock.php:230 inc/core/Options/FooterBlock.php:256 +msgid "Footer Block %s" +msgstr "" + +#: inc/core/Options/FooterBlock.php:97 inc/core/Options/HeaderBlock.php:97 +msgid "Set Full Width" +msgstr "" + +#: inc/core/Options/FooterBlock.php:123 +msgid "Bottom Margin" +msgstr "" + +#: inc/core/Options/FooterBlock.php:149 inc/core/Options/HeaderBlock.php:149 +msgid "Show in Front Page" +msgstr "" + +#: inc/core/Options/FooterBlock.php:175 inc/core/Options/HeaderBlock.php:175 +msgid "Show in Blog Page" +msgstr "" + +#: inc/core/Options/FooterBlock.php:201 inc/core/Options/HeaderBlock.php:201 +msgid "Show in Archive Pages" +msgstr "" + +#: inc/core/Options/FooterBlock.php:227 inc/core/Options/HeaderBlock.php:227 +msgid "Show in Posts" +msgstr "" + +#: inc/core/Options/FooterBlock.php:253 inc/core/Options/HeaderBlock.php:253 +msgid "Show in Pages" +msgstr "" + +#: inc/core/Options/General.php:37 +msgid "General Options" +msgstr "" + +#: inc/core/Options/General.php:38 +msgid "You can customize the general options in here." +msgstr "" + +#: inc/core/Options/General.php:64 +msgid "Search Form Button Text" +msgstr "" + +#: inc/core/Options/General.php:65 +msgid "" +"You can change the search form button text. Leave it empty for default text. " +"This does not change the button text of search form widget block. To change " +"that, you can directly edit the search form widget block in the editor " +"itself." +msgstr "" + +#: inc/core/Options/General.php:106 +msgid "Read More Text" +msgstr "" + +#: inc/core/Options/General.php:107 +msgid "You can change the \"Read More\" text. Leave it empty for default text." +msgstr "" + +#: inc/core/Options/HeaderBlock.php:37 +msgid "Header Block" +msgstr "" + +#: inc/core/Options/HeaderBlock.php:38 +msgid "You can customize the header block options in here." +msgstr "" + +#. translators: %s: header block number +#: inc/core/Options/HeaderBlock.php:73 inc/core/Options/HeaderBlock.php:100 +#: inc/core/Options/HeaderBlock.php:126 inc/core/Options/HeaderBlock.php:152 +#: inc/core/Options/HeaderBlock.php:178 inc/core/Options/HeaderBlock.php:204 +#: inc/core/Options/HeaderBlock.php:230 inc/core/Options/HeaderBlock.php:256 +msgid "Header Block %s" +msgstr "" + +#: inc/core/Options/HeaderBlock.php:123 +msgid "Top Margin" +msgstr "" + +#: inc/core/Options/HeaderImage.php:49 +msgid "Header Background Position" +msgstr "" + +#: inc/core/Options/HeaderImage.php:50 +msgid "Default: Center Center" +msgstr "" + +#: inc/core/Options/HeaderImage.php:76 +msgid "Header Background Repeat" +msgstr "" + +#: inc/core/Options/HeaderImage.php:77 +msgid "Default: Repeat" +msgstr "" + +#: inc/core/Options/HeaderImage.php:103 +msgid "Header Background Size" +msgstr "" + +#: inc/core/Options/HeaderImage.php:104 +msgid "Default: Contain" +msgstr "" + +#: inc/core/Options/HeaderImage.php:116 +msgid "Left Top" +msgstr "" + +#: inc/core/Options/HeaderImage.php:117 +msgid "Left Center" +msgstr "" + +#: inc/core/Options/HeaderImage.php:118 +msgid "Left Bottom" +msgstr "" + +#: inc/core/Options/HeaderImage.php:119 +msgid "Right Top" +msgstr "" + +#: inc/core/Options/HeaderImage.php:120 +msgid "Right Center" +msgstr "" + +#: inc/core/Options/HeaderImage.php:121 +msgid "Right Bottom" +msgstr "" + +#: inc/core/Options/HeaderImage.php:122 +msgid "Center Top" +msgstr "" + +#: inc/core/Options/HeaderImage.php:123 +msgid "Center Center" +msgstr "" + +#: inc/core/Options/HeaderImage.php:124 +msgid "Center Bottom" +msgstr "" + +#: inc/core/Options/HeaderImage.php:135 +msgid "Repeat" +msgstr "" + +#: inc/core/Options/HeaderImage.php:136 +msgid "Repeat X" +msgstr "" + +#: inc/core/Options/HeaderImage.php:137 +msgid "Repeat Y" +msgstr "" + +#: inc/core/Options/HeaderImage.php:138 +msgid "No Repeat" +msgstr "" + +#: inc/core/Options/HeaderImage.php:149 +msgid "Auto" +msgstr "" + +#: inc/core/Options/HeaderImage.php:150 +msgid "Cover" +msgstr "" + +#: inc/core/Options/HeaderImage.php:151 +msgid "Contain" +msgstr "" + +#: inc/core/Options/PrimaryNavbar.php:38 inc/welcome-page.php:137 +#, fuzzy +#| msgid "Primary" +msgid "Primary Navbar" +msgstr "प्राथमिक" + +#: inc/core/Options/PrimaryNavbar.php:39 +msgid "You can customize the primary navbar options in here." +msgstr "" + +#: inc/core/Options/PrimaryNavbar.php:66 +msgid "Primary Navbar Background Color" +msgstr "" + +#: inc/core/Options/PrimaryNavbar.php:96 +msgid "Enable Primary Navbar Search Form" +msgstr "" + +#: inc/core/Options/Sidebar.php:46 +msgid "Sidebar Layout" +msgstr "" + +#: inc/core/Options/Sidebar.php:47 +msgid "You can customize the sidebar layout options in here." +msgstr "" + +#: inc/core/Options/Sidebar.php:74 +msgid "One Left and One Right" +msgstr "" + +#: inc/core/Options/Sidebar.php:75 +msgid "Both Sidebars to the Left" +msgstr "" + +#: inc/core/Options/Sidebar.php:76 +msgid "Both Sidebars to the Right" +msgstr "" + +#: inc/core/Options/Sidebar.php:78 +msgid "Double Sidebars Layout (Large-Screen Devices)" +msgstr "" + +#: inc/core/Options/Sidebar.php:79 +msgid "" +"Set the layout for the double sidebars. This applies only when both the " +"sidebars (left and right) are active. A sidebar is active when there is at " +"least one widget in it." +msgstr "" + +#: inc/core/Options/Sidebar.php:105 +msgid "Side Widget Border Color" +msgstr "" + +#: inc/core/Options/Sidebar.php:209 +msgid "Remove Box Shadow" +msgstr "" + +#: inc/core/Options/Sidebar.php:271 +msgid "Sticky-Floating Sidebar" +msgstr "" + +#: inc/core/Options/Sidebar.php:272 +msgid "You can enable or disable sticky sidebar that floats on scrolling." +msgstr "" + +#: inc/core/Options/SiteIdentity.php:72 +msgid "Hide Site Title" +msgstr "साइट शीर्षक छिपाएं" + +#: inc/core/Options/SiteIdentity.php:122 +msgid "Hide Site Tagline" +msgstr "साइट टैगलाइन छिपाएं" + +#: inc/core/Options/SiteIdentity.php:271 +msgid "Logo Size (Small-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:272 +msgid "Logo Size (Medium-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:273 +msgid "Logo Size (Large-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:276 +msgctxt "Default: Logo Size (Small-Screen Devices)" +msgid "Default: Size 1" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:277 +msgctxt "Default: Logo Size (Medium-Screen Devices)" +msgid "Default: Size 1" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:278 +msgctxt "Default: Logo Size (Large-Screen Devices)" +msgid "Default: Size 1" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:291 +msgid "Site Title Size (Small-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:292 +msgid "Site Title Size (Medium-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:293 +msgid "Site Title Size (Large-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:296 +msgctxt "Default: Site Title Size (Small-Screen Devices)" +msgid "Default: Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:297 +msgctxt "Default: Site Title Size (Medium-Screen Devices)" +msgid "Default: Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:298 +msgctxt "Default: Site Title Size (Large-Screen Devices)" +msgid "Default: Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:311 +msgid "Tagline Size (Small-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:312 +msgid "Tagline Size (Medium-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:313 +msgid "Tagline Size (Large-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:316 +msgctxt "Default: Tagline Size (Small-Screen Devices)" +msgid "Default: Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:317 +msgctxt "Default: Tagline Size (Medium-Screen Devices)" +msgid "Default: Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:318 +msgctxt "Default: Tagline Size (Large-Screen Devices)" +msgid "Default: Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:357 +msgid "Size 1" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:358 +msgid "Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:359 +msgid "Size 3" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:360 +msgid "Size 4" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:361 +msgid "Size 5" +msgstr "" + +#: inc/core/Options/TopBanner.php:52 inc/welcome-page.php:63 +#: inc/welcome-page.php:69 +msgid "Top Banner" +msgstr "" + +#: inc/core/Options/TopBanner.php:53 +msgid "You can customize the top banner options in here." +msgstr "" + +#: inc/core/Options/TopBanner.php:80 +msgid "Top Banner Image" +msgstr "" + +#: inc/core/Options/TopBanner.php:81 +msgid "" +"Select the top banner image. The theme works best with an image size of 728 " +"x 90 pixels. " +msgstr "" + +#: inc/core/Options/TopBanner.php:111 +msgid "Top Banner Link - URL" +msgstr "" + +#: inc/core/Options/TopBanner.php:112 +msgid "Enter the URL for the banner link." +msgstr "" + +#: inc/core/Options/TopBanner.php:137 +msgid "Top Banner Link - Title" +msgstr "" + +#: inc/core/Options/TopBanner.php:138 +msgid "Enter the \"title\" attribute for the banner link." +msgstr "" + +#: inc/core/Options/TopBanner.php:163 +msgid "Top Banner Link - Rel" +msgstr "" + +#: inc/core/Options/TopBanner.php:164 +msgid "Enter the \"rel\" attribute for the banner link." +msgstr "" + +#: inc/core/Options/TopBanner.php:189 +msgid "Top Banner Link - Open in New Tab" +msgstr "" + +#: inc/core/Options/TopBanner.php:214 +msgid "Top Banner Shadow Effect" +msgstr "" + +#: inc/core/Options/TopBanner.php:239 +msgid "Top Banner Maximum Height" +msgstr "" + +#: inc/core/Options/TopBanner.php:240 +msgid "" +"Set the maximum height allowed for the top banner image in pixels. Default: " +"150" +msgstr "" + +#: inc/core/Options/TopBanner.php:265 +msgid "Hide in Small-Screen Devices" +msgstr "" + +#: inc/core/Options/TopBanner.php:290 +msgid "Hide in Medium-Screen Devices" +msgstr "" + +#: inc/core/Options/TopBanner.php:419 +msgid "Top Banner Block Section" +msgstr "" + +#. translators: %s: URL to the pattern-blocks admin page. +#: inc/core/Options/TopBanner.php:423 +msgid "" +"You can use this to replace top banner image and use any custom block (For " +"example: \"Custom HTML block\"). This is the content of the block section. " +"You can create or edit the block section in the Pattern Blocks Manager (opens in a new window)." +"
    After creating the pattern block, you may need to refresh this " +"customizer page and then select the newly created block.
    The selected " +"block content will appear on the block section, replacing the top banner " +"image and overriding its related options." +msgstr "" + +#: inc/core/Options/TopNavbar.php:38 inc/welcome-page.php:126 +msgid "Top Navbar" +msgstr "" + +#: inc/core/Options/TopNavbar.php:39 +msgid "You can customize the top navbar options in here." +msgstr "" + +#: inc/core/Options/TopNavbar.php:66 +msgid "Top Navbar Gradient Background 1" +msgstr "" + +#: inc/core/Options/TopNavbar.php:96 +msgid "Top Navbar Gradient Background 2" +msgstr "" + +#: inc/core/Options/Upsell.php:45 +msgid "Premium Available" +msgstr "" + +#: inc/core/Options/Upsell.php:46 inc/welcome-page.php:115 +msgid "Get Premium" +msgstr "" + +#: inc/core/Options/Upsell.php:60 inc/core/Options/Upsell.php:76 +#: inc/core/Options/Upsell.php:92 inc/core/Options/Upsell.php:108 +#: inc/core/Options/Upsell.php:124 inc/core/Options/Upsell.php:140 +#: inc/core/Options/Upsell.php:156 inc/core/Options/Upsell.php:172 +#: inc/core/Options/Upsell.php:188 inc/core/Options/Upsell.php:204 +#: inc/core/Options/Upsell.php:220 +msgid "Learn More" +msgstr "" + +#: inc/core/Options/Upsell.php:61 +msgid "" +"More color options like button text color, link color, theme accent color, " +"RGBA colors, fonts selector, and many more options are available in our " +"premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:77 +msgid "" +"Advanced typography settings: font-family, font-size, body font-weight, line-" +"height, over 50+ Google fonts, and custom Google font loader are available " +"to select for the headings and body text in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:93 +msgid "" +"Multiple eye-catching block patterns, custom gradient color options, header " +"blocks, footer blocks, and many more options are available in our premium " +"version." +msgstr "" + +#: inc/core/Options/Upsell.php:109 +msgid "" +"Multiple eye-catching block patterns, custom gradient color scheme, header " +"blocks, footer blocks are available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:125 +msgid "" +"More color options for primary navigation are available in our premium " +"version." +msgstr "" + +#: inc/core/Options/Upsell.php:141 +msgid "" +"More header blocks and footer blocks are available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:157 +msgid "" +"More footer blocks and header blocks are available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:173 +msgid "" +"Content background, text color, button color, link color and many more " +"options are available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:189 +msgid "" +"Sidebar background, text color, post meta color, and many more options are " +"available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:205 +msgid "" +"More blog options and advanced theme options are available in our premium " +"version." +msgstr "" + +#: inc/core/Options/Upsell.php:221 +msgid "More footer and color options are available in our premium version." +msgstr "" + +#: inc/core/PageSettings.php:28 +msgid "PressBook Page Settings" +msgstr "" + +#: inc/core/PageSettings.php:120 +msgid "Disable Header Title" +msgstr "" + +#: inc/core/PageSettings.php:125 +msgid "Remove Top Margin" +msgstr "" + +#: inc/core/PageSettings.php:130 +msgid "Remove Bottom Margin" +msgstr "" + +#: inc/core/PageSettings.php:133 +msgid "" +"Below settings override customizer settings for page content layout (only if " +"checked)." +msgstr "" + +#: inc/core/PageSettings.php:137 +msgid "Force Remove Top Padding" +msgstr "" + +#: inc/core/PageSettings.php:142 +msgid "Force Remove Bottom Padding" +msgstr "" + +#: inc/core/PageSettings.php:147 +msgid "Force Remove Horizontal Padding" +msgstr "" + +#: inc/core/PageSettings.php:152 +msgid "Force Transparent Background" +msgstr "" + +#. translators: If there are characters in your language that are not supported by Inter, translate this to 'off'. Do not translate into your own language. +#: inc/core/Scripts.php:72 +msgctxt "Inter font: on or off" +msgid "on" +msgstr "" + +#. translators: If there are characters in your language that are not supported by Lato, translate this to 'off'. Do not translate into your own language. +#: inc/core/Scripts.php:78 +msgctxt "Lato font: on or off" +msgid "on" +msgstr "" + +#. translators: %s: post date +#: inc/core/TemplateTags.php:65 +msgctxt "post date" +msgid "Posted on %s" +msgstr "" + +#. translators: %s: post author +#: inc/core/TemplateTags.php:98 +msgctxt "post author" +msgid "By %s" +msgstr "" + +#: inc/core/TemplateTags.php:161 +msgctxt "String to use before the tags for screen readers." +msgid "Tags:" +msgstr "" + +#: inc/core/Widget.php:35 +msgid "Left Sidebar" +msgstr "" + +#: inc/core/Widget.php:37 inc/core/Widget.php:49 inc/core/Widget.php:63 +#: inc/core/WooCommerce.php:75 +msgid "Add widgets here." +msgstr "" + +#: inc/core/Widget.php:47 +msgid "Right Sidebar" +msgstr "" + +#. translators: %s: footer widgets area number +#: inc/core/Widget.php:61 +msgid "Footer Widgets Area %s" +msgstr "" + +#: inc/core/WooCommerce.php:73 +msgid "Shop Sidebar" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:327 +msgid "Install Required Plugins" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:328 +msgid "Install Plugins" +msgstr "" + +#. translators: %s: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:330 +msgid "Installing Plugin: %s" +msgstr "" + +#. translators: %s: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:332 +msgid "Updating Plugin: %s" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:333 +msgid "Something went wrong with the plugin API." +msgstr "" + +#. translators: 1: plugin name(s). +#: inc/libs/class-tgm-plugin-activation.php:335 +msgid "This theme requires the following plugin: %1$s." +msgid_plural "This theme requires the following plugins: %1$s." +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: plugin name(s). +#: inc/libs/class-tgm-plugin-activation.php:341 +msgid "This theme recommends the following plugin: %1$s." +msgid_plural "This theme recommends the following plugins: %1$s." +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: plugin name(s). +#: inc/libs/class-tgm-plugin-activation.php:347 +msgid "" +"The following plugin needs to be updated to its latest version to ensure " +"maximum compatibility with this theme: %1$s." +msgid_plural "" +"The following plugins need to be updated to their latest version to ensure " +"maximum compatibility with this theme: %1$s." +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: plugin name(s). +#: inc/libs/class-tgm-plugin-activation.php:353 +msgid "There is an update available for: %1$s." +msgid_plural "There are updates available for the following plugins: %1$s." +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: plugin name(s). +#: inc/libs/class-tgm-plugin-activation.php:359 +msgid "The following required plugin is currently inactive: %1$s." +msgid_plural "The following required plugins are currently inactive: %1$s." +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: plugin name(s). +#: inc/libs/class-tgm-plugin-activation.php:365 +msgid "The following recommended plugin is currently inactive: %1$s." +msgid_plural "The following recommended plugins are currently inactive: %1$s." +msgstr[0] "" +msgstr[1] "" + +#: inc/libs/class-tgm-plugin-activation.php:370 +msgid "Begin installing plugin" +msgid_plural "Begin installing plugins" +msgstr[0] "" +msgstr[1] "" + +#: inc/libs/class-tgm-plugin-activation.php:375 +msgid "Begin updating plugin" +msgid_plural "Begin updating plugins" +msgstr[0] "" +msgstr[1] "" + +#: inc/libs/class-tgm-plugin-activation.php:380 +msgid "Begin activating plugin" +msgid_plural "Begin activating plugins" +msgstr[0] "" +msgstr[1] "" + +#: inc/libs/class-tgm-plugin-activation.php:385 +msgid "Return to Required Plugins Installer" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:386 +#: inc/libs/class-tgm-plugin-activation.php:827 +#: inc/libs/class-tgm-plugin-activation.php:2533 +#: inc/libs/class-tgm-plugin-activation.php:3590 +msgid "Return to the Dashboard" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:387 +#: inc/libs/class-tgm-plugin-activation.php:3159 +msgid "Plugin activated successfully." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:388 +#: inc/libs/class-tgm-plugin-activation.php:2952 +msgid "The following plugin was activated successfully:" +msgid_plural "The following plugins were activated successfully:" +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:390 +msgid "No action taken. Plugin %1$s was already active." +msgstr "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:392 +msgid "" +"Plugin not activated. A higher version of %s is needed for this theme. " +"Please update the plugin." +msgstr "" + +#. translators: 1: dashboard link. +#: inc/libs/class-tgm-plugin-activation.php:394 +msgid "All plugins installed and activated successfully. %1$s" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:395 +msgid "Dismiss this notice" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:396 +msgid "" +"There are one or more required or recommended plugins to install, update or " +"activate." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:397 +msgid "Please contact the administrator of this site for help." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:522 +msgid "This plugin needs to be updated to be compatible with your theme." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:523 +msgid "Update Required" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:934 +msgid "" +"The remote plugin package does not contain a folder with the desired slug " +"and renaming did not work." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:934 +#: inc/libs/class-tgm-plugin-activation.php:937 +msgid "" +"Please contact the plugin provider and ask them to package their plugin " +"according to the WordPress guidelines." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:937 +msgid "" +"The remote plugin package consists of more than one file, but the files are " +"not packaged in a folder." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:1121 +#: inc/libs/class-tgm-plugin-activation.php:2948 +msgctxt "plugin A *and* plugin B" +msgid "and" +msgstr "" + +#. translators: %s: version number +#: inc/libs/class-tgm-plugin-activation.php:1982 +msgid "TGMPA v%s" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2273 +msgid "Required" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2276 +msgid "Recommended" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2292 +msgid "WordPress Repository" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2295 +msgid "External Source" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2298 +msgid "Pre-Packaged" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2315 +msgid "Not Installed" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2319 +msgid "Installed But Not Activated" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2321 +msgid "Active" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2327 +msgid "Required Update not Available" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2330 +msgid "Requires Update" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2333 +msgid "Update recommended" +msgstr "" + +#. translators: 1: install status, 2: update status +#: inc/libs/class-tgm-plugin-activation.php:2342 +msgctxt "Install/Update Status" +msgid "%1$s, %2$s" +msgstr "" + +#. translators: 1: number of plugins. +#: inc/libs/class-tgm-plugin-activation.php:2388 +msgctxt "plugins" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: number of plugins. +#: inc/libs/class-tgm-plugin-activation.php:2392 +msgid "To Install (%s)" +msgid_plural "To Install (%s)" +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: number of plugins. +#: inc/libs/class-tgm-plugin-activation.php:2396 +msgid "Update Available (%s)" +msgid_plural "Update Available (%s)" +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: number of plugins. +#: inc/libs/class-tgm-plugin-activation.php:2400 +msgid "To Activate (%s)" +msgid_plural "To Activate (%s)" +msgstr[0] "" +msgstr[1] "" + +#: inc/libs/class-tgm-plugin-activation.php:2482 +msgctxt "as in: \"version nr unknown\"" +msgid "unknown" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2490 +msgid "Installed version:" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2498 +msgid "Minimum required version:" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2510 +msgid "Available version:" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2533 +msgid "No plugins to install, update or activate." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2547 +msgid "Plugin" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2548 +msgid "Source" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2549 +msgid "Type" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2553 +msgid "Version" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2554 +msgid "Status" +msgstr "" + +#. translators: %2$s: plugin name in screen reader markup +#: inc/libs/class-tgm-plugin-activation.php:2603 +msgid "Install %2$s" +msgstr "" + +#. translators: %2$s: plugin name in screen reader markup +#: inc/libs/class-tgm-plugin-activation.php:2608 +msgid "Update %2$s" +msgstr "" + +#. translators: %2$s: plugin name in screen reader markup +#: inc/libs/class-tgm-plugin-activation.php:2614 +msgid "Activate %2$s" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2684 +msgid "Upgrade message from the plugin author:" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2717 +msgid "Install" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2723 +msgid "Update" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2726 +msgid "Activate" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2757 +msgid "No plugins were selected to be installed. No action taken." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2759 +msgid "No plugins were selected to be updated. No action taken." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2800 +msgid "No plugins are available to be installed at this time." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2802 +msgid "No plugins are available to be updated at this time." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2908 +msgid "No plugins were selected to be activated. No action taken." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2934 +msgid "No plugins are available to be activated at this time." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:3158 +msgid "Plugin activation failed." +msgstr "" + +#. translators: 1: plugin name, 2: action number 3: total number of actions. +#: inc/libs/class-tgm-plugin-activation.php:3498 +msgid "Updating Plugin %1$s (%2$d/%3$d)" +msgstr "" + +#. translators: 1: plugin name, 2: error message. +#: inc/libs/class-tgm-plugin-activation.php:3503 +msgid "An error occurred while installing %1$s: %2$s." +msgstr "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:3505 +msgid "The installation of %1$s failed." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:3508 +msgid "" +"The installation and activation process is starting. This process may take a " +"while on some hosts, so please be patient." +msgstr "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:3510 +#: inc/libs/class-tgm-plugin-activation.php:3512 +msgid "%1$s installed and activated successfully." +msgstr "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:3510 +#: inc/libs/class-tgm-plugin-activation.php:3520 +#: inc/libs/class-tgm-plugin-activation.php:3530 +msgid "Show Details" +msgstr "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:3510 +#: inc/libs/class-tgm-plugin-activation.php:3520 +#: inc/libs/class-tgm-plugin-activation.php:3530 +msgid "Hide Details" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:3513 +msgid "All installations and activations have been completed." +msgstr "" + +#. translators: 1: plugin name, 2: action number 3: total number of actions. +#: inc/libs/class-tgm-plugin-activation.php:3515 +msgid "Installing and Activating Plugin %1$s (%2$d/%3$d)" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:3518 +msgid "" +"The installation process is starting. This process may take a while on some " +"hosts, so please be patient." +msgstr "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:3520 +#: inc/libs/class-tgm-plugin-activation.php:3522 +msgid "%1$s installed successfully." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:3523 +msgid "All installations have been completed." +msgstr "" + +#. translators: 1: plugin name, 2: action number 3: total number of actions. +#: inc/libs/class-tgm-plugin-activation.php:3525 +msgid "Installing Plugin %1$s (%2$d/%3$d)" +msgstr "" + +#: inc/welcome-page.php:13 +msgctxt "page title" +msgid "PressBook" +msgstr "" + +#: inc/welcome-page.php:14 +msgctxt "menu title" +msgid "PressBook" +msgstr "" + +#. translators: 1: theme name, 2: theme version number +#: inc/welcome-page.php:38 +msgctxt "menu page heading" +msgid "%1$s Version %2$s" +msgstr "" + +#: inc/welcome-page.php:52 +msgid "Customize Theme" +msgstr "" + +#: inc/welcome-page.php:54 +msgid "" +"You can customize the theme using the theme options available in the " +"customizer." +msgstr "" + +#: inc/welcome-page.php:58 +msgid "Theme Options" +msgstr "" + +#: inc/welcome-page.php:65 +msgid "" +"You can add the top banner image and link from the Customizer > Top Banner." +msgstr "" + +#: inc/welcome-page.php:74 +msgid "Menus & Social Links" +msgstr "" + +#: inc/welcome-page.php:76 +msgid "" +"You can create a menu and assign it to a menu location. PressBook comes with " +"three menu locations which include the primary menu, top bar menu, and " +"social links menu. For social links, create a menu item with a custom link, " +"enter the URL of the social page, and assign this menu to the \"Social Links " +"Menu\" location." +msgstr "" + +#: inc/welcome-page.php:80 +msgid "Menus" +msgstr "" + +#: inc/welcome-page.php:85 +msgid "Premium Version" +msgstr "" + +#: inc/welcome-page.php:87 +msgid "PressBook Premium comes with additional features:" +msgstr "" + +#: inc/welcome-page.php:91 +msgid "Dark and Light Color Schemes - Fully Customizable" +msgstr "" + +#: inc/welcome-page.php:92 +msgid "Dark and Light Editor Styles - Block Editor" +msgstr "" + +#: inc/welcome-page.php:93 +msgid "Alpha Transparency Effect with Background Image" +msgstr "" + +#: inc/welcome-page.php:94 +msgid "Sidebar Layout Custom Background Color" +msgstr "" + +#: inc/welcome-page.php:95 +msgid "Content Layout Custom Background Color" +msgstr "" + +#: inc/welcome-page.php:96 +msgid "4 Header Block Areas with Multiple Options" +msgstr "" + +#: inc/welcome-page.php:97 +msgid "3 Footer Block Areas with Multiple Options" +msgstr "" + +#: inc/welcome-page.php:98 +msgid "Multiple Posts Carousels with Advanced Options" +msgstr "" + +#: inc/welcome-page.php:99 +msgid "Footer Text Color, Link Color & Additional Options" +msgstr "" + +#: inc/welcome-page.php:100 +msgid "Standard Grid Layout and Masonry Grid Layout" +msgstr "" + +#: inc/welcome-page.php:103 +msgid "Header, Footer, Content, Sidebars - Dark and Light Schemes" +msgstr "" + +#: inc/welcome-page.php:104 +msgid "Post Meta, Comment Meta Text Color & Link Color" +msgstr "" + +#: inc/welcome-page.php:105 +msgid "Custom Gradient Colors for Buttons" +msgstr "" + +#: inc/welcome-page.php:106 +msgid "Custom Accent Colors - Links, Text, Heading, Hover Colors" +msgstr "" + +#: inc/welcome-page.php:107 +msgid "Custom Google Fonts for Headings and Body Text" +msgstr "" + +#: inc/welcome-page.php:108 +msgid "Typography Settings - Global Font-Size, Font-Family, Line-Height" +msgstr "" + +#: inc/welcome-page.php:109 +msgid "Unlimited Color Options & Advanced Theme Options" +msgstr "" + +#: inc/welcome-page.php:110 +msgid "Header Posts and Related Posts Grid with Advanced Options" +msgstr "" + +#: inc/welcome-page.php:111 +msgid "Multiple Design for Site Branding, Top Navbar, Primary Navbar" +msgstr "" + +#: inc/welcome-page.php:112 +msgid "Multiple Eye-Catching Block Patterns to Quickly Create Sections" +msgstr "" + +#: inc/welcome-page.php:120 +msgid "Top Menu Options & Colors" +msgstr "" + +#: inc/welcome-page.php:122 +msgid "" +"You can configure the options and change the colors of the top navbar from " +"the Customizer > Top Navbar." +msgstr "" + +#: inc/welcome-page.php:131 +msgid "Primary Menu Options & Colors" +msgstr "" + +#: inc/welcome-page.php:133 +msgid "" +"You can configure the options and change the colors of the primary navbar " +"from the Customizer > Primary Navbar." +msgstr "" + +#: inc/welcome-page.php:142 +msgid "Header / Background Color & Image" +msgstr "" + +#: inc/welcome-page.php:144 +msgid "" +"You can customize the header image from the Customizer > Header Image and " +"body background image from the Customizer > Background Image. Also, you can " +"change the header and body background color from the Customizer > Colors." +msgstr "" + +#: inc/welcome-page.php:148 +msgid "Theme Colors" +msgstr "" + +#: inc/welcome-page.php:149 +msgid "Header Image" +msgstr "" + +#: inc/welcome-page.php:150 +msgid "Background Image" +msgstr "" + +#: inc/welcome-page.php:155 +msgid "Header Block Area" +msgstr "" + +#: inc/welcome-page.php:157 +msgid "" +"You can enable the header block area by creating a block in the pattern " +"block manager. Then select this block in the Customizer > Header Block. " +"PressBook comes with 1 header block area." +msgstr "" + +#: inc/welcome-page.php:161 +msgid "Header Blocks" +msgstr "" + +#: inc/welcome-page.php:162 inc/welcome-page.php:174 +msgid "Pattern Blocks" +msgstr "" + +#: inc/welcome-page.php:167 +msgid "Footer Block Area" +msgstr "" + +#: inc/welcome-page.php:169 +msgid "" +"You can enable the footer block area by creating a block in the pattern " +"block manager. Then select this block in the Customizer > Footer Block. " +"PressBook comes with 1 footer block area." +msgstr "" + +#: inc/welcome-page.php:173 +msgid "Footer Blocks" +msgstr "" + +#: inc/welcome-page.php:179 +msgid "Sidebar & Footer Widgets" +msgstr "" + +#: inc/welcome-page.php:181 +msgid "" +"You can drag and drop widgets to the widget area. PressBook comes with 6 " +"widgets area locations which include a left sidebar, right sidebar, and 4 " +"locations for footer widgets." +msgstr "" + +#: inc/welcome-page.php:185 +msgid "Add / Manage Widgets" +msgstr "" + +#: inc/welcome-page.php:190 +msgid "Page Template & Page Settings" +msgstr "" + +#: inc/welcome-page.php:192 +msgid "" +"When adding or editing a page, there are many page templates to choose from. " +"Also, you can configure the page settings for any specific page. These " +"templates and settings are available on the sidebar area of the page editor " +"screen." +msgstr "" + +#: inc/welcome-page.php:198 +msgid "Page Template with Sidebar" +msgstr "" + +#: inc/welcome-page.php:200 +msgid "" +"There are many page templates available to choose from. You can simply edit " +"the page and on the right side of the page editor screen, set the template " +"from \"Template\" to \"Page with sidebar\"." +msgstr "" + +#: inc/welcome-page.php:203 +msgid "" +"Similarly, you can set the page template to full width, large width, medium " +"width, small width, or default template without sidebar." +msgstr "" + +#. translators: 1: theme name, 2: welcome page link. +#: inc/welcome-page.php:236 +msgid "" +"Welcome! Thank you for choosing %1$s theme. To get started, visit our welcome page." +msgstr "" + +#. translators: %s: theme name +#: inc/welcome-page.php:249 +msgid "Get started with %s" +msgstr "" + +#. translators: %s: search query +#: index.php:45 +msgid "Search Results for: %s" +msgstr "" + +#. Template Name of the theme +msgid "Full width template" +msgstr "" + +#. Template Name of the theme +msgid "Large width template" +msgstr "" + +#. Template Name of the theme +msgid "Medium width template" +msgstr "" + +#. Template Name of the theme +msgid "Page with sidebar" +msgstr "" + +#. Template Name of the theme +msgid "Small width template" +msgstr "" + +#: single.php:28 +msgid "Previous Post:" +msgstr "" + +#: single.php:30 +msgid "Next Post:" +msgstr "" + +#: template-parts/content-none.php:14 +msgid "Nothing Found" +msgstr "" + +#. translators: 1: link to WP admin new post page +#: template-parts/content-none.php:24 +msgid "" +"Ready to publish your first post? Get started here." +msgstr "" + +#: template-parts/content-none.php:37 +msgid "" +"Sorry, but nothing matched your search terms. Please try again with some " +"different keywords." +msgstr "" + +#: template-parts/content-none.php:44 +msgid "" +"It seems we can’t find what you’re looking for. Perhaps " +"searching can help." +msgstr "" + +#: template-parts/content-page-no-title.php:21 +#: template-parts/content-page.php:25 template-parts/content-single.php:39 +#: template-parts/content.php:59 +msgid "Pages:" +msgstr "" + +#. translators: %s: theme name with URL +#: template-parts/footer/copyright-text.php:26 +msgctxt "footer credit" +msgid "Powered by %s" +msgstr "" + +#. translators: %s: theme name +#: template-parts/footer/copyright-text.php:29 +msgctxt "footer credit" +msgid "%s WordPress theme" +msgstr "" + +#: template-parts/header/primary-navbar.php:14 +msgid "Primary Menu" +msgstr "" + +#: template-parts/header/primary-navbar.php:15 +msgid "Toggle Primary Menu" +msgstr "" + +#: template-parts/header/top-navbar.php:18 +msgid "Social Links" +msgstr "" diff --git a/languages/pressbook.pot b/languages/pressbook.pot new file mode 100644 index 0000000..340aa15 --- /dev/null +++ b/languages/pressbook.pot @@ -0,0 +1,1690 @@ +# Copyright (C) 2023 Sophia Atkinson +# This file is distributed under the GNU General Public License v2 or later. +msgid "" +msgstr "" +"Project-Id-Version: CookTheBooks 1.0B\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2023-07-29T15:16:42+00:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"X-Generator: WP-CLI 2.5.0\n" +"X-Domain: CookTheBooks\n" + +#. Theme Name of the theme +msgid "CookTheBooks" +msgstr "" + +#. Description of the theme +msgid "CookTheBooks is a multi-purpose WordPress theme suitable for blogs, news, marketing, and educational websites. The theme offers a fully responsive, clean, modern, and pixel-perfect design that can adjust automatically to fit the content elements in the best possible manner for any screen-size device. It has a minimal dependency, an SEO-friendly layout, and offers high performance with a quick loading time. It supports double sidebars, a single sidebar, footer widgets, an eye-catching gradient colors scheme for buttons and the top bar, a top advertisement banner area with a custom header background, and customizable options. Both the sidebars can be configured to be shown on the left or on the right. This theme is great to publish documentation, tutorials, events, status updates, story updates, technology blogs, reviews, newsfeeds, etc. It comes with sticky sidebars that float with scrolling. The theme supports multiple page templates with page-level layout settings, blog layouts, conditional block areas, page builders, different color settings, footer options, and much more. Also, the theme comes with three menu locations which include a fully accessible multi-level primary menu with a search form, a top bar navigation menu, and social links menu. It is also great for building schools, university, institutes, and academic, or educational websites." +msgstr "" + +#. Author of the theme +msgid "Sophia Atkinson" +msgstr "" + +#. Author URI of the theme +msgid "https://sophia.wtf/" +msgstr "" + +#. translators: 1: number of comments, 2: post title +#: comments.php:35 +msgctxt "comments title" +msgid "Comment (%1$s) on “%2$s”" +msgid_plural "Comments (%1$s) on “%2$s”" +msgstr[0] "" +msgstr[1] "" + +#: comments.php:70 +msgid "Comments are closed." +msgstr "" + +#: footer.php:30 +msgid "Go to top" +msgstr "" + +#: header.php:24 +msgid "Skip to content" +msgstr "" + +#. translators: %s: WordPress Version. +#: inc/back-compat.php:28 +#: inc/back-compat.php:43 +#: inc/back-compat.php:64 +msgid "This theme requires WordPress 5.3 or newer. You are running version %s. Please upgrade." +msgstr "" + +#. translators: If there are characters in your language that are not supported by Inter, translate this to 'off'. Do not translate into your own language. +#: inc/core/Editor.php:107 +msgctxt "Inter font (in the editor): on or off" +msgid "on" +msgstr "" + +#. translators: If there are characters in your language that are not supported by Lato, translate this to 'off'. Do not translate into your own language. +#: inc/core/Editor.php:113 +msgctxt "Lato font (in the editor): on or off" +msgid "on" +msgstr "" + +#: inc/core/Enhance.php:102 +#: inc/core/Enhance.php:136 +msgid "Read More" +msgstr "" + +#. translators: 1: "Read More" text, 2: Name of current post. Only visible to screen readers +#: inc/core/Enhance.php:108 +msgctxt "excerpt more" +msgid "%1$s “%2$s” »" +msgstr "" + +#. translators: 1: "Read More" text, 2: Name of current post. Only visible to screen readers +#: inc/core/Enhance.php:142 +msgctxt "content more" +msgid "%1$s “%2$s” »" +msgstr "" + +#: inc/core/Menu.php:33 +msgid "Primary" +msgstr "" + +#: inc/core/Menu.php:34 +#: template-parts/header/top-navbar.php:36 +msgid "Top Menu" +msgstr "" + +#: inc/core/Menu.php:35 +msgid "Social Links Menu" +msgstr "" + +#: inc/core/Menu.php:55 +msgid "Toggle sub-menu" +msgstr "" + +#: inc/core/Menu.php:68 +msgid "Toggle search form" +msgstr "" + +#: inc/core/Options/BlockSection.php:29 +#: inc/core/Options/TopBanner.php:466 +msgid "Select a block" +msgstr "" + +#. translators: %s: URL to the pattern-blocks admin page. +#: inc/core/Options/BlockSection.php:46 +msgid "This is the content of the block section. You can create or edit the block section in the Pattern Blocks Manager (opens in a new window).
    After creating the pattern block, you may need to refresh this customizer page and then select the newly created block.
    The selected block content will appear on the block section." +msgstr "" + +#: inc/core/Options/Blog.php:49 +msgid "Blog Options" +msgstr "" + +#: inc/core/Options/Blog.php:50 +msgid "You can customize the blog options in here." +msgstr "" + +#: inc/core/Options/Blog.php:77 +msgid "Thumbnail-Content - Rows" +msgstr "" + +#: inc/core/Options/Blog.php:78 +msgid "Thumbnail-Content - Columns (Contain)" +msgstr "" + +#: inc/core/Options/Blog.php:79 +msgid "Thumbnail-Content - Columns (Cover)" +msgstr "" + +#: inc/core/Options/Blog.php:81 +msgid "Blog Archive Post Layout (Large-Screen Devices)" +msgstr "" + +#: inc/core/Options/Blog.php:82 +msgid "Select the layout for the blog post in archive pages. Default: Thumbnail-Content - Columns (Cover)" +msgstr "" + +#: inc/core/Options/Blog.php:123 +msgid "Full text" +msgstr "" + +#: inc/core/Options/Blog.php:124 +msgid "Summary" +msgstr "" + +#: inc/core/Options/Blog.php:126 +msgid "Blog Archive Content" +msgstr "" + +#: inc/core/Options/Blog.php:127 +msgid "Select the content to show in the blog archive pages. Default: Summary" +msgstr "" + +#: inc/core/Options/Blog.php:168 +msgid "Show Archive Page Title" +msgstr "" + +#: inc/core/Options/Blog.php:169 +msgid "In archive pages, you can show the archive title and archive description. This is applicable to any archive pages like tag, category, etc." +msgstr "" + +#: inc/core/Options/Blog.php:210 +msgid "Post Meta: Hide All" +msgstr "" + +#: inc/core/Options/Blog.php:211 +msgid "Hide all the post meta data including date, author, number of comments, etc." +msgstr "" + +#: inc/core/Options/Blog.php:237 +msgid "Post Meta: Hide Date" +msgstr "" + +#: inc/core/Options/Blog.php:238 +msgid "Hide only the post date. Checking the \"Post Meta: Hide All\" option will override this option." +msgstr "" + +#: inc/core/Options/Blog.php:264 +msgid "Post Meta: Hide Author" +msgstr "" + +#: inc/core/Options/Blog.php:265 +msgid "Hide only the post author. Checking the \"Post Meta: Hide All\" option will override this option." +msgstr "" + +#: inc/core/Options/Blog.php:291 +msgid "Post: Hide Categories" +msgstr "" + +#: inc/core/Options/Blog.php:292 +msgid "Hide the post categories." +msgstr "" + +#: inc/core/Options/Blog.php:318 +msgid "Post: Hide Tags" +msgstr "" + +#: inc/core/Options/Blog.php:319 +msgid "Hide the post tags." +msgstr "" + +#: inc/core/Options/Blog.php:381 +msgid "Featured (Sticky Post) Label" +msgstr "" + +#: inc/core/Options/Blog.php:382 +msgid "You can change the \"Featured\" label for the sticky posts. Leave it empty for default text." +msgstr "" + +#: inc/core/Options/Blog.php:414 +msgctxt "Label for sticky posts" +msgid "Featured" +msgstr "" + +#: inc/core/Options/Colors.php:52 +msgid "Header Background Color" +msgstr "" + +#: inc/core/Options/Colors.php:82 +msgid "Site Title Color" +msgstr "" + +#: inc/core/Options/Colors.php:109 +msgid "Tagline Color" +msgstr "" + +#: inc/core/Options/Colors.php:136 +msgid "Button Gradient Background 1" +msgstr "" + +#: inc/core/Options/Colors.php:166 +msgid "Button Gradient Background 2" +msgstr "" + +#: inc/core/Options/Content.php:38 +msgid "Content Layout" +msgstr "" + +#: inc/core/Options/Content.php:39 +msgid "You can customize the content layout options in here." +msgstr "" + +#: inc/core/Options/Content.php:65 +#: inc/core/Options/Sidebar.php:134 +msgid "Remove Top Padding" +msgstr "" + +#: inc/core/Options/Content.php:90 +#: inc/core/Options/Sidebar.php:159 +msgid "Remove Bottom Padding" +msgstr "" + +#: inc/core/Options/Content.php:115 +#: inc/core/Options/Sidebar.php:184 +msgid "Remove Horizontal Padding" +msgstr "" + +#: inc/core/Options/Fonts.php:46 +msgid "Fonts" +msgstr "" + +#: inc/core/Options/Fonts.php:47 +msgid "You can customize the fonts options in here." +msgstr "" + +#: inc/core/Options/Fonts.php:74 +msgid "Button Font Weight" +msgstr "" + +#: inc/core/Options/Fonts.php:75 +msgid "Default: 600" +msgstr "" + +#: inc/core/Options/Fonts.php:101 +msgid "Heading Font Weight" +msgstr "" + +#: inc/core/Options/Fonts.php:102 +#: inc/core/Options/Fonts.php:129 +msgid "Default: 700" +msgstr "" + +#: inc/core/Options/Fonts.php:128 +msgid "Site Title Font Weight" +msgstr "" + +#: inc/core/Options/Fonts.php:141 +msgctxt "Font Weight" +msgid "400" +msgstr "" + +#: inc/core/Options/Fonts.php:142 +msgctxt "Font Weight" +msgid "500" +msgstr "" + +#: inc/core/Options/Fonts.php:143 +msgctxt "Font Weight" +msgid "600" +msgstr "" + +#: inc/core/Options/Fonts.php:144 +msgctxt "Font Weight" +msgid "700" +msgstr "" + +#: inc/core/Options/Footer.php:41 +msgid "Footer Options" +msgstr "" + +#: inc/core/Options/Footer.php:42 +msgid "You can customize the footer options in here." +msgstr "" + +#: inc/core/Options/Footer.php:68 +msgid "Copyright Text" +msgstr "" + +#: inc/core/Options/Footer.php:69 +msgid "You can change the copyright text in the footer. You may use the following tags: em, strong, span, a, br." +msgstr "" + +#. translators: 1: current year, 2: blog name +#: inc/core/Options/Footer.php:94 +msgid "Copyright © %1$s %2$s." +msgstr "" + +#: inc/core/Options/Footer.php:95 +msgctxt "copyright date format" +msgid "Y" +msgstr "" + +#: inc/core/Options/Footer.php:137 +msgid "Hide Go To Top Button" +msgstr "" + +#: inc/core/Options/Footer.php:179 +msgid "Footer Background Color" +msgstr "" + +#: inc/core/Options/Footer.php:209 +msgid "Footer Credit Link Color" +msgstr "" + +#: inc/core/Options/FooterBlock.php:37 +msgid "Footer Block" +msgstr "" + +#: inc/core/Options/FooterBlock.php:38 +msgid "You can customize the footer block options in here." +msgstr "" + +#. translators: %s: footer block number +#: inc/core/Options/FooterBlock.php:73 +#: inc/core/Options/FooterBlock.php:100 +#: inc/core/Options/FooterBlock.php:126 +#: inc/core/Options/FooterBlock.php:152 +#: inc/core/Options/FooterBlock.php:178 +#: inc/core/Options/FooterBlock.php:204 +#: inc/core/Options/FooterBlock.php:230 +#: inc/core/Options/FooterBlock.php:256 +msgid "Footer Block %s" +msgstr "" + +#: inc/core/Options/FooterBlock.php:97 +#: inc/core/Options/HeaderBlock.php:97 +msgid "Set Full Width" +msgstr "" + +#: inc/core/Options/FooterBlock.php:123 +msgid "Bottom Margin" +msgstr "" + +#: inc/core/Options/FooterBlock.php:149 +#: inc/core/Options/HeaderBlock.php:149 +msgid "Show in Front Page" +msgstr "" + +#: inc/core/Options/FooterBlock.php:175 +#: inc/core/Options/HeaderBlock.php:175 +msgid "Show in Blog Page" +msgstr "" + +#: inc/core/Options/FooterBlock.php:201 +#: inc/core/Options/HeaderBlock.php:201 +msgid "Show in Archive Pages" +msgstr "" + +#: inc/core/Options/FooterBlock.php:227 +#: inc/core/Options/HeaderBlock.php:227 +msgid "Show in Posts" +msgstr "" + +#: inc/core/Options/FooterBlock.php:253 +#: inc/core/Options/HeaderBlock.php:253 +msgid "Show in Pages" +msgstr "" + +#: inc/core/Options/General.php:37 +msgid "General Options" +msgstr "" + +#: inc/core/Options/General.php:38 +msgid "You can customize the general options in here." +msgstr "" + +#: inc/core/Options/General.php:64 +msgid "Search Form Button Text" +msgstr "" + +#: inc/core/Options/General.php:65 +msgid "You can change the search form button text. Leave it empty for default text. This does not change the button text of search form widget block. To change that, you can directly edit the search form widget block in the editor itself." +msgstr "" + +#: inc/core/Options/General.php:106 +msgid "Read More Text" +msgstr "" + +#: inc/core/Options/General.php:107 +msgid "You can change the \"Read More\" text. Leave it empty for default text." +msgstr "" + +#: inc/core/Options/HeaderBlock.php:37 +msgid "Header Block" +msgstr "" + +#: inc/core/Options/HeaderBlock.php:38 +msgid "You can customize the header block options in here." +msgstr "" + +#. translators: %s: header block number +#: inc/core/Options/HeaderBlock.php:73 +#: inc/core/Options/HeaderBlock.php:100 +#: inc/core/Options/HeaderBlock.php:126 +#: inc/core/Options/HeaderBlock.php:152 +#: inc/core/Options/HeaderBlock.php:178 +#: inc/core/Options/HeaderBlock.php:204 +#: inc/core/Options/HeaderBlock.php:230 +#: inc/core/Options/HeaderBlock.php:256 +msgid "Header Block %s" +msgstr "" + +#: inc/core/Options/HeaderBlock.php:123 +msgid "Top Margin" +msgstr "" + +#: inc/core/Options/HeaderImage.php:49 +msgid "Header Background Position" +msgstr "" + +#: inc/core/Options/HeaderImage.php:50 +msgid "Default: Center Center" +msgstr "" + +#: inc/core/Options/HeaderImage.php:76 +msgid "Header Background Repeat" +msgstr "" + +#: inc/core/Options/HeaderImage.php:77 +msgid "Default: Repeat" +msgstr "" + +#: inc/core/Options/HeaderImage.php:103 +msgid "Header Background Size" +msgstr "" + +#: inc/core/Options/HeaderImage.php:104 +msgid "Default: Contain" +msgstr "" + +#: inc/core/Options/HeaderImage.php:116 +msgid "Left Top" +msgstr "" + +#: inc/core/Options/HeaderImage.php:117 +msgid "Left Center" +msgstr "" + +#: inc/core/Options/HeaderImage.php:118 +msgid "Left Bottom" +msgstr "" + +#: inc/core/Options/HeaderImage.php:119 +msgid "Right Top" +msgstr "" + +#: inc/core/Options/HeaderImage.php:120 +msgid "Right Center" +msgstr "" + +#: inc/core/Options/HeaderImage.php:121 +msgid "Right Bottom" +msgstr "" + +#: inc/core/Options/HeaderImage.php:122 +msgid "Center Top" +msgstr "" + +#: inc/core/Options/HeaderImage.php:123 +msgid "Center Center" +msgstr "" + +#: inc/core/Options/HeaderImage.php:124 +msgid "Center Bottom" +msgstr "" + +#: inc/core/Options/HeaderImage.php:135 +msgid "Repeat" +msgstr "" + +#: inc/core/Options/HeaderImage.php:136 +msgid "Repeat X" +msgstr "" + +#: inc/core/Options/HeaderImage.php:137 +msgid "Repeat Y" +msgstr "" + +#: inc/core/Options/HeaderImage.php:138 +msgid "No Repeat" +msgstr "" + +#: inc/core/Options/HeaderImage.php:149 +msgid "Auto" +msgstr "" + +#: inc/core/Options/HeaderImage.php:150 +msgid "Cover" +msgstr "" + +#: inc/core/Options/HeaderImage.php:151 +msgid "Contain" +msgstr "" + +#: inc/core/Options/PrimaryNavbar.php:38 +#: inc/welcome-page.php:137 +msgid "Primary Navbar" +msgstr "" + +#: inc/core/Options/PrimaryNavbar.php:39 +msgid "You can customize the primary navbar options in here." +msgstr "" + +#: inc/core/Options/PrimaryNavbar.php:66 +msgid "Primary Navbar Background Color" +msgstr "" + +#: inc/core/Options/PrimaryNavbar.php:96 +msgid "Enable Primary Navbar Search Form" +msgstr "" + +#: inc/core/Options/Sidebar.php:46 +msgid "Sidebar Layout" +msgstr "" + +#: inc/core/Options/Sidebar.php:47 +msgid "You can customize the sidebar layout options in here." +msgstr "" + +#: inc/core/Options/Sidebar.php:74 +msgid "One Left and One Right" +msgstr "" + +#: inc/core/Options/Sidebar.php:75 +msgid "Both Sidebars to the Left" +msgstr "" + +#: inc/core/Options/Sidebar.php:76 +msgid "Both Sidebars to the Right" +msgstr "" + +#: inc/core/Options/Sidebar.php:78 +msgid "Double Sidebars Layout (Large-Screen Devices)" +msgstr "" + +#: inc/core/Options/Sidebar.php:79 +msgid "Set the layout for the double sidebars. This applies only when both the sidebars (left and right) are active. A sidebar is active when there is at least one widget in it." +msgstr "" + +#: inc/core/Options/Sidebar.php:105 +msgid "Side Widget Border Color" +msgstr "" + +#: inc/core/Options/Sidebar.php:209 +msgid "Remove Box Shadow" +msgstr "" + +#: inc/core/Options/Sidebar.php:271 +msgid "Sticky-Floating Sidebar" +msgstr "" + +#: inc/core/Options/Sidebar.php:272 +msgid "You can enable or disable sticky sidebar that floats on scrolling." +msgstr "" + +#: inc/core/Options/SiteIdentity.php:72 +msgid "Hide Site Title" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:122 +msgid "Hide Site Tagline" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:271 +msgid "Logo Size (Small-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:272 +msgid "Logo Size (Medium-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:273 +msgid "Logo Size (Large-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:276 +msgctxt "Default: Logo Size (Small-Screen Devices)" +msgid "Default: Size 1" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:277 +msgctxt "Default: Logo Size (Medium-Screen Devices)" +msgid "Default: Size 1" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:278 +msgctxt "Default: Logo Size (Large-Screen Devices)" +msgid "Default: Size 1" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:291 +msgid "Site Title Size (Small-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:292 +msgid "Site Title Size (Medium-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:293 +msgid "Site Title Size (Large-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:296 +msgctxt "Default: Site Title Size (Small-Screen Devices)" +msgid "Default: Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:297 +msgctxt "Default: Site Title Size (Medium-Screen Devices)" +msgid "Default: Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:298 +msgctxt "Default: Site Title Size (Large-Screen Devices)" +msgid "Default: Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:311 +msgid "Tagline Size (Small-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:312 +msgid "Tagline Size (Medium-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:313 +msgid "Tagline Size (Large-Screen Devices)" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:316 +msgctxt "Default: Tagline Size (Small-Screen Devices)" +msgid "Default: Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:317 +msgctxt "Default: Tagline Size (Medium-Screen Devices)" +msgid "Default: Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:318 +msgctxt "Default: Tagline Size (Large-Screen Devices)" +msgid "Default: Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:357 +msgid "Size 1" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:358 +msgid "Size 2" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:359 +msgid "Size 3" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:360 +msgid "Size 4" +msgstr "" + +#: inc/core/Options/SiteIdentity.php:361 +msgid "Size 5" +msgstr "" + +#: inc/core/Options/TopBanner.php:52 +#: inc/welcome-page.php:63 +#: inc/welcome-page.php:69 +msgid "Top Banner" +msgstr "" + +#: inc/core/Options/TopBanner.php:53 +msgid "You can customize the top banner options in here." +msgstr "" + +#: inc/core/Options/TopBanner.php:80 +msgid "Top Banner Image" +msgstr "" + +#: inc/core/Options/TopBanner.php:81 +msgid "Select the top banner image. The theme works best with an image size of 728 x 90 pixels. " +msgstr "" + +#: inc/core/Options/TopBanner.php:111 +msgid "Top Banner Link - URL" +msgstr "" + +#: inc/core/Options/TopBanner.php:112 +msgid "Enter the URL for the banner link." +msgstr "" + +#: inc/core/Options/TopBanner.php:137 +msgid "Top Banner Link - Title" +msgstr "" + +#: inc/core/Options/TopBanner.php:138 +msgid "Enter the \"title\" attribute for the banner link." +msgstr "" + +#: inc/core/Options/TopBanner.php:163 +msgid "Top Banner Link - Rel" +msgstr "" + +#: inc/core/Options/TopBanner.php:164 +msgid "Enter the \"rel\" attribute for the banner link." +msgstr "" + +#: inc/core/Options/TopBanner.php:189 +msgid "Top Banner Link - Open in New Tab" +msgstr "" + +#: inc/core/Options/TopBanner.php:214 +msgid "Top Banner Shadow Effect" +msgstr "" + +#: inc/core/Options/TopBanner.php:239 +msgid "Top Banner Maximum Height" +msgstr "" + +#: inc/core/Options/TopBanner.php:240 +msgid "Set the maximum height allowed for the top banner image in pixels. Default: 150" +msgstr "" + +#: inc/core/Options/TopBanner.php:265 +msgid "Hide in Small-Screen Devices" +msgstr "" + +#: inc/core/Options/TopBanner.php:290 +msgid "Hide in Medium-Screen Devices" +msgstr "" + +#: inc/core/Options/TopBanner.php:419 +msgid "Top Banner Block Section" +msgstr "" + +#. translators: %s: URL to the pattern-blocks admin page. +#: inc/core/Options/TopBanner.php:423 +msgid "You can use this to replace top banner image and use any custom block (For example: \"Custom HTML block\"). This is the content of the block section. You can create or edit the block section in the Pattern Blocks Manager (opens in a new window).
    After creating the pattern block, you may need to refresh this customizer page and then select the newly created block.
    The selected block content will appear on the block section, replacing the top banner image and overriding its related options." +msgstr "" + +#: inc/core/Options/TopNavbar.php:38 +#: inc/welcome-page.php:126 +msgid "Top Navbar" +msgstr "" + +#: inc/core/Options/TopNavbar.php:39 +msgid "You can customize the top navbar options in here." +msgstr "" + +#: inc/core/Options/TopNavbar.php:66 +msgid "Top Navbar Gradient Background 1" +msgstr "" + +#: inc/core/Options/TopNavbar.php:96 +msgid "Top Navbar Gradient Background 2" +msgstr "" + +#: inc/core/Options/Upsell.php:45 +msgid "Premium Available" +msgstr "" + +#: inc/core/Options/Upsell.php:46 +#: inc/welcome-page.php:115 +msgid "Get Premium" +msgstr "" + +#: inc/core/Options/Upsell.php:60 +#: inc/core/Options/Upsell.php:76 +#: inc/core/Options/Upsell.php:92 +#: inc/core/Options/Upsell.php:108 +#: inc/core/Options/Upsell.php:124 +#: inc/core/Options/Upsell.php:140 +#: inc/core/Options/Upsell.php:156 +#: inc/core/Options/Upsell.php:172 +#: inc/core/Options/Upsell.php:188 +#: inc/core/Options/Upsell.php:204 +#: inc/core/Options/Upsell.php:220 +msgid "Learn More" +msgstr "" + +#: inc/core/Options/Upsell.php:61 +msgid "More color options like button text color, link color, theme accent color, RGBA colors, fonts selector, and many more options are available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:77 +msgid "Advanced typography settings: font-family, font-size, body font-weight, line-height, over 50+ Google fonts, and custom Google font loader are available to select for the headings and body text in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:93 +msgid "Multiple eye-catching block patterns, custom gradient color options, header blocks, footer blocks, and many more options are available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:109 +msgid "Multiple eye-catching block patterns, custom gradient color scheme, header blocks, footer blocks are available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:125 +msgid "More color options for primary navigation are available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:141 +msgid "More header blocks and footer blocks are available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:157 +msgid "More footer blocks and header blocks are available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:173 +msgid "Content background, text color, button color, link color and many more options are available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:189 +msgid "Sidebar background, text color, post meta color, and many more options are available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:205 +msgid "More blog options and advanced theme options are available in our premium version." +msgstr "" + +#: inc/core/Options/Upsell.php:221 +msgid "More footer and color options are available in our premium version." +msgstr "" + +#: inc/core/PageSettings.php:28 +msgid "CookTheBooks Page Settings" +msgstr "" + +#: inc/core/PageSettings.php:120 +msgid "Disable Header Title" +msgstr "" + +#: inc/core/PageSettings.php:125 +msgid "Remove Top Margin" +msgstr "" + +#: inc/core/PageSettings.php:130 +msgid "Remove Bottom Margin" +msgstr "" + +#: inc/core/PageSettings.php:133 +msgid "Below settings override customizer settings for page content layout (only if checked)." +msgstr "" + +#: inc/core/PageSettings.php:137 +msgid "Force Remove Top Padding" +msgstr "" + +#: inc/core/PageSettings.php:142 +msgid "Force Remove Bottom Padding" +msgstr "" + +#: inc/core/PageSettings.php:147 +msgid "Force Remove Horizontal Padding" +msgstr "" + +#: inc/core/PageSettings.php:152 +msgid "Force Transparent Background" +msgstr "" + +#. translators: If there are characters in your language that are not supported by Inter, translate this to 'off'. Do not translate into your own language. +#: inc/core/Scripts.php:72 +msgctxt "Inter font: on or off" +msgid "on" +msgstr "" + +#. translators: If there are characters in your language that are not supported by Lato, translate this to 'off'. Do not translate into your own language. +#: inc/core/Scripts.php:78 +msgctxt "Lato font: on or off" +msgid "on" +msgstr "" + +#. translators: %s: post date +#: inc/core/TemplateTags.php:65 +msgctxt "post date" +msgid "Posted on %s" +msgstr "" + +#. translators: %s: post author +#: inc/core/TemplateTags.php:98 +msgctxt "post author" +msgid "By %s" +msgstr "" + +#: inc/core/TemplateTags.php:161 +msgctxt "String to use before the tags for screen readers." +msgid "Tags:" +msgstr "" + +#: inc/core/Widget.php:35 +msgid "Left Sidebar" +msgstr "" + +#: inc/core/Widget.php:37 +#: inc/core/Widget.php:49 +#: inc/core/Widget.php:63 +#: inc/core/WooCommerce.php:75 +msgid "Add widgets here." +msgstr "" + +#: inc/core/Widget.php:47 +msgid "Right Sidebar" +msgstr "" + +#. translators: %s: footer widgets area number +#: inc/core/Widget.php:61 +msgid "Footer Widgets Area %s" +msgstr "" + +#: inc/core/WooCommerce.php:73 +msgid "Shop Sidebar" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:327 +msgid "Install Required Plugins" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:328 +msgid "Install Plugins" +msgstr "" + +#. translators: %s: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:330 +msgid "Installing Plugin: %s" +msgstr "" + +#. translators: %s: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:332 +msgid "Updating Plugin: %s" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:333 +msgid "Something went wrong with the plugin API." +msgstr "" + +#. translators: 1: plugin name(s). +#: inc/libs/class-tgm-plugin-activation.php:335 +msgid "This theme requires the following plugin: %1$s." +msgid_plural "This theme requires the following plugins: %1$s." +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: plugin name(s). +#: inc/libs/class-tgm-plugin-activation.php:341 +msgid "This theme recommends the following plugin: %1$s." +msgid_plural "This theme recommends the following plugins: %1$s." +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: plugin name(s). +#: inc/libs/class-tgm-plugin-activation.php:347 +msgid "The following plugin needs to be updated to its latest version to ensure maximum compatibility with this theme: %1$s." +msgid_plural "The following plugins need to be updated to their latest version to ensure maximum compatibility with this theme: %1$s." +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: plugin name(s). +#: inc/libs/class-tgm-plugin-activation.php:353 +msgid "There is an update available for: %1$s." +msgid_plural "There are updates available for the following plugins: %1$s." +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: plugin name(s). +#: inc/libs/class-tgm-plugin-activation.php:359 +msgid "The following required plugin is currently inactive: %1$s." +msgid_plural "The following required plugins are currently inactive: %1$s." +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: plugin name(s). +#: inc/libs/class-tgm-plugin-activation.php:365 +msgid "The following recommended plugin is currently inactive: %1$s." +msgid_plural "The following recommended plugins are currently inactive: %1$s." +msgstr[0] "" +msgstr[1] "" + +#: inc/libs/class-tgm-plugin-activation.php:370 +msgid "Begin installing plugin" +msgid_plural "Begin installing plugins" +msgstr[0] "" +msgstr[1] "" + +#: inc/libs/class-tgm-plugin-activation.php:375 +msgid "Begin updating plugin" +msgid_plural "Begin updating plugins" +msgstr[0] "" +msgstr[1] "" + +#: inc/libs/class-tgm-plugin-activation.php:380 +msgid "Begin activating plugin" +msgid_plural "Begin activating plugins" +msgstr[0] "" +msgstr[1] "" + +#: inc/libs/class-tgm-plugin-activation.php:385 +msgid "Return to Required Plugins Installer" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:386 +#: inc/libs/class-tgm-plugin-activation.php:827 +#: inc/libs/class-tgm-plugin-activation.php:2533 +#: inc/libs/class-tgm-plugin-activation.php:3590 +msgid "Return to the Dashboard" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:387 +#: inc/libs/class-tgm-plugin-activation.php:3159 +msgid "Plugin activated successfully." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:388 +#: inc/libs/class-tgm-plugin-activation.php:2952 +msgid "The following plugin was activated successfully:" +msgid_plural "The following plugins were activated successfully:" +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:390 +msgid "No action taken. Plugin %1$s was already active." +msgstr "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:392 +msgid "Plugin not activated. A higher version of %s is needed for this theme. Please update the plugin." +msgstr "" + +#. translators: 1: dashboard link. +#: inc/libs/class-tgm-plugin-activation.php:394 +msgid "All plugins installed and activated successfully. %1$s" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:395 +msgid "Dismiss this notice" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:396 +msgid "There are one or more required or recommended plugins to install, update or activate." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:397 +msgid "Please contact the administrator of this site for help." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:522 +msgid "This plugin needs to be updated to be compatible with your theme." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:523 +msgid "Update Required" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:934 +msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:934 +#: inc/libs/class-tgm-plugin-activation.php:937 +msgid "Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:937 +msgid "The remote plugin package consists of more than one file, but the files are not packaged in a folder." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:1121 +#: inc/libs/class-tgm-plugin-activation.php:2948 +msgctxt "plugin A *and* plugin B" +msgid "and" +msgstr "" + +#. translators: %s: version number +#: inc/libs/class-tgm-plugin-activation.php:1982 +msgid "TGMPA v%s" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2273 +msgid "Required" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2276 +msgid "Recommended" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2292 +msgid "WordPress Repository" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2295 +msgid "External Source" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2298 +msgid "Pre-Packaged" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2315 +msgid "Not Installed" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2319 +msgid "Installed But Not Activated" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2321 +msgid "Active" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2327 +msgid "Required Update not Available" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2330 +msgid "Requires Update" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2333 +msgid "Update recommended" +msgstr "" + +#. translators: 1: install status, 2: update status +#: inc/libs/class-tgm-plugin-activation.php:2342 +msgctxt "Install/Update Status" +msgid "%1$s, %2$s" +msgstr "" + +#. translators: 1: number of plugins. +#: inc/libs/class-tgm-plugin-activation.php:2388 +msgctxt "plugins" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: number of plugins. +#: inc/libs/class-tgm-plugin-activation.php:2392 +msgid "To Install (%s)" +msgid_plural "To Install (%s)" +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: number of plugins. +#: inc/libs/class-tgm-plugin-activation.php:2396 +msgid "Update Available (%s)" +msgid_plural "Update Available (%s)" +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: number of plugins. +#: inc/libs/class-tgm-plugin-activation.php:2400 +msgid "To Activate (%s)" +msgid_plural "To Activate (%s)" +msgstr[0] "" +msgstr[1] "" + +#: inc/libs/class-tgm-plugin-activation.php:2482 +msgctxt "as in: \"version nr unknown\"" +msgid "unknown" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2490 +msgid "Installed version:" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2498 +msgid "Minimum required version:" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2510 +msgid "Available version:" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2533 +msgid "No plugins to install, update or activate." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2547 +msgid "Plugin" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2548 +msgid "Source" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2549 +msgid "Type" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2553 +msgid "Version" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2554 +msgid "Status" +msgstr "" + +#. translators: %2$s: plugin name in screen reader markup +#: inc/libs/class-tgm-plugin-activation.php:2603 +msgid "Install %2$s" +msgstr "" + +#. translators: %2$s: plugin name in screen reader markup +#: inc/libs/class-tgm-plugin-activation.php:2608 +msgid "Update %2$s" +msgstr "" + +#. translators: %2$s: plugin name in screen reader markup +#: inc/libs/class-tgm-plugin-activation.php:2614 +msgid "Activate %2$s" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2684 +msgid "Upgrade message from the plugin author:" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2717 +msgid "Install" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2723 +msgid "Update" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2726 +msgid "Activate" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2757 +msgid "No plugins were selected to be installed. No action taken." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2759 +msgid "No plugins were selected to be updated. No action taken." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2800 +msgid "No plugins are available to be installed at this time." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2802 +msgid "No plugins are available to be updated at this time." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2908 +msgid "No plugins were selected to be activated. No action taken." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:2934 +msgid "No plugins are available to be activated at this time." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:3158 +msgid "Plugin activation failed." +msgstr "" + +#. translators: 1: plugin name, 2: action number 3: total number of actions. +#: inc/libs/class-tgm-plugin-activation.php:3498 +msgid "Updating Plugin %1$s (%2$d/%3$d)" +msgstr "" + +#. translators: 1: plugin name, 2: error message. +#: inc/libs/class-tgm-plugin-activation.php:3503 +msgid "An error occurred while installing %1$s: %2$s." +msgstr "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:3505 +msgid "The installation of %1$s failed." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:3508 +msgid "The installation and activation process is starting. This process may take a while on some hosts, so please be patient." +msgstr "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:3510 +#: inc/libs/class-tgm-plugin-activation.php:3512 +msgid "%1$s installed and activated successfully." +msgstr "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:3510 +#: inc/libs/class-tgm-plugin-activation.php:3520 +#: inc/libs/class-tgm-plugin-activation.php:3530 +msgid "Show Details" +msgstr "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:3510 +#: inc/libs/class-tgm-plugin-activation.php:3520 +#: inc/libs/class-tgm-plugin-activation.php:3530 +msgid "Hide Details" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:3513 +msgid "All installations and activations have been completed." +msgstr "" + +#. translators: 1: plugin name, 2: action number 3: total number of actions. +#: inc/libs/class-tgm-plugin-activation.php:3515 +msgid "Installing and Activating Plugin %1$s (%2$d/%3$d)" +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:3518 +msgid "The installation process is starting. This process may take a while on some hosts, so please be patient." +msgstr "" + +#. translators: 1: plugin name. +#: inc/libs/class-tgm-plugin-activation.php:3520 +#: inc/libs/class-tgm-plugin-activation.php:3522 +msgid "%1$s installed successfully." +msgstr "" + +#: inc/libs/class-tgm-plugin-activation.php:3523 +msgid "All installations have been completed." +msgstr "" + +#. translators: 1: plugin name, 2: action number 3: total number of actions. +#: inc/libs/class-tgm-plugin-activation.php:3525 +msgid "Installing Plugin %1$s (%2$d/%3$d)" +msgstr "" + +#: inc/welcome-page.php:13 +msgctxt "page title" +msgid "CookTheBooks" +msgstr "" + +#: inc/welcome-page.php:14 +msgctxt "menu title" +msgid "CookTheBooks" +msgstr "" + +#. translators: 1: theme name, 2: theme version number +#: inc/welcome-page.php:38 +msgctxt "menu page heading" +msgid "%1$s Version %2$s" +msgstr "" + +#: inc/welcome-page.php:52 +msgid "Customize Theme" +msgstr "" + +#: inc/welcome-page.php:54 +msgid "You can customize the theme using the theme options available in the customizer." +msgstr "" + +#: inc/welcome-page.php:58 +msgid "Theme Options" +msgstr "" + +#: inc/welcome-page.php:65 +msgid "You can add the top banner image and link from the Customizer > Top Banner." +msgstr "" + +#: inc/welcome-page.php:74 +msgid "Menus & Social Links" +msgstr "" + +#: inc/welcome-page.php:76 +msgid "You can create a menu and assign it to a menu location. CookTheBooks comes with three menu locations which include the primary menu, top bar menu, and social links menu. For social links, create a menu item with a custom link, enter the URL of the social page, and assign this menu to the \"Social Links Menu\" location." +msgstr "" + +#: inc/welcome-page.php:80 +msgid "Menus" +msgstr "" + +#: inc/welcome-page.php:85 +msgid "Premium Version" +msgstr "" + +#: inc/welcome-page.php:87 +msgid "CookTheBooks Premium comes with additional features:" +msgstr "" + +#: inc/welcome-page.php:91 +msgid "Dark and Light Color Schemes - Fully Customizable" +msgstr "" + +#: inc/welcome-page.php:92 +msgid "Dark and Light Editor Styles - Block Editor" +msgstr "" + +#: inc/welcome-page.php:93 +msgid "Alpha Transparency Effect with Background Image" +msgstr "" + +#: inc/welcome-page.php:94 +msgid "Sidebar Layout Custom Background Color" +msgstr "" + +#: inc/welcome-page.php:95 +msgid "Content Layout Custom Background Color" +msgstr "" + +#: inc/welcome-page.php:96 +msgid "4 Header Block Areas with Multiple Options" +msgstr "" + +#: inc/welcome-page.php:97 +msgid "3 Footer Block Areas with Multiple Options" +msgstr "" + +#: inc/welcome-page.php:98 +msgid "Multiple Posts Carousels with Advanced Options" +msgstr "" + +#: inc/welcome-page.php:99 +msgid "Footer Text Color, Link Color & Additional Options" +msgstr "" + +#: inc/welcome-page.php:100 +msgid "Standard Grid Layout and Masonry Grid Layout" +msgstr "" + +#: inc/welcome-page.php:103 +msgid "Header, Footer, Content, Sidebars - Dark and Light Schemes" +msgstr "" + +#: inc/welcome-page.php:104 +msgid "Post Meta, Comment Meta Text Color & Link Color" +msgstr "" + +#: inc/welcome-page.php:105 +msgid "Custom Gradient Colors for Buttons" +msgstr "" + +#: inc/welcome-page.php:106 +msgid "Custom Accent Colors - Links, Text, Heading, Hover Colors" +msgstr "" + +#: inc/welcome-page.php:107 +msgid "Custom Google Fonts for Headings and Body Text" +msgstr "" + +#: inc/welcome-page.php:108 +msgid "Typography Settings - Global Font-Size, Font-Family, Line-Height" +msgstr "" + +#: inc/welcome-page.php:109 +msgid "Unlimited Color Options & Advanced Theme Options" +msgstr "" + +#: inc/welcome-page.php:110 +msgid "Header Posts and Related Posts Grid with Advanced Options" +msgstr "" + +#: inc/welcome-page.php:111 +msgid "Multiple Design for Site Branding, Top Navbar, Primary Navbar" +msgstr "" + +#: inc/welcome-page.php:112 +msgid "Multiple Eye-Catching Block Patterns to Quickly Create Sections" +msgstr "" + +#: inc/welcome-page.php:120 +msgid "Top Menu Options & Colors" +msgstr "" + +#: inc/welcome-page.php:122 +msgid "You can configure the options and change the colors of the top navbar from the Customizer > Top Navbar." +msgstr "" + +#: inc/welcome-page.php:131 +msgid "Primary Menu Options & Colors" +msgstr "" + +#: inc/welcome-page.php:133 +msgid "You can configure the options and change the colors of the primary navbar from the Customizer > Primary Navbar." +msgstr "" + +#: inc/welcome-page.php:142 +msgid "Header / Background Color & Image" +msgstr "" + +#: inc/welcome-page.php:144 +msgid "You can customize the header image from the Customizer > Header Image and body background image from the Customizer > Background Image. Also, you can change the header and body background color from the Customizer > Colors." +msgstr "" + +#: inc/welcome-page.php:148 +msgid "Theme Colors" +msgstr "" + +#: inc/welcome-page.php:149 +msgid "Header Image" +msgstr "" + +#: inc/welcome-page.php:150 +msgid "Background Image" +msgstr "" + +#: inc/welcome-page.php:155 +msgid "Header Block Area" +msgstr "" + +#: inc/welcome-page.php:157 +msgid "You can enable the header block area by creating a block in the pattern block manager. Then select this block in the Customizer > Header Block. CookTheBooks comes with 1 header block area." +msgstr "" + +#: inc/welcome-page.php:161 +msgid "Header Blocks" +msgstr "" + +#: inc/welcome-page.php:162 +#: inc/welcome-page.php:174 +msgid "Pattern Blocks" +msgstr "" + +#: inc/welcome-page.php:167 +msgid "Footer Block Area" +msgstr "" + +#: inc/welcome-page.php:169 +msgid "You can enable the footer block area by creating a block in the pattern block manager. Then select this block in the Customizer > Footer Block. CookTheBooks comes with 1 footer block area." +msgstr "" + +#: inc/welcome-page.php:173 +msgid "Footer Blocks" +msgstr "" + +#: inc/welcome-page.php:179 +msgid "Sidebar & Footer Widgets" +msgstr "" + +#: inc/welcome-page.php:181 +msgid "You can drag and drop widgets to the widget area. CookTheBooks comes with 6 widgets area locations which include a left sidebar, right sidebar, and 4 locations for footer widgets." +msgstr "" + +#: inc/welcome-page.php:185 +msgid "Add / Manage Widgets" +msgstr "" + +#: inc/welcome-page.php:190 +msgid "Page Template & Page Settings" +msgstr "" + +#: inc/welcome-page.php:192 +msgid "When adding or editing a page, there are many page templates to choose from. Also, you can configure the page settings for any specific page. These templates and settings are available on the sidebar area of the page editor screen." +msgstr "" + +#: inc/welcome-page.php:198 +msgid "Page Template with Sidebar" +msgstr "" + +#: inc/welcome-page.php:200 +msgid "There are many page templates available to choose from. You can simply edit the page and on the right side of the page editor screen, set the template from \"Template\" to \"Page with sidebar\"." +msgstr "" + +#: inc/welcome-page.php:203 +msgid "Similarly, you can set the page template to full width, large width, medium width, small width, or default template without sidebar." +msgstr "" + +#. translators: 1: theme name, 2: welcome page link. +#: inc/welcome-page.php:236 +msgid "Welcome! Thank you for choosing %1$s theme. To get started, visit our welcome page." +msgstr "" + +#. translators: %s: theme name +#: inc/welcome-page.php:249 +msgid "Get started with %s" +msgstr "" + +#. translators: %s: search query +#: index.php:45 +msgid "Search Results for: %s" +msgstr "" + +#. Template Name of the theme +msgid "Full width template" +msgstr "" + +#. Template Name of the theme +msgid "Large width template" +msgstr "" + +#. Template Name of the theme +msgid "Medium width template" +msgstr "" + +#. Template Name of the theme +msgid "Page with sidebar" +msgstr "" + +#. Template Name of the theme +msgid "Small width template" +msgstr "" + +#: single.php:28 +msgid "Previous Post:" +msgstr "" + +#: single.php:30 +msgid "Next Post:" +msgstr "" + +#: template-parts/content-none.php:14 +msgid "Nothing Found" +msgstr "" + +#. translators: 1: link to WP admin new post page +#: template-parts/content-none.php:24 +msgid "Ready to publish your first post? Get started here." +msgstr "" + +#: template-parts/content-none.php:37 +msgid "Sorry, but nothing matched your search terms. Please try again with some different keywords." +msgstr "" + +#: template-parts/content-none.php:44 +msgid "It seems we can’t find what you’re looking for. Perhaps searching can help." +msgstr "" + +#: template-parts/content-page-no-title.php:21 +#: template-parts/content-page.php:25 +#: template-parts/content-single.php:39 +#: template-parts/content.php:59 +msgid "Pages:" +msgstr "" + +#. translators: %s: theme name with URL +#: template-parts/footer/copyright-text.php:26 +msgctxt "footer credit" +msgid "Powered by %s" +msgstr "" + +#. translators: %s: theme name +#: template-parts/footer/copyright-text.php:29 +msgctxt "footer credit" +msgid "%s WordPress theme" +msgstr "" + +#: template-parts/header/primary-navbar.php:14 +msgid "Primary Menu" +msgstr "" + +#: template-parts/header/primary-navbar.php:15 +msgid "Toggle Primary Menu" +msgstr "" + +#: template-parts/header/top-navbar.php:18 +msgid "Social Links" +msgstr "" diff --git a/license.txt b/license.txt new file mode 100644 index 0000000..23cb790 --- /dev/null +++ b/license.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/page-templates/full.php b/page-templates/full.php new file mode 100644 index 0000000..4846091 --- /dev/null +++ b/page-templates/full.php @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Themes and click the Add New button. +2. Click Upload Theme and Choose File, then select the theme's .zip file. Click Install Now. +3. Click Activate to use your new theme right away. + +== Frequently Asked Questions == + += Does this theme support any plugins? = + +CookTheBooks includes support for WooCommerce and for Infinite Scroll in Jetpack. + += Where to find the theme options? = + +All of the options can be found in the Customizer in 'Appearance > Customize'. + += How to configure the theme widgets? = + +The theme widgets can be found in 'Appearance > Widgets'. You can drag and drop widgets to the widget area. CookTheBooks comes with 6 widgets area locations which include a left sidebar, right sidebar widgets area and 4 locations for footer widgets. + += How to add the menus or social links? = + +The menus can be found in 'Appearance > Menus'. First, create the menu and then assign it to a menu location. CookTheBooks comes with three menu locations which include the primary menu, top bar menu, and social links menu. For social links, create a menu item with a custom link, enter the URL of the social page, and assign this menu to the 'Social Links Menu' location. + +== Copyright == + +CookTheBooks is distributed under the terms of the GNU GPL. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +== Changelog == + += 1.0B = +* Added: New SVG social icons. + += 1.9.0 = +* Improvement: Editor styles fixes. + += 1.8.9 = +* Added: New SVG social icons. + += 1.8.8 = +* Fixed issues related to version 1.8.6. + += 1.8.7 = +* Reverted changes of version 1.8.6. + += 1.8.6 = +* Updated webfonts loader library. +* Renamed reusable blocks to patterns. +* Improvement: Minor CSS fixes. +* Tested up to 6.3. + += 1.8.5 = +* Added: New SVG social icons. + += 1.8.4 = +* Improvement: Minor CSS fixes. + += 1.8.3 = +* Improvement: Removed JS deprecations. + += 1.8.2 = +* Improvement: Minor CSS fixes. +* Readme updated. + += 1.8.1 = +* Improvement: Minor CSS fixes. + += 1.8.0 = +* Readme updated. + += 1.7.9 = +* Improvement: SVG icons. + += 1.7.8 = +* Readme updated. +* Updated plugins recommendation list. + += 1.7.7 = +* Improvement: Added label to primary menu toggle button. + += 1.7.6 = +* Added: Support for custom line height controls. + += 1.7.5 = +* Added: Support for more social link SVG icons. + += 1.7.4 = +* Tested up to 6.1. + += 1.7.3 = +* Improvement: Editor CSS fixes. + += 1.7.2 = +* Improvement: Minor CSS fixes. + += 1.7.1 = +* New: Option to show or hide archive page title. + += 1.7.0 = +* New: Added option to use any custom blocks in the top banner section. + += 1.6.8 = +* Readme updated. + += 1.6.7 = +* Improvement: Minor CSS fixes. +* Improvement: Readme updated. + += 1.6.6 = +* Bug fix: Locally load fonts in the editor. + += 1.6.5 = +* Locally host Google fonts. + += 1.6.4 = +* Improvement: Minor CSS fixes. + += 1.6.3 = +* Changed "Requires PHP" tag to 7.0. +* Updated plugins recommendation list. + += 1.6.2 = +* Tested up to 6.0. + += 1.6.1 = +* Improvement: Minor CSS fixes. + += 1.6.0 = +* Improvement: Added theme support for padding controls. + += 1.5.9 = +* Updated plugins recommendation list. + += 1.5.8 = +* Improvement: Welcome page FAQ link removed. + += 1.5.7 = +* Improvement: Check for Jetpack before adding theme support. + += 1.5.6 = +* Improvement: Welcome page styles. +* Improvement: Fixed typos in welcome page. + += 1.5.5 = +* Improvement: Welcome page updated. + += 1.5.4 = +* Improvement: Reduced z-index of submenu for compatibility with "Dark Mode Toggle" plugin. + += 1.5.3 = +* New: "Dark Mode Toggle" added to plugin recommendation list. + += 1.5.2 = +* Improvement: Added more utility CSS classes. + += 1.5.1 = +* Improvement: Minor CSS fixes. + += 1.5.0 = +* Removed unused CSS. + += 1.4.6 = +* Tested up to 5.9. + += 1.4.5 = +* Improvement: Minor CSS fixes. + += 1.4.4 = +* Improvement: Minor CSS fixes. +* Improvement: Block styles. + += 1.4.3 = +* Improvement: Minor CSS fixes. + += 1.4.2 = +* Added: Styles for default colors and font sizes. + += 1.4.1 = +* Theme version incremented to 1.4.1. + += 1.4.0 = +* Improvement: Minor CSS fixes. + += 1.3.9 = +* Improvement: Added h1 title in archive and search pages for screen readers. + += 1.3.8 = +* Theme version incremented to 1.3.8. + += 1.3.7 = +* Improvement: Block social links style in widget areas. + += 1.3.6 = +* Improvement: Removed 100% height for input fields. + += 1.3.5 = +* Added: Option to hide the go to top button. + += 1.3.4 = +* Improvement: Welcome page updated. + += 1.3.3 = +* Added: Featured label text option for the sticky posts. +* Added: Double Sidebars layout options. + += 1.3.2 = +* Improvement: Widgets editor style. + += 1.3.1 = +* Added: Widgets editor style. + += 1.3.0 = +* Improvement: Removed editor styles from block widgets screen. + += 1.2.8 = +* Tested up to 5.8. + += 1.2.7 = +* Bug fix: Widget search form max width. + += 1.2.6 = +* Bug fix: Make anchor link inherit color of paragraph text color. + += 1.2.5 = +* Improvement: Styling of widget block title. +* Improvement: Styling of widget search block. + += 1.2.4 = +* Improvement: Fixed menu dropdown arrow alignment to center. +* Improvement: Welcome page updated. + += 1.2.3 = +* New: Options to show/hide the post categories and tags. + += 1.2.2 = +* Improvement: Added context to translation functions. +* Improvement: Minor fixes. + += 1.2.1 = +* Improvement: Description on the usage of block sections. +* Improvement: Minor CSS fixes. +* Improvement: Fixed typos. + += 1.2.0 = +* Improvement: Easily override CSSRules class in child theme with late static binding. +* Improvement: Minor CSS fixes. +* New: Footer credit link color option. + += 1.1.9 = +* Improvement: Fixed typos. + += 1.1.8 = +* Improvement: Menu search form minimum and maximum width. + += 1.1.7 = +* New: Added new option to change the "Read More" text. + += 1.1.6 = +* New: Added new option to hide post meta data. +* New: Added new option to show post excerpt or full content. + += 1.1.5 = +* Improvement: Minor CSS adjustments. +* New: Added button gradient color options. + += 1.1.4 = +* New: Added "Getwid – Gutenberg Blocks" in the list of recommended plugins. + += 1.1.3 = +* Improvement: Removed block width in the editor. + += 1.1.2 = +* Bug fix: Compatibility with page builder plugins. + += 1.1.1 = +* New: Added option to change the search form button text. + += 1.1.0 = +* Improvement: Welcome page updated. +* Improvement: Push footer to the bottom when there is less content. + += 1.0.6 = +* Theme screenshot updated. + += 1.0.5 = +* Better accessibility for widgets with lists of links. +* Tested up to 5.7. + += 1.0.4 = +* New release. + +== Credits == + +CookTheBooks bundles the following third-party resources: + +* Image 1 for theme screenshot, Copyright Helloquence +* License: Creative Commons CC0 license +* License URI: https://stocksnap.io/license +* Source: https://stocksnap.io/photo/Y01VDYAX63 + +* Image 2 for theme screenshot, Copyright Dan Gold +* License: Creative Commons CC0 license +* License URI: https://stocksnap.io/license +* Source: https://stocksnap.io/photo/PQBKOX33PD + +* Image 3 for theme screenshot, Copyright Denis Linine +* License: Creative Commons CC0 license +* License URI: https://stocksnap.io/license +* Source: https://stocksnap.io/photo/RSJHQZIRHO + +* Social Icons +* License: GNU General Public License v2 or later +* License URI: http://www.gnu.org/licenses/gpl-2.0.html +* Source: WordPress Social Link Block (See wp-includes\blocks\social-link.php) + +Code from Twenty Nineteen, Copyright WordPress.org +License: GPLv2 +Source: https://wordpress.org/themes/twentynineteen/ +Included as part of the following classes and functions: +- CookTheBooks\Icons +- CookTheBooks\IconsHelper::get_icon_svg() +- CookTheBooks\IconsHelper::get_social_icon_svg() +- CookTheBooks\IconsHelper::get_social_link_svg() +- CookTheBooks\IconsHelper::nav_menu_social_icons() + +Code from Twenty Twenty, Copyright WordPress.org +License: GPLv2 +Source: https://wordpress.org/themes/twentytwenty/ +Included as part of the following classes and functions: +- CookTheBooks\IconsHelper::get_theme_svg() +- CookTheBooks\IconsHelper::the_theme_svg() +- JavaScript code in script.js + - CookTheBooksDomReady() + - CookTheBooks.setupMainMenu.trapFocusInModal() + - CookTheBooks.setupMainMenu.collapseIfEscapeKeyPress() + +* SVG UI Icons +* License: SIL Open Font License (OFL) +* Source: https://www.iconfinder.com/iconsets/font-awesome + +* Alpha Color Picker Customizer Control (c) Cristian-Ungureanu +* License: MIT License, https://github.com/Codeinwp/customizer-controls/blob/master/LICENSE +* Source: https://github.com/Codeinwp/customizer-controls/tree/master/customizer-alpha-color-picker + +* Customizer Upsell Section +* License: GPLv2, https://github.com/WPTT/customize-section-button/blob/master/license.md +* Source: https://github.com/WPTT/customize-section-button +Included as part of the following class: +- CookTheBooks_Upsell_Section + +* Sticky Sidebar +* License: MIT License, https://github.com/blixhavn/sticky-sidebar-v2/blob/master/LICENSE.md +* Source: https://github.com/blixhavn/sticky-sidebar-v2 + +* ResizeObserver Polyfill +* License: MIT License, https://github.com/que-etc/resize-observer-polyfill/blob/master/LICENSE +* Source: https://github.com/que-etc/resize-observer-polyfill + +* Composer Autoloader +* License: MIT License, https://github.com/composer/composer/blob/master/LICENSE +* Source: https://getcomposer.org/ + +* Webfonts Loader +* License: MIT License, https://github.com/WPTT/webfont-loader/blob/master/LICENSE +* Source: https://github.com/WPTT/webfont-loader + +* TGM Plugin Activation - v2.6.1, http://tgmpluginactivation.com/, By Thomas Griffin, Gary Jones, Juliette Reinders Folmer, License: GPL-2.0+ + +* Underscores https://underscores.me/, By Automattic, Inc., [GPLv2 or later](https://www.gnu.org/licenses/gpl-2.0.html) +* normalize.css https://necolas.github.io/normalize.css/, By Nicolas Gallagher and Jonathan Neal, [MIT](https://opensource.org/licenses/MIT) diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..1faf1c12149a71b1f5b58a4700192019f4ae3f58 GIT binary patch literal 192929 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
    +
    ', + esc_html__( 'Upgrade message from the plugin author:', 'pressbook' ), + ' ', wp_kses_data( $item['upgrade_notice'] ), ' +
    +
    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 z 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%0AU=Pqd^($73~;4vXkAF|A3t>nC^2BM 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 + + + + + + + + + + + + + + + +>> TABLE OF CONTENTS: +---------------------------------------------------------------- +# Generic + - Normalize + - Box sizing +# Base + - Typography + - Elements + - Links + - Forms +# Blocks +# Layout + - Wrapper + - Content Sidebar + - Double Sidebars Layout (Large-Screen Devices) +# Header + - Top Navbar + - Site Branding + - Top Banner + - Primary Navbar + - Primary Menu Search +# Content + - Posts and pages + - Comments + - Media + - Captions + - Galleries + - Forms +# Sidebar + - Sidebar Widgets + - Sticky Sidebar +# Footer + - Footer Widgets + - Copyright Text + - Go to Top +# Plugins + - WooCommerce + - Jetpack infinite scroll +# Utilities + - Accessibility + - Alignments + - Clearings + +--------------------------------------------------------------*/ + +/*-------------------------------------------------------------- +# Generic +--------------------------------------------------------------*/ + +/* Normalize +--------------------------------------------- */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ +html { + line-height: 1.15; + -webkit-text-size-adjust: 100%; +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 1.94em; + margin: .67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +pre { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ +a { + background: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -.25em; +} + +sup { + top: -.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0; +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ +fieldset { + padding: .35em .75em .625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ +[hidden] { + display: none; +} + +/* Box sizing +--------------------------------------------- */ + +/* Inherit box-sizing to more easily change it's value on a component level. +@link http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ */ +*, +*::before, +*::after { + box-sizing: inherit; +} + +html { + box-sizing: border-box; +} + +/*-------------------------------------------------------------- +# Base +--------------------------------------------------------------*/ + +/* Typography +--------------------------------------------- */ +body, +button, +input, +select, +optgroup, +textarea { + color: #404040; + font-family: 'Inter', Arial, Helvetica, sans-serif; + font-size: 16px; + font-size: 1rem; + line-height: 1.75; +} + +@media screen and (min-width: 768px) { + + body, + button, + input, + select, + optgroup, + textarea { + font-size: 17px; + font-size: 1.0625rem; + } +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: 'Lato', Helvetica, Arial, sans-serif; + font-weight: 700; + line-height: 1.5; + clear: both; +} + +h2 { + font-size: 1.78em; + margin: .73em 0; +} + +h3 { + font-size: 1.62em; + margin: .8em 0; +} + +h4 { + font-size: 1.46em; + margin: .89em 0; +} + +h5 { + font-size: 1.3em; + margin: 1em 0; +} + +h6 { + font-size: 1.14em; + margin: 1.14em 0; +} + +p { + margin-top: 0; + margin-bottom: 1.5em; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote { + margin: 0 1.5em; +} + +address { + margin: 0 0 1.5em; +} + +pre { + background: #eee; + font-family: 'Courier 10 Pitch', courier, monospace; + line-height: 1.6; + margin-bottom: 1.75em; + max-width: 100%; + overflow: auto; + padding: 1.6em; +} + +code, +kbd, +tt, +var { + font-family: monaco, consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace; +} + +abbr, +acronym { + border-bottom: 1px dotted #666; + cursor: help; +} + +mark, +ins { + background: #fff9c0; + text-decoration: none; +} + +big { + font-size: 125%; +} + +/* Elements +--------------------------------------------- */ +body { + background: #ededed; +} + +hr { + background: #ccc; + border: 0; + height: 1px; + margin-bottom: 1.5em; +} + +ul, +ol { + margin: 0 0 1.5em 0; + padding: 0; + list-style-position: inside; +} + +ul { + list-style-type: disc; +} + +ol { + list-style-type: decimal; +} + +ul ul, +ol ul { + list-style-type: circle; +} + +li>ul, +li>ol { + margin-bottom: 0; + margin-right: 1.5em; +} + +li:not(:first-child) { + padding-top: .2em; +} + +li:not(:last-child) { + padding-bottom: .2em; +} + +li>ul>li:first-child, +li>ol>li:first-child { + padding-top: .4em; +} + +dt { + font-weight: 700; +} + +dd { + margin: 0 1.5em 1.5em; +} + +/* Make sure embeds and iframes fit their containers. */ +embed, +iframe, +object { + max-width: 100%; +} + +img { + height: auto; + max-width: 100%; +} + +figure { + margin: 0 0 1em 0; +} + +table { + margin: 0 0 1.5em; + width: 100%; + border-collapse: collapse; +} + +table, +th, +td { + border: 1px solid #e1e1e1; +} + +th, +td { + padding: .2em .4em; +} + +/* Links +--------------------------------------------- */ +a { + text-decoration: underline; + transition: color .2s; +} + +a { + color: #166dd6; +} + +a:hover, +a:focus, +a:active { + color: #f69275; +} + +a:focus { + outline: thin dotted; +} + +a:focus:not(:focus-visible), +a:hover, +a:active { + outline: 0; +} + +p.has-text-color a, +p.has-text-color a:hover, +p.has-text-color a:focus, +p.has-text-color a:active { + color: inherit; +} + +/* Forms +--------------------------------------------- */ +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +.more-link, +.wp-block-search .wp-block-search__button { + position: relative; + padding: .45em 1em .5em; + line-height: 1; + font-weight: 600; + border-radius: 0; + border-color: transparent; + color: #fff; + background-image: linear-gradient(to left, #f3c841 0%, #f69275 51%, #f3c841 100%); + background-size: 200% auto; + transition: all .3s ease-in-out; +} + +button:hover, +input[type="button"]:hover, +input[type="reset"]:hover, +input[type="submit"]:hover, +.more-link:hover, +.wp-block-search .wp-block-search__button:hover, +button:active, +button:focus, +input[type="button"]:active, +input[type="button"]:focus, +input[type="reset"]:active, +input[type="reset"]:focus, +input[type="submit"]:active, +input[type="submit"]:focus, +.more-link:active, +.more-link:focus, +.wp-block-search .wp-block-search__button:active, +.wp-block-search .wp-block-search__button:focus { + color: #fff; + background-position: left center; +} + +button:active, +button:focus, +input[type="button"]:active, +input[type="button"]:focus, +input[type="reset"]:active, +input[type="reset"]:focus, +input[type="submit"]:active, +input[type="submit"]:focus, +.more-link:active, +.more-link:focus, +.wp-block-search .wp-block-search__button:active, +.wp-block-search .wp-block-search__button:focus { + outline-style: dashed; + outline-width: thin; +} + +button:focus:not(:focus-visible), +input[type="button"]:focus:not(:focus-visible), +input[type="reset"]:focus:not(:focus-visible), +input[type="submit"]:focus:not(:focus-visible), +.more-link:focus:not(:focus-visible), +.wp-block-search .wp-block-search__button:focus:not(:focus-visible) { + outline: none; +} + +input[type="text"], +input[type="email"], +input[type="url"], +input[type="password"], +input[type="search"], +input[type="number"], +input[type="tel"], +input[type="range"], +input[type="date"], +input[type="month"], +input[type="week"], +input[type="time"], +input[type="datetime"], +input[type="datetime-local"], +input[type="color"], +textarea, +select { + display: block; + max-width: 100%; + padding: 8px 10px; + border: 1px solid #ccc; + border-radius: 0; + color: #666; +} + +input[type="text"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="password"]:focus, +input[type="search"]:focus, +input[type="number"]:focus, +input[type="tel"]:focus, +input[type="range"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="week"]:focus, +input[type="time"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="color"]:focus, +textarea:focus, +select:focus { + color: #111; + outline-style: dashed; + outline-width: thin; +} + +input[type="text"], +input[type="email"], +input[type="url"], +input[type="password"], +input[type="search"], +input[type="number"], +input[type="tel"], +input[type="range"], +input[type="date"], +input[type="month"], +input[type="week"], +input[type="time"], +input[type="datetime"], +input[type="datetime-local"], +input[type="color"] { + line-height: normal; +} + +textarea { + width: 100%; +} + +/*-------------------------------------------------------------- +# Blocks +--------------------------------------------------------------*/ +.wp-block-quote p { + margin-bottom: .75em; +} + +.wp-block-quote.is-large p, +.wp-block-quote.is-style-large p { + font-size: 1.3em; +} + +.wp-block-quote__citation, +.wp-block-quote cite, +.wp-block-quote footer { + font-size: .85em; +} + +.wp-block-quote.is-large cite, +.wp-block-quote.is-large footer, +.wp-block-quote.is-style-large cite, +.wp-block-quote.is-style-large footer { + font-size: .95em; +} + +.wp-block-quote, +.wp-block-quote.is-large, +.wp-block-quote.is-style-large { + margin-bottom: 1.75em; +} + +.wp-block-pullquote { + padding: 2.4em 0; +} + +.wp-block-pullquote p { + font-size: 1.75em; + margin-bottom: 0; +} + +.wp-block-pullquote__citation, +.wp-block-pullquote cite, +.wp-block-pullquote footer { + display: block; + margin-top: 1.5em; +} + +.wp-block-pullquote.is-style-solid-color blockquote p { + font-size: 1.9em; +} + +.wp-block-pullquote.is-style-solid-color blockquote { + max-width: 70%; +} + +.wp-block-pullquote.is-style-solid-color blockquote cite { + color: inherit; +} + +.wp-block-table, +.wp-block-video, +.wp-block-audio, +.wp-block-embed, +.wp-block-image, +.wp-block-gallery, +.wp-block-media-text, +.wp-block-calendar { + margin-bottom: 1.5em; +} + +.wp-block-media-text .wp-block-media-text__media { + margin-bottom: 1em; +} + +@media screen and (min-width: 600px) { + .wp-block-media-text .wp-block-media-text__media { + margin-bottom: 0; + } +} + +.wp-block-calendar table:where(:not(.has-text-color)) { + color: inherit; +} + +.wp-block-table table, +.wp-block-calendar .wp-calendar-table { + margin-bottom: 0; +} + +.wp-block-calendar .wp-calendar-nav { + margin-top: .5em; +} + +.wp-block-image img { + display: block; +} + +.wp-block-table figcaption, +.wp-block-video figcaption, +.wp-block-embed figcaption, +.wp-block-image figcaption, +.wp-block-gallery figcaption { + font-size: .85em; +} + +.wp-block-table figcaption, +.wp-block-video figcaption, +.wp-block-embed figcaption, +.wp-block-image figcaption { + margin-top: 1em; + margin-bottom: 0; +} + +.wp-block-audio figcaption { + margin-top: .75em; + margin-bottom: 0; + font-size: .8em; +} + +.wp-block-table.is-style-stripes { + border-bottom: 0; +} + +.wp-block-code { + padding: 0; + border: 0; + border-radius: 0; +} + +.wp-block-code>code { + padding: .8em 1em; + border: 1px solid #ddd; + border-radius: 4px; + color: inherit; +} + +.wp-block-search .wp-block-search__inside-wrapper { + display: flex; +} + +.wp-block-search .wp-block-search__input { + border: 1px solid #ccc; +} + +.wp-block-search .wp-block-search__button { + margin-right: 0; +} + +.wp-block-search__input>.wp-block-search__input { + max-width: 65%; + width: 100%; +} + +.wp-block-search__input>.wp-block-search__button { + max-width: 35%; + width: auto; +} + +.wp-block-search__button.has-icon { + padding: 0 .4em; +} + +.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__input { + padding: 7px 10px; +} + +@media screen and (min-width: 600px) { + .wp-block-search .wp-block-search__input { + flex-wrap: nowrap; + } + + .wp-block-search__input>.wp-block-search__input { + max-width: 65%; + width: 100%; + } + + .wp-block-search__input>.wp-block-search__button { + max-width: 35%; + } +} + +.wp-block-rss { + padding: 0; + list-style-type: none; +} + +.wp-block-rss .wp-block-rss__item:not(:last-child) { + margin-bottom: 1em; +} + +.wp-block-rss .wp-block-rss__item:not(:first-child) { + padding-top: 0; +} + +.wp-block-latest-comments__comment { + line-height: inherit; +} + +.wp-block-button__link { + text-decoration: none; +} + +.wp-block-social-links .wp-block-social-link { + padding: 0; +} + +/*-------------------------------------------------------------- +# Layout +--------------------------------------------------------------*/ +.site { + display: flex; + flex-direction: column; + min-height: 100vh; + overflow-x: hidden; +} + +.site-content { + flex-grow: 1; +} + +/* Wrapper +--------------------------------------------- */ +.u-wrapper { + width: 100%; + margin-right: auto; + margin-left: auto; + padding-right: 10px; + padding-left: 10px; +} + +@media screen and (min-width: 576px) { + .u-wrapper { + max-width: 540px; + padding-right: 15px; + padding-left: 15px; + } +} + +@media screen and (min-width: 768px) { + .u-wrapper { + max-width: 720px; + } +} + +@media screen and (min-width: 992px) { + .u-wrapper { + max-width: 960px; + } +} + +@media screen and (min-width: 1200px) { + .u-wrapper { + max-width: 1140px; + } +} + +@media screen and (min-width: 1280px) { + body.double-sidebar .u-wrapper { + max-width: 1230px; + } +} + +@media screen and (min-width: 1360px) { + body.double-sidebar .u-wrapper { + max-width: 1280px; + } +} + +@media screen and (min-width: 1400px) { + body.double-sidebar .u-wrapper { + max-width: 1320px; + } +} + +/* Content Sidebar +--------------------------------------------- */ +.pb-content-sidebar { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: flex-start; + margin-top: 1.5em; +} + +.pb-content-sidebar::after { + content: ''; + width: 100%; +} + +.site-main { + max-width: 670px; + width: 100%; + flex-basis: 100%; + margin-bottom: 1.5em; +} + +body.page.page-template-small .pb-content-sidebar { + max-width: 750px; +} + +body.page.page-template-medium .pb-content-sidebar { + max-width: 1140px; +} + +body.page.page-template-large .pb-content-sidebar { + max-width: 1320px; +} + +body.page.page-template-full .pb-content-sidebar, +body.page.page-template-default .site-main, +body.page.page-template-small .site-main, +body.page.page-template-medium .site-main, +body.page.page-template-large .site-main, +body.page.page-template-full .site-main { + max-width: 100%; +} + +body.content-no-t-padding .site .site-content .site-main, +body.side-widget-no-t-padding .site .site-content .c-sidebar .widget { + padding-top: 0; +} + +body.content-no-b-padding .site .site-content .site-main, +body.side-widget-no-b-padding .site .site-content .c-sidebar .widget { + padding-bottom: 0; +} + +body.content-no-x-padding .site .site-content .site-main, +body.side-widget-no-x-padding .site .site-content .c-sidebar .widget { + padding-right: 0; + padding-left: 0; +} + +body.side-widget-no-shadow .c-sidebar .widget { + box-shadow: none; +} + +.c-sidebar { + max-width: 310px; + min-width: 260px; + flex-grow: 1; + flex-basis: 30%; +} + +.c-sidebar-left { + order: 1; +} + +.c-sidebar-right { + order: 2; +} + +.site-main, +.c-sidebar .widget { + padding: 14px; + background: #fff; +} + +.site-main { + border: 1px solid #fff; +} + +.c-sidebar .widget { + border: 1px solid #fafafa; + box-shadow: -1px 2px 3px rgba(0, 0, 0, .07); +} + +@media screen and (min-width: 350px) { + .c-sidebar { + max-width: 330px; + } + + .c-sidebar .widget { + padding: 19px 24px; + } + + /* Double Sidebar */ + body.double-sidebar .c-sidebar { + min-width: 330px; + } +} + +@media screen and (min-width: 576px) { + .site-main { + padding: 24px 34px; + } + + .c-sidebar { + max-width: 340px; + } + + .c-sidebar .widget { + padding: 24px 29px; + } +} + +@media screen and (min-width: 768px) { + + /* Double Sidebar */ + body.double-sidebar .pb-content-sidebar { + flex-wrap: wrap; + } + + body.double-sidebar .pb-content-sidebar::after { + content: ''; + } + + body.double-sidebar .c-sidebar { + max-width: 320px; + } + + body.double-sidebar .c-sidebar .widget { + padding-right: 24px; + padding-left: 24px; + } + + body.double-sidebar .c-sidebar-left, + body.double-sidebar .c-sidebar-right { + margin-right: auto; + margin-left: auto; + } +} + +@media screen and (min-width: 1024px) { + .pb-content-sidebar { + flex-wrap: nowrap; + } + + .pb-content-sidebar::after { + content: none; + } + + .site-main { + padding-top: 29px; + padding-bottom: 29px; + } + + /* No Sidebar */ + body.no-sidebar .site-main { + max-width: 750px; + } + + body.no-sidebar .site-main, + body.page.page-template-default .site-main, + body.page.page-template-small .site-main, + body.page.page-template-medium .site-main, + body.page.page-template-large .site-main, + body.page.page-template-full .site-main { + padding-right: 49px; + padding-left: 49px; + } + + /* Single Sidebar */ + body.single-sidebar .site-main { + max-width: 630px; + padding-right: 24px; + padding-left: 24px; + } + + body.single-sidebar .c-sidebar .widget { + padding: 19px 24px; + } + + body.single-sidebar .c-sidebar-left { + margin-left: 25px; + order: -1; + } + + body.single-sidebar .c-sidebar-right { + margin-right: 25px; + } + + /* Double Sidebar */ + body.double-sidebar .site-main { + max-width: 750px; + padding-right: 49px; + padding-left: 49px; + } +} + +@media screen and (min-width: 1200px) { + + /* No Sidebar */ + body.no-sidebar .site-main { + max-width: 750px; + } + + /* Single Sidebar */ + body.single-sidebar .site-main { + max-width: 730px; + padding-right: 39px; + padding-left: 39px; + } + + .c-sidebar { + max-width: 340px; + } + + body.single-sidebar .c-sidebar-left { + margin-left: auto; + } + + body.single-sidebar .c-sidebar-right { + margin-right: auto; + } + + body.single-sidebar .c-sidebar .widget { + padding: 24px 29px; + } +} + +@media screen and (min-width: 1280px) { + + /* Double Sidebar */ + body.double-sidebar .site-main { + max-width: 600px; + padding-right: 29px; + padding-left: 29px; + } + + body.double-sidebar .pb-content-sidebar { + flex-wrap: nowrap; + } + + body.double-sidebar .pb-content-sidebar::after { + content: none; + } + + body.double-sidebar .c-sidebar { + min-width: 260px; + } + + body.double-sidebar .c-sidebar-left { + order: -1; + margin-right: 0; + margin-left: 25px; + } + + body.double-sidebar .c-sidebar-right { + order: 1; + margin-right: 25px; + margin-left: 0; + } + + body.double-sidebar .c-sidebar .widget { + padding: 19px; + } +} + +@media screen and (min-width: 1360px) { + + /* Double Sidebar */ + body.double-sidebar .site-main { + max-width: 660px; + } +} + +/* Double Sidebars Layout (Large-Screen Devices) +--------------------------------------------- */ +@media screen and (min-width: 1280px) { + body.double-sidebar.side-widget-ld-lg-left .c-sidebar-right { + order: -1; + margin-right: 0; + margin-left: 25px; + } + + body.double-sidebar.side-widget-ld-lg-right .c-sidebar-left { + order: 0; + margin-right: 25px; + margin-left: 0; + } +} + +/*-------------------------------------------------------------- +# Header +--------------------------------------------------------------*/ + +/* Top Navbar +--------------------------------------------- */ +.top-navbar { + background: linear-gradient(0deg, #166dd6 0%, #1257ab 100%); + color: #fff; +} + +.top-menus { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + line-height: 1.6em; +} + +.top-menus .menu { + list-style-type: none; + margin: 0; + padding: 0; + display: inline-flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; +} + +.top-menus li { + padding: .4rem .75rem; + border: 1px solid rgba(255, 255, 255, .25); + margin-bottom: 0; + margin-right: -1px; +} + +@media screen and (min-width: 768px) { + .top-menus { + justify-content: flex-start; + } + + .top-menus>nav { + flex-grow: 1; + } +} + +.social-navigation a { + color: #fff; +} + +.social-navigation a .svg-icon { + width: 1.55em; + height: 1.55em; + padding: .15em; + border: 1px solid transparent; + transition: .25s all; +} + +.social-navigation a:hover .svg-icon, +.social-navigation a:focus .svg-icon, +.social-navigation a:active .svg-icon { + color: #166dd6; + background: #fff; + border-color: #fff; + border-radius: 50%; + text-shadow: 0 1px 1px rgba(0, 0, 0, .15); +} + +@media screen and (min-width: 768px) { + .social-navigation { + flex-basis: 38%; + } + + .social-navigation .menu { + justify-content: flex-start; + } +} + +.top-navigation { + font-size: .8em; +} + +.top-navigation a { + text-decoration: none; + color: #fff; + border-bottom: 2px solid transparent; + transition: .2s border-color; +} + +.top-navigation a:hover, +.top-navigation a:focus, +.top-navigation a:active { + color: #fff; + border-color: #fff; + text-shadow: 0 1px 1px rgba(0, 0, 0, .15); +} + +@media screen and (min-width: 768px) { + .top-navigation { + flex-basis: 62%; + text-align: left; + } + + .top-navigation .menu { + justify-content: flex-end; + } +} + +/* Site Branding +--------------------------------------------- */ +.site-branding { + padding: 1em 0; + background-color: #fff; + background-position: center center; + background-size: contain; + background-repeat: repeat; +} + +.site-branding-wrap { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; +} + +.site-logo-title { + max-width: 600px; + display: flex; + align-items: center; +} + +.has-banner-next-sm { + margin-left: 1rem; +} + +@media screen and (min-width: 576px) { + .has-banner-next-md { + margin-left: 1rem; + } +} + +@media screen and (min-width: 768px) { + .site-branding-wrap { + flex-wrap: nowrap; + justify-content: space-between; + } + + .has-banner-next-lg { + margin-left: 1rem; + } +} + +.site-branding .custom-logo-link img { + display: block; + max-width: 12em; + max-height: 3.55em; + width: auto; + height: auto; +} + +.site-branding .custom-logo-link { + color: #404040; +} + +.site-logo-only .custom-logo-link { + margin-left: 0; +} + +.site-logo-title:not(.site-logo-only) .custom-logo-link { + margin-left: .75rem; +} + +.site-title, +.site-tagline { + margin: 0; +} + +.site-title { + font-family: 'Lato', Helvetica, Arial, sans-serif; + font-size: 1.2em; + line-height: 1.5; + font-weight: 700; + word-break: break-word; +} + +.site-title a { + text-decoration: none; +} + +.site-title, +.site-title a, +.site-title a:hover, +.site-title a:focus, +.site-title a:active { + color: #404040; +} + +.site-tagline { + font-size: .8em; + color: #979797; +} + +.logo--sm-size-1 .custom-logo-link img { + max-width: 12em; + max-height: 3.55em; +} + +.logo--sm-size-2 .custom-logo-link img { + max-width: 13.5em; + max-height: 3.85em; +} + +.logo--sm-size-3 .custom-logo-link img { + max-width: 15em; + max-height: 4.15em; +} + +.logo--sm-size-4 .custom-logo-link img { + max-width: 16.5em; + max-height: 4.45em; +} + +.logo--sm-size-5 .custom-logo-link img { + max-width: 18em; + max-height: 4.75em; +} + +.site-title--sm-size-1 { + font-size: 1.1em; +} + +.site-title--sm-size-2 { + font-size: 1.2em; +} + +.site-title--sm-size-3 { + font-size: 1.3em; +} + +.site-title--sm-size-4 { + font-size: 1.4em; +} + +.site-title--sm-size-5 { + font-size: 1.5em; +} + +.tagline--sm-size-1 { + font-size: .75em; +} + +.tagline--sm-size-2 { + font-size: .8em; +} + +.tagline--sm-size-3 { + font-size: .85em; +} + +.tagline--sm-size-4 { + font-size: .9em; +} + +.tagline--sm-size-5 { + font-size: .95em; +} + +@media screen and (min-width: 576px) { + .logo--md-size-1 .custom-logo-link img { + max-width: 12em; + max-height: 3.55em; + } + + .logo--md-size-2 .custom-logo-link img { + max-width: 13.5em; + max-height: 3.85em; + } + + .logo--md-size-3 .custom-logo-link img { + max-width: 15em; + max-height: 4.15em; + } + + .logo--md-size-4 .custom-logo-link img { + max-width: 16.5em; + max-height: 4.45em; + } + + .logo--md-size-5 .custom-logo-link img { + max-width: 18em; + max-height: 4.75em; + } + + .site-title--md-size-1 { + font-size: 1.1em; + } + + .site-title--md-size-2 { + font-size: 1.2em; + } + + .site-title--md-size-3 { + font-size: 1.3em; + } + + .site-title--md-size-4 { + font-size: 1.4em; + } + + .site-title--md-size-5 { + font-size: 1.5em; + } + + .tagline--md-size-1 { + font-size: .75em; + } + + .tagline--md-size-2 { + font-size: .8em; + } + + .tagline--md-size-3 { + font-size: .85em; + } + + .tagline--md-size-4 { + font-size: .9em; + } + + .tagline--md-size-5 { + font-size: .95em; + } +} + +@media screen and (min-width: 1200px) { + .logo--lg-size-1 .custom-logo-link img { + max-width: 12em; + max-height: 3.55em; + } + + .logo--lg-size-2 .custom-logo-link img { + max-width: 13.5em; + max-height: 3.85em; + } + + .logo--lg-size-3 .custom-logo-link img { + max-width: 15em; + max-height: 4.15em; + } + + .logo--lg-size-4 .custom-logo-link img { + max-width: 16.5em; + max-height: 4.45em; + } + + .logo--lg-size-5 .custom-logo-link img { + max-width: 18em; + max-height: 4.75em; + } + + .site-title--lg-size-1 { + font-size: 1.1em; + } + + .site-title--lg-size-2 { + font-size: 1.2em; + } + + .site-title--lg-size-3 { + font-size: 1.3em; + } + + .site-title--lg-size-4 { + font-size: 1.4em; + } + + .site-title--lg-size-5 { + font-size: 1.5em; + } + + .tagline--lg-size-1 { + font-size: .75em; + } + + .tagline--lg-size-2 { + font-size: .8em; + } + + .tagline--lg-size-3 { + font-size: .85em; + } + + .tagline--lg-size-4 { + font-size: .9em; + } + + .tagline--lg-size-5 { + font-size: .95em; + } +} + +/* Top Banner +--------------------------------------------- */ +.top-banner { + margin-top: 1rem; +} + +.top-banner-shadow { + box-shadow: 0 1px 35px 0 rgb(0 0 0 / 15%); +} + +.top-banner-link, +.top-banner-image { + display: block; +} + +.top-banner-link:focus { + outline: 2px solid; +} + +.top-banner-link:focus:not(:focus-visible) { + outline: none; +} + +.top-banner-image { + max-height: 150px; + width: auto; +} + +.top-banner-hide-sm, +.top-banner-hide-sm .top-banner-image { + display: none; +} + +@media screen and (min-width: 576px) { + + .top-banner-hide-sm, + .top-banner-hide-sm .top-banner-image { + display: block; + } + + .top-banner-hide-md, + .top-banner-hide-md .top-banner-image { + display: none; + } +} + +@media screen and (min-width: 768px) { + .top-banner { + margin-top: 0; + max-width: 60%; + } + + .top-banner-hide-md, + .top-banner-hide-md .top-banner-image { + display: block; + } +} + +@media screen and (min-width: 1200px) { + .top-banner { + max-width: 70%; + } +} + +/* Primary Navbar +--------------------------------------------- */ +.primary-navbar { + padding: .5em 0; + font-size: .95em; + font-weight: 600; + background: #166dd6; + color: #fff; +} + +.main-navigation ul { + display: none; + list-style-type: none; + margin: 0; + padding: 0; +} + +.main-navigation.toggled ul { + display: block; +} + +.main-navigation { + display: flex; + flex-direction: column; +} + +.primary-menu-toggle { + align-self: flex-end; + display: inline-block; + padding: .35em .4em; +} + +.primary-menu-toggle .svg-icon { + width: 1.55em; + height: 1.55em; +} + +.main-navigation.toggled .primary-menu-toggle .svg-icon:first-child, +.main-navigation:not(.toggled) .primary-menu-toggle .svg-icon:last-child { + display: none; +} + +.main-navigation li { + position: relative; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + padding: .4em; +} + +.main-navigation li>a { + flex-basis: auto; + width: 100%; +} + +.main-navigation li.menu-item-has-children>a { + width: calc(100% - 35px); +} + +.main-navigation-arrow-btn { + width: 30px; + flex-shrink: 0; + padding: 5px 6px; + border: none; + background: transparent; + color: #fff; + cursor: pointer; + transition: .25s all; +} + +.main-navigation-arrow-btn:focus { + color: #fff; +} + +.main-navigation-arrow-btn .svg-icon { + width: .95em; + height: .95em; +} + +.main-navigation:not(.toggled) li:hover>.main-navigation-arrow-btn, +.main-navigation li.focus>.main-navigation-arrow-btn, +.main-navigation .main-navigation-arrow-btn:hover, +.main-navigation .main-navigation-arrow-btn:active { + background: #fff; + color: #166dd6; +} + +.primary-menu-toggle:focus, +.main-navigation li .main-navigation-arrow-btn:focus { + outline: 2px dotted #fff; +} + +.primary-menu-toggle:focus:not(:focus-visible), +.main-navigation li .main-navigation-arrow-btn:focus:not(:focus-visible) { + outline: none; +} + +.main-navigation ul ul { + position: absolute; + right: 30px; + width: calc(100% - 15px); + flex-grow: 0; + flex-shrink: 0; + display: block; + padding: 0; + opacity: 0; + height: 0; + overflow: hidden; + background: #166dd6; + transition: .3s all; + z-index: -1; +} + +.main-navigation:not(.toggled):not(.main-navigation--touch) ul li:hover>ul, +.main-navigation ul li.focus>ul { + position: relative; + top: 5px; + right: 15px; + opacity: 1; + height: auto; + overflow: visible; + z-index: 99995; +} + +.main-navigation ul li, +.main-navigation ul ul li { + border-top: 1px solid rgba(255, 255, 255, .25); +} + +.main-navigation a { + text-decoration: none; + padding: .3em .5em; + color: #fff; + transition: .25s all; +} + +.main-navigation a:hover, +.main-navigation a:focus, +.main-navigation a:active { + color: #166dd6; + background: #fff; +} + +@media screen and (min-width: 768px) { + .primary-navbar { + padding: .25em 0; + } + + .main-navigation ul { + display: flex; + flex-wrap: wrap; + } + + .primary-menu-toggle { + display: none; + } + + .main-navigation { + display: block; + } + + .main-navigation>div { + max-width: 100%; + } + + .main-navigation ul li { + border: 0; + } + + .main-navigation .menu>li:first-child { + padding: .2em 0 .2em .2em; + } + + .main-navigation .menu>li:not(:first-child), + .main-navigation ul ul li { + padding: .2em; + } + + .main-navigation .menu>li.menu-item-has-children>a { + width: auto; + } + + .main-navigation ul ul li.menu-item-has-children>a { + width: calc(100% - 32px); + } + + .main-navigation-arrow-btn { + margin-right: 2px; + } + + .main-navigation ul ul { + width: auto; + right: 15%; + transition: .2s all; + } + + .main-navigation:not(.toggled):not(.main-navigation--touch) ul li:hover>ul, + .main-navigation ul li.focus>ul { + position: absolute; + top: 100%; + right: 0; + } + + .main-navigation:not(.toggled):not(.main-navigation--touch) ul ul li:hover>ul, + .main-navigation ul ul li.focus>ul { + top: 0; + right: 100%; + } + + .main-navigation ul ul li { + width: 240px; + } +} + +/* Primary Menu Search +--------------------------------------------- */ +.primary-menu-search .primary-menu-search-toggle { + display: none; + width: 32px; + height: 32px; + justify-content: center; + align-items: center; + padding: .5em; +} + +.primary-menu-search-toggle .svg-icon { + width: 1em; + height: 1em; +} + +.primary-menu-search .search-form-wrap { + min-width: 250px; +} + +.primary-menu-search .search-form { + flex-wrap: nowrap; + padding: .4em; + overflow-x: auto; + background: #fff; + box-shadow: -1px 2px 3px rgba(0, 0, 0, .07); + z-index: 99995; +} + +.primary-menu-search .search-form>.search-submit { + max-width: 100%; +} + +.main-navigation .primary-menu-search { + justify-content: center; + align-items: center; + padding-top: 1.6em; +} + +@media screen and (min-width: 320px) { + .primary-menu-search .search-form>label { + max-width: 180px; + } +} + +@media screen and (min-width: 350px) { + .primary-menu-search .search-form>label { + max-width: 200px; + } +} + +@media screen and (min-width: 768px) { + .primary-menu-search .primary-menu-search-toggle { + display: inline-flex; + } + + .primary-menu-search .search-form>label { + max-width: 210px; + } + + .main-navigation .primary-menu-search { + display: flex; + justify-content: flex-end; + margin-right: auto; + padding-top: .4em; + } + + .primary-menu-search .search-form-wrap { + position: absolute; + top: calc(100% + 8px); + left: calc(100% - 32px); + } + + .primary-menu-search:not(.toggled) .search-form-wrap, + .primary-menu-search.toggled .svg-icon:nth-of-type(1), + .primary-menu-search-toggle .svg-icon:nth-of-type(2) { + display: none; + } + + .primary-menu-search.toggled .svg-icon:nth-of-type(2) { + display: inline-block; + } + + .primary-menu-search.toggled .search-form-wrap { + display: flex; + box-shadow: -1px 2px 3px rgba(0, 0, 0, .14); + } + + .primary-menu-search .search-form::before { + content: ''; + position: absolute; + top: -18px; + right: calc(100% - 9px); + border: 9px solid transparent; + border-bottom-color: rgba(255, 255, 255, .8); + transform: translateX(50%); + } +} + +/*-------------------------------------------------------------- +# Content +--------------------------------------------------------------*/ + +/* Posts and pages +--------------------------------------------- */ +.updated:not(.published) { + display: none; +} + +.pb-archive { + margin-bottom: 1.5em; + padding-bottom: 1.5em; + border-bottom: 1px solid #e1e1e1; +} + +.pb-archive.has-post-thumbnail .pb-content>.post-thumbnail, +.pb-singular>.post-thumbnail { + display: block; +} + +.pb-archive.has-post-thumbnail .pb-content>.post-thumbnail { + margin-bottom: 1em; +} + +.pb-singular>.post-thumbnail { + margin-bottom: 1.5em; +} + +@media screen and (min-width: 768px) { + body.pb-content-columns .pb-archive.has-post-thumbnail .pb-content { + display: flex; + align-items: center; + } + + body.pb-content-columns .pb-archive.has-post-thumbnail .pb-content>.post-thumbnail { + width: 36%; + margin-left: 1.5em; + margin-bottom: 0; + } + + body.pb-content-columns .pb-archive.has-post-thumbnail .pb-content>*:nth-child(2) { + width: 64%; + } + + body.pb-content-cover .pb-archive.has-post-thumbnail .pb-content { + align-items: stretch; + } + + body.pb-content-cover .pb-archive .pb-content>.post-thumbnail img { + height: 100%; + -o-object-fit: cover; + object-fit: cover; + } +} + +.pb-archive .pb-content>.post-thumbnail img, +.pb-singular>.post-thumbnail img { + display: block; +} + +.pb-article a.post-thumbnail:focus:not(:focus-visible) { + outline: none; +} + +.pb-article .entry-header>.entry-title, +.page-header>.page-title { + margin-top: 0; + margin-bottom: .45em; + font-size: 1.46em; + word-break: break-word; +} + +.pb-singular:not(.type-post) .entry-header>.entry-title, +.page-header>.page-title { + margin-bottom: .875em; +} + +.pb-archv-title { + margin-top: 0; + font-size: 1.62em; +} + +.entry-title a { + text-decoration: none; +} + +.entry-title, +.entry-title a { + color: #404040; +} + +.entry-title a:hover, +.entry-title a:focus, +.entry-title a:active { + color: #f69275; +} + +.entry-meta, +.cat-links, +.tag-links { + font-size: .85em; +} + +.entry-meta { + margin-bottom: 1.1em; +} + +.hide-entry-meta { + margin-bottom: 1.5em; +} + +.cat-links, +.tag-links { + display: block; + margin-top: 1.5em; +} + +.entry-meta>* { + display: inline-block; + margin: 0 0 .4em .4em; +} + +.entry-meta a, +.cat-links a, +.tag-links a { + display: inline-block; + vertical-align: middle; + text-decoration: none; +} + +.entry-meta a, +.entry-meta .svg-icon, +.cat-links a, +.cat-links .svg-icon, +.tag-links a, +.tag-links .svg-icon { + color: #979797; +} + +.entry-meta a:hover, +.entry-meta a:focus, +.entry-meta a:active, +.cat-links a:hover, +.cat-links a:focus, +.cat-links a:active, +.tag-links a:hover, +.tag-links a:focus, +.tag-links a:active { + color: #404040; + text-decoration: underline; +} + +.entry-meta .svg-icon, +.cat-links .svg-icon, +.tag-links .svg-icon { + width: 1.5em; + height: 1.5em; + padding: .1em; +} + +.entry-meta .posted-by .svg-icon { + margin-left: -.1em; +} + +.entry-meta .comments-link .svg-icon, +.cat-links .svg-icon, +.tag-links .svg-icon { + margin-left: .3em; +} + +.more-link-wrap, +.page-content>*:last-child, +.entry-content>*:last-child, +.entry-summary>*:last-child, +.comment-content>*:last-child, +.pb-no-content>.entry-header>*:last-child { + margin-bottom: 0; +} + +.more-link-wrap { + margin-top: 1.5em; +} + +.more-link { + display: inline-block; + padding-top: .58em; + padding-bottom: .62em; + text-decoration: none; + font-size: .875rem; +} + +.more-link:hover { + text-decoration: none; +} + +.more-link:active, +.more-link:focus { + outline-color: #404040; +} + +.post-edit-link-wrap { + display: block; + margin-top: 1em; + color: #979797; +} + +.post-edit-link { + font-size: .85em; +} + +.navigation .nav-links, +.page-links { + display: flex; + flex-wrap: wrap; +} + +.navigation .nav-links, +.page-links { + margin-top: 1.5em; +} + +.navigation .nav-links .prev::before, +.navigation .nav-links .nav-previous>a::before { + content: '\00ab'; + margin-left: .3em; +} + +.navigation .nav-links .next::after, +.navigation .nav-links .nav-next>a::after { + content: '\00bb'; + margin-right: .3em; +} + +.navigation .nav-links .page-numbers, +.page-links .post-page-numbers { + margin-right: .6em; + margin-left: .6em; +} + +.navigation .nav-links .nav-previous, +.navigation .nav-links .prev { + margin-left: auto; + text-align: right; +} + +.navigation .nav-links> :first-child, +.navigation .nav-links .nav-previous, +.navigation .nav-links .prev { + margin-right: 0; +} + +.navigation .nav-links .nav-next, +.navigation .nav-links .next { + margin-right: auto; + text-align: left; +} + +.navigation .nav-links> :last-child, +.navigation .nav-links .nav-next, +.navigation .nav-links .next { + margin-left: 0; +} + +@media screen and (min-width: 768px) { + + .navigation .nav-links .nav-next, + .navigation .nav-links .nav-previous { + flex-basis: 49%; + } +} + +.navigation .nav-links a, +.page-links a { + text-decoration: none; +} + +.pagination .nav-links a:not(.prev):not(.next):hover, +.pagination .nav-links a:not(.prev):not(.next):focus, +.pagination .nav-links a:not(.prev):not(.next):active, +.page-links a:hover, +.page-links a:focus, +.page-links a:active { + text-decoration: underline; +} + +.nav-links .nav-title { + word-break: break-word; +} + +.nav-links .nav-previous>a, +.nav-links .nav-next>a { + display: inline-flex; +} + +.pb-article.sticky .pb-sticky { + color: #979797; +} + +.pb-article.sticky .pb-sticky .svg-icon { + width: 1.4em; + height: 1.4em; + margin-left: .15em; +} + +.pb-sticky-label { + display: inline-block; + vertical-align: middle; +} + +/* Comments +--------------------------------------------- */ +.comment-content a { + word-break: break-word; +} + +.comments-title { + margin-bottom: 1.5em; + padding: .5em 0; + border-bottom: 1px solid #e1e1e1; +} + +.comments-title, +.comment-reply-title { + font-size: 1.3em; +} + +.comment-list, +.comment-list .children { + list-style-type: none; +} + +.comment-list { + margin: 0; + padding: 0; +} + +.comment-list .children { + padding: 0; +} + +.comment-body { + display: flex; + flex-direction: column; + margin-bottom: 1.5em; + padding-bottom: 1.5em; + border-bottom: 1px solid #e1e1e1; +} + +.comment-meta { + margin-bottom: 1.1em; +} + +.comment-meta a { + text-decoration: none; +} + +.comment-meta .comment-author { + display: flex; + align-items: center; +} + +.comment-meta .comment-author .avatar, +.comment-meta .comment-author .fn, +.comment-meta .comment-author .says { + display: inline-block; + margin: 0 0 .4em .4em; +} + +.comment-meta .comment-author .fn { + font-weight: 600; +} + +.comment-metadata { + font-size: .85em; +} + +.comment-metadata a, +.comment-metadata .edit-link { + display: inline-block; +} + +.comment-metadata a { + margin-left: .4em; + color: #979797; +} + +.comment-metadata a:hover, +.comment-metadata a:focus, +.comment-metadata a:active { + color: #404040; + text-decoration: underline; +} + +.comment-body .reply { + display: block; + margin-top: 1em; +} + +.comment-reply-title { + margin-top: 1em; + margin-bottom: 1em; +} + +.comment-reply-title>small { + margin-right: .4em; +} + +.comments-area .must-log-in, +.comments-area .no-comments { + margin-bottom: 0; +} + +.bypostauthor .comment-author .says { + position: relative; +} + +.bypostauthor .comment-author .says::after { + content: ""; + position: absolute; + left: -18px; + top: 7px; + width: 6px; + height: 11px; + border-bottom: 3px solid; + border-left: 3px solid; + transform: rotate(-45deg); + opacity: .5; +} + +.navigation.comment-navigation .nav-links { + margin-bottom: 1.5em; +} + +/* Media +--------------------------------------------- */ +.page-content .wp-smiley, +.entry-content .wp-smiley, +.comment-content .wp-smiley { + border: none; + margin-bottom: 0; + margin-top: 0; + padding: 0; +} + +/* Make sure logo link wraps around logo image. */ +.custom-logo-link { + display: inline-block; +} + +.svg-icon { + display: inline-block; + vertical-align: middle; + fill: currentColor; + line-height: 1em; +} + +/* Captions +--------------------------------------------- */ +.wp-caption { + margin-bottom: 1.5em; + max-width: 100%; +} + +.wp-caption img[class*="wp-image-"] { + display: block; + margin-right: auto; + margin-left: auto; +} + +.wp-caption .wp-caption-text { + margin: .8075em 0; +} + +.wp-caption-text { + text-align: center; +} + +/* Galleries +--------------------------------------------- */ +.gallery { + margin-bottom: 1.5em; +} + +.gallery-item { + display: inline-block; + text-align: center; + vertical-align: top; + width: 100%; +} + +.gallery-item img { + vertical-align: bottom; +} + +.gallery-columns-2 .gallery-item { + max-width: 50%; +} + +.gallery-columns-3 .gallery-item { + max-width: 33.33%; +} + +.gallery-columns-4 .gallery-item { + max-width: 25%; +} + +.gallery-columns-5 .gallery-item { + max-width: 20%; +} + +.gallery-columns-6 .gallery-item { + max-width: 16.66%; +} + +.gallery-columns-7 .gallery-item { + max-width: 14.28%; +} + +.gallery-columns-8 .gallery-item { + max-width: 12.5%; +} + +.gallery-columns-9 .gallery-item { + max-width: 11.11%; +} + +.gallery-caption { + display: block; +} + +/* Forms +--------------------------------------------- */ +.post-password-form input[type="submit"] { + margin-top: .5rem; +} + +/*-------------------------------------------------------------- +# Sidebar +--------------------------------------------------------------*/ + +/* Sidebar Widgets +--------------------------------------------- */ +.widget { + margin: 0 0 1.5em; +} + +.widget h1, +.widget h2 { + font-size: 1.1em; +} + +.widget h3 { + font-size: 1.08em; +} + +.widget h4 { + font-size: 1.05em; +} + +.widget h5 { + font-size: 1.02em; +} + +.widget h6 { + font-size: 1em; +} + +.c-sidebar { + width: 100%; + font-size: .95em; + color: #404040; +} + +.c-sidebar .widget .widget-title, +.c-sidebar .widget_block h1:first-child, +.c-sidebar .widget_block h2:first-child, +.c-sidebar .widget_block h3:first-child { + margin-bottom: 1.5em; + padding-bottom: .5em; + border-bottom: 2px solid #eee; +} + +.c-sidebar .widget .widget-title::after, +.c-sidebar .widget_block h1:first-child::after, +.c-sidebar .widget_block h2:first-child::after, +.c-sidebar .widget_block h3:first-child::after { + content: ""; + background: #166dd6; + position: absolute; + right: 0; + bottom: -2px; + height: 1px; + width: 10%; +} + +.widget .widget-title, +.widget_block h1:first-child, +.widget_block h2:first-child, +.widget_block h3:first-child { + position: relative; + margin-top: 0; + font-size: 1.1em; +} + +.search-form { + display: flex; +} + +.search-form>label { + max-width: 65%; + width: 100%; + margin-bottom: 0; +} + +.search-form>.search-submit { + max-width: 35%; + width: auto; +} + +.widget_search .search-form { + max-width: 400px; +} + +.widget_search .search-form .search-field { + width: 100%; +} + +@media screen and (min-width: 350px) { + .search-form { + flex-wrap: wrap; + } + + .search-form>label, + .search-form>.search-submit { + max-width: -moz-fit-content; + max-width: fit-content; + width: auto; + } + + .widget_search .search-form { + flex-wrap: nowrap; + } + + .widget_search .search-form>label { + max-width: 65%; + width: 100%; + } + + body.double-sidebar .widget_search .search-form>label { + max-width: 62%; + } + + .widget_search .search-form>.search-submit { + max-width: 35%; + } + + body.double-sidebar .widget_search .search-form>.search-submit { + max-width: 38%; + } +} + +.widget ul, +.widget ol { + margin: 0; + padding: 0; + list-style-position: inside; +} + +.widget ul { + list-style-type: none; +} + +.widget li>ul, +.widget li>ol { + margin-right: 1.5em; +} + +.widget li:not(:first-child) { + padding-top: .4em; +} + +.widget li:not(:last-child) { + padding-bottom: .4em; +} + +.c-sidebar .widget li:not(:last-child) { + border-bottom: 1px solid #e1e1e1; +} + +.widget li>ul>li:first-child, +.widget li>ol>li:first-child { + padding-top: .4em; +} + +.widget li.wp-social-link:not(:first-child) { + padding-top: 0; +} + +.widget li.wp-social-link:not(:last-child) { + padding-bottom: 0; +} + +.c-sidebar .widget li.wp-social-link { + border-width: 0; +} + +.c-sidebar a { + color: #404040; +} + +.c-sidebar a:hover, +.c-sidebar a:focus, +.c-sidebar a:active { + color: #f69275; + text-decoration: underline; +} + +.widget li a, +.wp-block-tag-cloud .tag-cloud-link, +.widget .tagcloud .tag-cloud-link { + text-decoration: none; +} + +.widget .textwidget>*:last-child { + margin-bottom: 0; +} + +.widget .textwidget a { + text-decoration: underline; +} + +.widget .wp-calendar-table { + margin-bottom: .5em; + text-align: center; +} + +.widget .wp-calendar-table caption { + padding-bottom: .5em; +} + +.widget .wp-calendar-table th, +.widget .wp-calendar-table td { + padding: .2em .4em; +} + +.widget .wp-calendar-nav { + display: flex; + flex-wrap: wrap; + justify-content: space-between; +} + +.widget .gallery { + margin-bottom: 0; +} + +.widget .gallery-item { + margin: 0; + padding: 5px 0 5px 10px; +} + +.widget .wp-block-latest-comments__comment { + margin-bottom: 0; +} + +/* Sticky Sidebar +--------------------------------------------- */ +@media screen and (min-width: 1024px) { + body:not(.double-sidebar) .inner-wrapper-sticky { + padding-bottom: 1px; + } +} + +@media screen and (min-width: 1280px) { + body.double-sidebar .inner-wrapper-sticky { + padding-bottom: 1px; + } +} + +/*-------------------------------------------------------------- +# Footer +--------------------------------------------------------------*/ + +/* Footer Widgets +--------------------------------------------- */ +.footer-widgets { + padding: .5em 0; + font-size: .85em; + color: #fff; + background: #232323; +} + +.footer-widgets-wrap { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: flex-start; + border-bottom: 1px solid #666; +} + +.c-sidebar-footer { + margin-top: 1.5em; + padding: 0 14px; +} + +.footer-widgets-1 .c-sidebar-footer { + flex-basis: 100%; +} + +@media screen and (min-width: 350px) { + .c-sidebar-footer { + padding: 0 24px; + } +} + +@media screen and (min-width: 576px) { + .c-sidebar-footer { + padding: 0; + } + + .footer-widgets-4 .c-sidebar-footer, + .footer-widgets-3 .c-sidebar-footer, + .footer-widgets-2 .c-sidebar-footer { + flex-basis: calc(50% - 40px); + } +} + +@media screen and (min-width: 1024px) { + + .footer-widgets-4 .c-sidebar-footer, + .footer-widgets-3 .c-sidebar-footer { + flex-basis: calc(33.33333333% - 45px); + } + + .footer-widgets-2 .c-sidebar-footer { + flex-basis: calc(50% - 45px); + } +} + +@media screen and (min-width: 1200px) { + .footer-widgets-4 .c-sidebar-footer { + flex-basis: calc(25% - 47px); + } + + .footer-widgets-3 .c-sidebar-footer { + flex-basis: calc(33.33333333% - 47px); + } + + .footer-widgets-2 .c-sidebar-footer { + flex-basis: calc(50% - 47px); + } +} + +@media screen and (min-width: 1280px) { + .footer-widgets-4 .c-sidebar-footer { + flex-basis: calc(25% - 50px); + } + + .footer-widgets-3 .c-sidebar-footer { + flex-basis: calc(33.33333333% - 50px); + } + + .footer-widgets-2 .c-sidebar-footer { + flex-basis: calc(50% - 50px); + } +} + +.footer-widgets .widget .widget-title, +.footer-widgets .widget_block h1:first-child, +.footer-widgets .widget_block h2:first-child, +.footer-widgets .widget_block h3:first-child { + margin-bottom: .8em; + padding-bottom: .4em; +} + +.footer-widgets a { + color: #b7b7b7; +} + +.footer-widgets a:hover, +.footer-widgets a:focus, +.footer-widgets a:active { + color: #fff; + text-decoration: underline; +} + +.footer-widgets .widget .wp-calendar-table table, +.footer-widgets .widget .wp-calendar-table th, +.footer-widgets .widget .wp-calendar-table td { + border-color: #666; +} + +.footer-widgets .wp-block-calendar caption, +.footer-widgets .wp-block-calendar tbody { + color: inherit; +} + +.footer-widgets .wp-block-calendar th { + background-color: transparent; +} + +.pressbook-dark .wp-block-table figcaption, +.pressbook-dark .wp-block-video figcaption, +.pressbook-dark .wp-block-audio figcaption, +.pressbook-dark .wp-block-embed figcaption, +.pressbook-dark .wp-block-image figcaption, +.pressbook-dark .wp-block-gallery figcaption, +.pressbook-dark .wp-block-calendar table caption, +.pressbook-dark .wp-block-calendar table tbody { + color: #a7a7a7; +} + +/* Copyright Text +--------------------------------------------- */ +.copyright-text { + padding: 1em 0; + text-align: center; + font-size: .8em; + color: #e1e1e1; + background: #232323; +} + +.copyright-text-wrap>p { + display: inline-block; + margin: 0; +} + +.copyright-text a { + color: #f69275; + text-decoration: none; +} + +.copyright-text a:hover, +.copyright-text a:focus, +.copyright-text a:active { + color: #fff; + text-decoration: underline; +} + +/* Go to Top +--------------------------------------------- */ +.go-to-top { + position: fixed; + bottom: 30px; + left: 30px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 32px; + height: 32px; + line-height: 32px; + border-radius: 50%; + opacity: 0; + visibility: hidden; + z-index: 9999; + background: rgba(0, 0, 0, .35); + box-shadow: 0 0 10px rgba(0, 0, 0, .05); + transition: opacity .5s, visibility .5s; +} + +.go-to-top:hover, +.go-to-top:focus { + background: linear-gradient(0deg, #522db8 0%, #166dd6 100%); +} + +.go-to-top:focus { + outline: none; + box-shadow: 0px 0px 3px #522db8; +} + +.go-to-top:active { + background: #522db8; +} + +.go-to-top::after { + content: ""; + border-right: 6px solid transparent; + border-left: 6px solid transparent; + border-bottom: 11px solid #fff; + position: relative; + bottom: 1px; +} + +.go-to-top--show { + opacity: .8; + visibility: visible; +} + +.go-to-top--fade-out { + opacity: .6; +} + +@media screen and (min-width: 1024px) { + .go-to-top { + width: 34px; + height: 34px; + line-height: 34px; + } + + .go-to-top::after { + border-right-width: 7px; + border-left-width: 7px; + border-bottom-width: 12px; + } +} + +/*-------------------------------------------------------------- +# Plugins +--------------------------------------------------------------*/ + +/* WooCommerce +--------------------------------------------- */ +body.woocommerce-page:not(.archive) .site-main, +body.woocommerce-page.wc-no-sidebar .site-main { + max-width: 100%; + width: 100%; +} + +@media screen and (min-width: 1024px) { + + /* No Sidebar */ + body.woocommerce-page.wc-no-sidebar .site-main { + padding-right: 49px; + padding-left: 49px; + } + + /* Single Sidebar */ + body.woocommerce-page.archive.wc-sidebar .site-main { + max-width: 630px; + padding-right: 24px; + padding-left: 24px; + } + + body.woocommerce-page.archive.wc-sidebar .c-sidebar .widget { + padding: 19px 24px; + } + + body.woocommerce-page.archive.wc-sidebar .c-sidebar-shop { + margin-left: 25px; + order: -1; + } +} + +@media screen and (min-width: 1200px) { + + /* Single Sidebar */ + body.woocommerce-page.archive.wc-sidebar .site-main { + max-width: 730px; + padding-right: 39px; + padding-left: 39px; + } + + body.woocommerce-page.archive.wc-sidebar .c-sidebar { + max-width: 340px; + } + + body.woocommerce-page.archive.wc-sidebar .c-sidebar-shop { + margin-left: auto; + } + + body.woocommerce-page.archive.wc-sidebar .c-sidebar .widget { + padding: 24px 29px; + } + + /* Large Width */ + body.woocommerce-page.archive.wc-sidebar.double-sidebar .site-main { + max-width: 100%; + } + + body.woocommerce-page.archive.wc-sidebar.double-sidebar .c-sidebar-shop { + min-width: 300px; + margin-left: 40px; + } +} + +.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item:not(:first-child) { + padding-top: .4em; +} + +.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item:not(:last-child) { + padding-bottom: .4em; +} + +.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item>ul>li:first-child, +.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item>ol>li:first-child { + padding-top: .4em; +} + +.woocommerce table.shop_attributes td { + padding: 0 8px; +} + +.woocommerce-product-search { + display: flex; +} + +.woocommerce-product-search>.search-field { + max-width: 65%; + width: 100%; +} + +.woocommerce-product-search>button { + max-width: 35%; + width: auto; +} + +@media screen and (min-width: 350px) { + .woocommerce-product-search { + flex-wrap: nowrap; + } + + .woocommerce-product-search>.search-field { + max-width: 65%; + width: 100%; + } + + body.double-sidebar .woocommerce-product-search>.search-field { + max-width: 60%; + } + + .woocommerce-product-search>button { + max-width: 35%; + } + + body.double-sidebar .woocommerce-product-search>button { + max-width: 40%; + } +} + +/* Jetpack infinite scroll +--------------------------------------------- */ + +/* Hide the Posts Navigation and the Footer when Infinite Scroll is in use. */ +.infinite-scroll .navigation.pagination, +.infinite-scroll.neverending .site-footer { + display: none; +} + +/* Re-display the Theme Footer when Infinite Scroll has reached its end. */ +.infinity-end.neverending .site-footer { + display: block; +} + +body.infinite-scroll #infinite-handle { + margin-top: 1.5em; +} + +/*-------------------------------------------------------------- +# Utilities +--------------------------------------------------------------*/ +#page .t-margin { + margin-top: 1.5em; +} + +#page .b-margin { + margin-bottom: 1.5em; +} + +#page .no-t-margin { + margin-top: 0; +} + +#page .no-b-margin { + margin-bottom: 0; +} + +#page .no-t-padding { + padding-top: 0; +} + +#page .no-b-padding { + padding-bottom: 0; +} + +#page .no-x-padding { + padding-right: 0; + padding-left: 0; +} + +#page .u-transparent-bg { + background: transparent; + border: 0; +} + +.u-justify { + display: flex; + gap: 0.5em; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + align-items: center; +} + +.u-justify-left { + justify-content: flex-start; +} + +.u-justify-right { + justify-content: flex-end; +} + +/* Accessibility +--------------------------------------------- */ +.hide-clip, +.hide-entry-meta>*, +.hide-posted-on>.posted-on, +.hide-posted-by>.posted-by { + position: absolute; + clip: rect(1px, 1px, 1px, 1px); +} + +/* Text meant only for screen readers. */ +.screen-reader-text { + border: 0; + clip: rect(1px, 1px, 1px, 1px); + -webkit-clip-path: inset(50%); + clip-path: inset(50%); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute !important; + width: 1px; + word-wrap: normal !important; +} + +.screen-reader-text:focus { + background: #f1f1f1; + border-radius: 3px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, .6); + clip: auto !important; + -webkit-clip-path: none; + clip-path: none; + color: #21759b; + display: block; + font-size: .875rem; + font-weight: 600; + height: auto; + right: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; +} + +/* Do not show the outline on the skip link target. */ +#primary[tabindex="-1"]:focus { + outline: 0; +} + +/* Alignments +--------------------------------------------- */ +.alignleft { + float: left; + margin-right: 1.5em; + margin-bottom: 1.5em; +} + +.alignright { + float: right; + margin-left: 1.5em; + margin-bottom: 1.5em; +} + +.aligncenter { + clear: both; + display: block; + margin-right: auto; + margin-left: auto; + margin-bottom: 1.5em; +} + +.entry-content .alignfull, +body.page.page-template-default .entry-content .alignfull, +body.page.page-template-small .entry-content .alignfull, +body.page.page-template-medium .entry-content .alignfull, +body.page.page-template-large .entry-content .alignfull, +body.page.page-template-full .entry-content .alignfull, +#page .block-section .entry-content .alignfull { + margin-right: calc(50% - 50vw); + max-width: 100vw; + width: 100vw; +} + +.entry-content .alignwide { + margin-right: -15px; + width: calc(100% + 30px); + max-width: calc(100% + 30px); +} + +@media screen and (min-width: 576px) { + .entry-content .alignwide { + margin-right: -35px; + width: calc(100% + 70px); + max-width: calc(100% + 70px); + } +} + +@media screen and (min-width: 1024px) { + + /* No Sidebar */ + body.no-sidebar .entry-content .alignwide, + body.page.page-template-default .entry-content .alignwide, + body.page.page-template-small .entry-content .alignwide, + body.page.page-template-medium .entry-content .alignwide, + body.page.page-template-large .entry-content .alignwide, + body.page.page-template-full .entry-content .alignwide, + #page .block-section .entry-content .alignwide { + margin-right: -50px; + width: calc(100% + 100px); + max-width: calc(100% + 100px); + } + + /* Single Sidebar */ + body.single-sidebar .entry-content .alignfull, + body.single-sidebar .entry-content .alignwide { + margin-right: -25px; + width: calc(100% + 50px); + max-width: calc(100% + 50px); + } + + /* Double Sidebar */ + body.double-sidebar .entry-content .alignwide { + margin-right: -50px; + width: calc(100% + 100px); + max-width: calc(100% + 100px); + } +} + +@media screen and (min-width: 1200px) { + + /* Single Sidebar */ + body.single-sidebar .entry-content .alignfull, + body.single-sidebar .entry-content .alignwide { + margin-right: -40px; + width: calc(100% + 80px); + max-width: calc(100% + 80px); + } +} + +@media screen and (min-width: 1280px) { + + /* Double Sidebar */ + body.double-sidebar .entry-content .alignfull, + body.double-sidebar .entry-content .alignwide { + margin-right: -30px; + width: calc(100% + 60px); + max-width: calc(100% + 60px); + } +} + +/* Clearings +--------------------------------------------- */ +.clear:before, +.clear:after, +.entry-content:before, +.entry-content:after, +.entry-footer:before, +.entry-footer:after, +.site-content:before, +.site-content:after, +.site-footer:before, +.site-footer:after, +.has-drop-cap:after, +.navigation.post-navigation .nav-links:after, +.c-sidebar .widget:after, +.c-sidebar-footer .widget:after { + content: ""; + display: table; + table-layout: fixed; +} + +.clear:after, +.entry-content:after, +.entry-footer:after, +.site-content:after, +.site-footer:after, +.has-drop-cap:after, +.navigation.post-navigation .nav-links:after, +.page-links, +.c-sidebar .widget:after, +.c-sidebar-footer .widget:after { + clear: both; +} \ No newline at end of file diff --git a/style.css b/style.css new file mode 100644 index 0000000..5592127 --- /dev/null +++ b/style.css @@ -0,0 +1,3531 @@ +/* +Theme Name: PressBook +Theme URI: https://scriptstown.com/wordpress-themes/pressbook/ +Author: ScriptsTown +Author URI: https://scriptstown.com/ +Description: PressBook is a multi-purpose WordPress theme suitable for blogs, news, marketing, and educational websites. The theme offers a fully responsive, clean, modern, and pixel-perfect design that can adjust automatically to fit the content elements in the best possible manner for any screen-size device. It has a minimal dependency, an SEO-friendly layout, and offers high performance with a quick loading time. It supports double sidebars, a single sidebar, footer widgets, an eye-catching gradient colors scheme for buttons and the top bar, a top advertisement banner area with a custom header background, and customizable options. Both the sidebars can be configured to be shown on the left or on the right. This theme is great to publish documentation, tutorials, events, status updates, story updates, technology blogs, reviews, newsfeeds, etc. It comes with sticky sidebars that float with scrolling. The theme supports multiple page templates with page-level layout settings, blog layouts, conditional block areas, page builders, different color settings, footer options, and much more. Also, the theme comes with three menu locations which include a fully accessible multi-level primary menu with a search form, a top bar navigation menu, and social links menu. It is also great for building schools, university, institutes, and academic, or educational websites. +Version: 1.9.1 +Requires at least: 5.3 +Tested up to: 6.3 +Requires PHP: 7.0 +License: GNU General Public License v2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html +Text Domain: pressbook +Tags: blog, education, news, one-column, two-columns, three-columns, left-sidebar, right-sidebar, block-styles, custom-background, custom-colors, custom-header, custom-logo, custom-menu, editor-style, featured-images, flexible-header, footer-widgets, full-width-template, rtl-language-support, sticky-post, theme-options, threaded-comments, translation-ready, wide-blocks +*/ + +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +# Generic + - Normalize + - Box sizing +# Base + - Typography + - Elements + - Links + - Forms +# Blocks +# Layout + - Wrapper + - Content Sidebar + - Double Sidebars Layout (Large-Screen Devices) +# Header + - Top Navbar + - Site Branding + - Top Banner + - Primary Navbar + - Primary Menu Search +# Content + - Posts and pages + - Comments + - Media + - Captions + - Galleries + - Forms +# Sidebar + - Sidebar Widgets + - Sticky Sidebar +# Footer + - Footer Widgets + - Copyright Text + - Go to Top +# Plugins + - WooCommerce + - Jetpack infinite scroll +# Utilities + - Accessibility + - Alignments + - Clearings + +--------------------------------------------------------------*/ + +/*-------------------------------------------------------------- +# Generic +--------------------------------------------------------------*/ + +/* Normalize +--------------------------------------------- */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ +html { + line-height: 1.15; + -webkit-text-size-adjust: 100%; +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 1.94em; + margin: .67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +pre { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ +a { + background: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -.25em; +} + +sup { + top: -.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0; +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ +fieldset { + padding: .35em .75em .625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ +[hidden] { + display: none; +} + +/* Box sizing +--------------------------------------------- */ + +/* Inherit box-sizing to more easily change it's value on a component level. +@link http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ */ +*, +*::before, +*::after { + box-sizing: inherit; +} + +html { + box-sizing: border-box; +} + +/*-------------------------------------------------------------- +# Base +--------------------------------------------------------------*/ + +/* Typography +--------------------------------------------- */ +body, +button, +input, +select, +optgroup, +textarea { + color: #404040; + font-family: 'Inter', Arial, Helvetica, sans-serif; + font-size: 16px; + font-size: 1rem; + line-height: 1.75; +} + +@media screen and (min-width: 768px) { + + body, + button, + input, + select, + optgroup, + textarea { + font-size: 17px; + font-size: 1.0625rem; + } +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: 'Lato', Helvetica, Arial, sans-serif; + font-weight: 700; + line-height: 1.5; + clear: both; +} + +h2 { + font-size: 1.78em; + margin: .73em 0; +} + +h3 { + font-size: 1.62em; + margin: .8em 0; +} + +h4 { + font-size: 1.46em; + margin: .89em 0; +} + +h5 { + font-size: 1.3em; + margin: 1em 0; +} + +h6 { + font-size: 1.14em; + margin: 1.14em 0; +} + +p { + margin-top: 0; + margin-bottom: 1.5em; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote { + margin: 0 1.5em; +} + +address { + margin: 0 0 1.5em; +} + +pre { + background: #eee; + font-family: 'Courier 10 Pitch', courier, monospace; + line-height: 1.6; + margin-bottom: 1.75em; + max-width: 100%; + overflow: auto; + padding: 1.6em; +} + +code, +kbd, +tt, +var { + font-family: monaco, consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace; +} + +abbr, +acronym { + border-bottom: 1px dotted #666; + cursor: help; +} + +mark, +ins { + background: #fff9c0; + text-decoration: none; +} + +big { + font-size: 125%; +} + +/* Elements +--------------------------------------------- */ +body { + background: #ededed; +} + +hr { + background: #ccc; + border: 0; + height: 1px; + margin-bottom: 1.5em; +} + +ul, +ol { + margin: 0 0 1.5em 0; + padding: 0; + list-style-position: inside; +} + +ul { + list-style-type: disc; +} + +ol { + list-style-type: decimal; +} + +ul ul, +ol ul { + list-style-type: circle; +} + +li>ul, +li>ol { + margin-bottom: 0; + margin-left: 1.5em; +} + +li:not(:first-child) { + padding-top: .2em; +} + +li:not(:last-child) { + padding-bottom: .2em; +} + +li>ul>li:first-child, +li>ol>li:first-child { + padding-top: .4em; +} + +dt { + font-weight: 700; +} + +dd { + margin: 0 1.5em 1.5em; +} + +/* Make sure embeds and iframes fit their containers. */ +embed, +iframe, +object { + max-width: 100%; +} + +img { + height: auto; + max-width: 100%; +} + +figure { + margin: 0 0 1em 0; +} + +table { + margin: 0 0 1.5em; + width: 100%; + border-collapse: collapse; +} + +table, +th, +td { + border: 1px solid #e1e1e1; +} + +th, +td { + padding: .2em .4em; +} + +/* Links +--------------------------------------------- */ +a { + text-decoration: underline; + transition: color .2s; +} + +a { + color: #166dd6; +} + +a:hover, +a:focus, +a:active { + color: #f69275; +} + +a:focus { + outline: thin dotted; +} + +a:focus:not(:focus-visible), +a:hover, +a:active { + outline: 0; +} + +p.has-text-color a, +p.has-text-color a:hover, +p.has-text-color a:focus, +p.has-text-color a:active { + color: inherit; +} + +/* Forms +--------------------------------------------- */ +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +.more-link, +.wp-block-search .wp-block-search__button { + position: relative; + padding: .45em 1em .5em; + line-height: 1; + font-weight: 600; + border-radius: 0; + border-color: transparent; + color: #fff; + background-image: linear-gradient(to right, #f3c841 0%, #f69275 51%, #f3c841 100%); + background-size: 200% auto; + transition: all .3s ease-in-out; +} + +button:hover, +input[type="button"]:hover, +input[type="reset"]:hover, +input[type="submit"]:hover, +.more-link:hover, +.wp-block-search .wp-block-search__button:hover, +button:active, +button:focus, +input[type="button"]:active, +input[type="button"]:focus, +input[type="reset"]:active, +input[type="reset"]:focus, +input[type="submit"]:active, +input[type="submit"]:focus, +.more-link:active, +.more-link:focus, +.wp-block-search .wp-block-search__button:active, +.wp-block-search .wp-block-search__button:focus { + color: #fff; + background-position: right center; +} + +button:active, +button:focus, +input[type="button"]:active, +input[type="button"]:focus, +input[type="reset"]:active, +input[type="reset"]:focus, +input[type="submit"]:active, +input[type="submit"]:focus, +.more-link:active, +.more-link:focus, +.wp-block-search .wp-block-search__button:active, +.wp-block-search .wp-block-search__button:focus { + outline-style: dashed; + outline-width: thin; +} + +button:focus:not(:focus-visible), +input[type="button"]:focus:not(:focus-visible), +input[type="reset"]:focus:not(:focus-visible), +input[type="submit"]:focus:not(:focus-visible), +.more-link:focus:not(:focus-visible), +.wp-block-search .wp-block-search__button:focus:not(:focus-visible) { + outline: none; +} + +input[type="text"], +input[type="email"], +input[type="url"], +input[type="password"], +input[type="search"], +input[type="number"], +input[type="tel"], +input[type="range"], +input[type="date"], +input[type="month"], +input[type="week"], +input[type="time"], +input[type="datetime"], +input[type="datetime-local"], +input[type="color"], +textarea, +select { + display: block; + max-width: 100%; + padding: 8px 10px; + border: 1px solid #ccc; + border-radius: 0; + color: #666; +} + +input[type="text"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="password"]:focus, +input[type="search"]:focus, +input[type="number"]:focus, +input[type="tel"]:focus, +input[type="range"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="week"]:focus, +input[type="time"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="color"]:focus, +textarea:focus, +select:focus { + color: #111; + outline-style: dashed; + outline-width: thin; +} + +input[type="text"], +input[type="email"], +input[type="url"], +input[type="password"], +input[type="search"], +input[type="number"], +input[type="tel"], +input[type="range"], +input[type="date"], +input[type="month"], +input[type="week"], +input[type="time"], +input[type="datetime"], +input[type="datetime-local"], +input[type="color"] { + line-height: normal; +} + +textarea { + width: 100%; +} + +/*-------------------------------------------------------------- +# Blocks +--------------------------------------------------------------*/ +.wp-block-quote p { + margin-bottom: .75em; +} + +.wp-block-quote.is-large p, +.wp-block-quote.is-style-large p { + font-size: 1.3em; +} + +.wp-block-quote__citation, +.wp-block-quote cite, +.wp-block-quote footer { + font-size: .85em; +} + +.wp-block-quote.is-large cite, +.wp-block-quote.is-large footer, +.wp-block-quote.is-style-large cite, +.wp-block-quote.is-style-large footer { + font-size: .95em; +} + +.wp-block-quote, +.wp-block-quote.is-large, +.wp-block-quote.is-style-large { + margin-bottom: 1.75em; +} + +.wp-block-pullquote { + padding: 2.4em 0; +} + +.wp-block-pullquote p { + font-size: 1.75em; + margin-bottom: 0; +} + +.wp-block-pullquote__citation, +.wp-block-pullquote cite, +.wp-block-pullquote footer { + display: block; + margin-top: 1.5em; +} + +.wp-block-pullquote.is-style-solid-color blockquote p { + font-size: 1.9em; +} + +.wp-block-pullquote.is-style-solid-color blockquote { + max-width: 70%; +} + +.wp-block-pullquote.is-style-solid-color blockquote cite { + color: inherit; +} + +.wp-block-table, +.wp-block-video, +.wp-block-audio, +.wp-block-embed, +.wp-block-image, +.wp-block-gallery, +.wp-block-media-text, +.wp-block-calendar { + margin-bottom: 1.5em; +} + +.wp-block-media-text .wp-block-media-text__media { + margin-bottom: 1em; +} + +@media screen and (min-width: 600px) { + .wp-block-media-text .wp-block-media-text__media { + margin-bottom: 0; + } +} + +.wp-block-calendar table:where(:not(.has-text-color)) { + color: inherit; +} + +.wp-block-table table, +.wp-block-calendar .wp-calendar-table { + margin-bottom: 0; +} + +.wp-block-calendar .wp-calendar-nav { + margin-top: .5em; +} + +.wp-block-image img { + display: block; +} + +.wp-block-table figcaption, +.wp-block-video figcaption, +.wp-block-embed figcaption, +.wp-block-image figcaption, +.wp-block-gallery figcaption { + font-size: .85em; +} + +.wp-block-table figcaption, +.wp-block-video figcaption, +.wp-block-embed figcaption, +.wp-block-image figcaption { + margin-top: 1em; + margin-bottom: 0; +} + +.wp-block-audio figcaption { + margin-top: .75em; + margin-bottom: 0; + font-size: .8em; +} + +.wp-block-table.is-style-stripes { + border-bottom: 0; +} + +.wp-block-code { + padding: 0; + border: 0; + border-radius: 0; +} + +.wp-block-code>code { + padding: .8em 1em; + border: 1px solid #ddd; + border-radius: 4px; + color: inherit; +} + +.wp-block-search .wp-block-search__inside-wrapper { + display: flex; +} + +.wp-block-search .wp-block-search__input { + border: 1px solid #ccc; +} + +.wp-block-search .wp-block-search__button { + margin-left: 0; +} + +.wp-block-search__input>.wp-block-search__input { + max-width: 65%; + width: 100%; +} + +.wp-block-search__input>.wp-block-search__button { + max-width: 35%; + width: auto; +} + +.wp-block-search__button.has-icon { + padding: 0 .4em; +} + +.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__input { + padding: 7px 10px; +} + +@media screen and (min-width: 600px) { + .wp-block-search .wp-block-search__input { + flex-wrap: nowrap; + } + + .wp-block-search__input>.wp-block-search__input { + max-width: 65%; + width: 100%; + } + + .wp-block-search__input>.wp-block-search__button { + max-width: 35%; + } +} + +.wp-block-rss { + padding: 0; + list-style-type: none; +} + +.wp-block-rss .wp-block-rss__item:not(:last-child) { + margin-bottom: 1em; +} + +.wp-block-rss .wp-block-rss__item:not(:first-child) { + padding-top: 0; +} + +.wp-block-latest-comments__comment { + line-height: inherit; +} + +.wp-block-button__link { + text-decoration: none; +} + +.wp-block-social-links .wp-block-social-link { + padding: 0; +} + +/*-------------------------------------------------------------- +# Layout +--------------------------------------------------------------*/ +.site { + display: flex; + flex-direction: column; + min-height: 100vh; + overflow-x: hidden; +} + +.site-content { + flex-grow: 1; +} + +/* Wrapper +--------------------------------------------- */ +.u-wrapper { + width: 100%; + margin-left: auto; + margin-right: auto; + padding-left: 10px; + padding-right: 10px; +} + +@media screen and (min-width: 576px) { + .u-wrapper { + max-width: 540px; + padding-left: 15px; + padding-right: 15px; + } +} + +@media screen and (min-width: 768px) { + .u-wrapper { + max-width: 720px; + } +} + +@media screen and (min-width: 992px) { + .u-wrapper { + max-width: 960px; + } +} + +@media screen and (min-width: 1200px) { + .u-wrapper { + max-width: 1140px; + } +} + +@media screen and (min-width: 1280px) { + body.double-sidebar .u-wrapper { + max-width: 1230px; + } +} + +@media screen and (min-width: 1360px) { + body.double-sidebar .u-wrapper { + max-width: 1280px; + } +} + +@media screen and (min-width: 1400px) { + body.double-sidebar .u-wrapper { + max-width: 1320px; + } +} + +/* Content Sidebar +--------------------------------------------- */ +.pb-content-sidebar { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: flex-start; + margin-top: 1.5em; +} + +.pb-content-sidebar::after { + content: ''; + width: 100%; +} + +.site-main { + max-width: 670px; + width: 100%; + flex-basis: 100%; + margin-bottom: 1.5em; +} + +body.page.page-template-small .pb-content-sidebar { + max-width: 750px; +} + +body.page.page-template-medium .pb-content-sidebar { + max-width: 1140px; +} + +body.page.page-template-large .pb-content-sidebar { + max-width: 1320px; +} + +body.page.page-template-full .pb-content-sidebar, +body.page.page-template-default .site-main, +body.page.page-template-small .site-main, +body.page.page-template-medium .site-main, +body.page.page-template-large .site-main, +body.page.page-template-full .site-main { + max-width: 100%; +} + +body.content-no-t-padding .site .site-content .site-main, +body.side-widget-no-t-padding .site .site-content .c-sidebar .widget { + padding-top: 0; +} + +body.content-no-b-padding .site .site-content .site-main, +body.side-widget-no-b-padding .site .site-content .c-sidebar .widget { + padding-bottom: 0; +} + +body.content-no-x-padding .site .site-content .site-main, +body.side-widget-no-x-padding .site .site-content .c-sidebar .widget { + padding-left: 0; + padding-right: 0; +} + +body.side-widget-no-shadow .c-sidebar .widget { + box-shadow: none; +} + +.c-sidebar { + max-width: 310px; + min-width: 260px; + flex-grow: 1; + flex-basis: 30%; +} + +.c-sidebar-left { + order: 1; +} + +.c-sidebar-right { + order: 2; +} + +.site-main, +.c-sidebar .widget { + padding: 14px; + background: #fff; +} + +.site-main { + border: 1px solid #fff; +} + +.c-sidebar .widget { + border: 1px solid #fafafa; + box-shadow: 1px 2px 3px rgba(0, 0, 0, .07); +} + +@media screen and (min-width: 350px) { + .c-sidebar { + max-width: 330px; + } + + .c-sidebar .widget { + padding: 19px 24px; + } + + /* Double Sidebar */ + body.double-sidebar .c-sidebar { + min-width: 330px; + } +} + +@media screen and (min-width: 576px) { + .site-main { + padding: 24px 34px; + } + + .c-sidebar { + max-width: 340px; + } + + .c-sidebar .widget { + padding: 24px 29px; + } +} + +@media screen and (min-width: 768px) { + + /* Double Sidebar */ + body.double-sidebar .pb-content-sidebar { + flex-wrap: wrap; + } + + body.double-sidebar .pb-content-sidebar::after { + content: ''; + } + + body.double-sidebar .c-sidebar { + max-width: 320px; + } + + body.double-sidebar .c-sidebar .widget { + padding-left: 24px; + padding-right: 24px; + } + + body.double-sidebar .c-sidebar-left, + body.double-sidebar .c-sidebar-right { + margin-left: auto; + margin-right: auto; + } +} + +@media screen and (min-width: 1024px) { + .pb-content-sidebar { + flex-wrap: nowrap; + } + + .pb-content-sidebar::after { + content: none; + } + + .site-main { + padding-top: 29px; + padding-bottom: 29px; + } + + /* No Sidebar */ + body.no-sidebar .site-main { + max-width: 750px; + } + + body.no-sidebar .site-main, + body.page.page-template-default .site-main, + body.page.page-template-small .site-main, + body.page.page-template-medium .site-main, + body.page.page-template-large .site-main, + body.page.page-template-full .site-main { + padding-left: 49px; + padding-right: 49px; + } + + /* Single Sidebar */ + body.single-sidebar .site-main { + max-width: 630px; + padding-left: 24px; + padding-right: 24px; + } + + body.single-sidebar .c-sidebar .widget { + padding: 19px 24px; + } + + body.single-sidebar .c-sidebar-left { + margin-right: 25px; + order: -1; + } + + body.single-sidebar .c-sidebar-right { + margin-left: 25px; + } + + /* Double Sidebar */ + body.double-sidebar .site-main { + max-width: 750px; + padding-left: 49px; + padding-right: 49px; + } +} + +@media screen and (min-width: 1200px) { + + /* No Sidebar */ + body.no-sidebar .site-main { + max-width: 750px; + } + + /* Single Sidebar */ + body.single-sidebar .site-main { + max-width: 730px; + padding-left: 39px; + padding-right: 39px; + } + + .c-sidebar { + max-width: 340px; + } + + body.single-sidebar .c-sidebar-left { + margin-right: auto; + } + + body.single-sidebar .c-sidebar-right { + margin-left: auto; + } + + body.single-sidebar .c-sidebar .widget { + padding: 24px 29px; + } +} + +@media screen and (min-width: 1280px) { + + /* Double Sidebar */ + body.double-sidebar .site-main { + max-width: 600px; + padding-left: 29px; + padding-right: 29px; + } + + body.double-sidebar .pb-content-sidebar { + flex-wrap: nowrap; + } + + body.double-sidebar .pb-content-sidebar::after { + content: none; + } + + body.double-sidebar .c-sidebar { + min-width: 260px; + } + + body.double-sidebar .c-sidebar-left { + order: -1; + margin-left: 0; + margin-right: 25px; + } + + body.double-sidebar .c-sidebar-right { + order: 1; + margin-left: 25px; + margin-right: 0; + } + + body.double-sidebar .c-sidebar .widget { + padding: 19px; + } +} + +@media screen and (min-width: 1360px) { + + /* Double Sidebar */ + body.double-sidebar .site-main { + max-width: 660px; + } +} + +/* Double Sidebars Layout (Large-Screen Devices) +--------------------------------------------- */ +@media screen and (min-width: 1280px) { + body.double-sidebar.side-widget-ld-lg-left .c-sidebar-right { + order: -1; + margin-left: 0; + margin-right: 25px; + } + + body.double-sidebar.side-widget-ld-lg-right .c-sidebar-left { + order: 0; + margin-left: 25px; + margin-right: 0; + } +} + +/*-------------------------------------------------------------- +# Header +--------------------------------------------------------------*/ + +/* Top Navbar +--------------------------------------------- */ +.top-navbar { + background: linear-gradient(0deg, #166dd6 0%, #1257ab 100%); + color: #fff; +} + +.top-menus { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + line-height: 1.6em; +} + +.top-menus .menu { + list-style-type: none; + margin: 0; + padding: 0; + display: inline-flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; +} + +.top-menus li { + padding: .4rem .75rem; + border: 1px solid rgba(255, 255, 255, .25); + margin-bottom: 0; + margin-left: -1px; +} + +@media screen and (min-width: 768px) { + .top-menus { + justify-content: flex-start; + } + + .top-menus>nav { + flex-grow: 1; + } +} + +.social-navigation a { + color: #fff; +} + +.social-navigation a .svg-icon { + width: 1.55em; + height: 1.55em; + padding: .15em; + border: 1px solid transparent; + transition: .25s all; +} + +.social-navigation a:hover .svg-icon, +.social-navigation a:focus .svg-icon, +.social-navigation a:active .svg-icon { + color: #166dd6; + background: #fff; + border-color: #fff; + border-radius: 50%; + text-shadow: 0 1px 1px rgba(0, 0, 0, .15); +} + +@media screen and (min-width: 768px) { + .social-navigation { + flex-basis: 38%; + } + + .social-navigation .menu { + justify-content: flex-start; + } +} + +.top-navigation { + font-size: .8em; +} + +.top-navigation a { + text-decoration: none; + color: #fff; + border-bottom: 2px solid transparent; + transition: .2s border-color; +} + +.top-navigation a:hover, +.top-navigation a:focus, +.top-navigation a:active { + color: #fff; + border-color: #fff; + text-shadow: 0 1px 1px rgba(0, 0, 0, .15); +} + +@media screen and (min-width: 768px) { + .top-navigation { + flex-basis: 62%; + text-align: right; + } + + .top-navigation .menu { + justify-content: flex-end; + } +} + +/* Site Branding +--------------------------------------------- */ +.site-branding { + padding: 1em 0; + background-color: #fff; + background-position: center center; + background-size: contain; + background-repeat: repeat; +} + +.site-branding-wrap { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; +} + +.site-logo-title { + max-width: 600px; + display: flex; + align-items: center; +} + +.has-banner-next-sm { + margin-right: 1rem; +} + +@media screen and (min-width: 576px) { + .has-banner-next-md { + margin-right: 1rem; + } +} + +@media screen and (min-width: 768px) { + .site-branding-wrap { + flex-wrap: nowrap; + justify-content: space-between; + } + + .has-banner-next-lg { + margin-right: 1rem; + } +} + +.site-branding .custom-logo-link img { + display: block; + max-width: 12em; + max-height: 3.55em; + width: auto; + height: auto; +} + +.site-branding .custom-logo-link { + color: #404040; +} + +.site-logo-only .custom-logo-link { + margin-right: 0; +} + +.site-logo-title:not(.site-logo-only) .custom-logo-link { + margin-right: .75rem; +} + +.site-title, +.site-tagline { + margin: 0; +} + +.site-title { + font-family: 'Lato', Helvetica, Arial, sans-serif; + font-size: 1.2em; + line-height: 1.5; + font-weight: 700; + word-break: break-word; +} + +.site-title a { + text-decoration: none; +} + +.site-title, +.site-title a, +.site-title a:hover, +.site-title a:focus, +.site-title a:active { + color: #404040; +} + +.site-tagline { + font-size: .8em; + color: #979797; +} + +.logo--sm-size-1 .custom-logo-link img { + max-width: 12em; + max-height: 3.55em; +} + +.logo--sm-size-2 .custom-logo-link img { + max-width: 13.5em; + max-height: 3.85em; +} + +.logo--sm-size-3 .custom-logo-link img { + max-width: 15em; + max-height: 4.15em; +} + +.logo--sm-size-4 .custom-logo-link img { + max-width: 16.5em; + max-height: 4.45em; +} + +.logo--sm-size-5 .custom-logo-link img { + max-width: 18em; + max-height: 4.75em; +} + +.site-title--sm-size-1 { + font-size: 1.1em; +} + +.site-title--sm-size-2 { + font-size: 1.2em; +} + +.site-title--sm-size-3 { + font-size: 1.3em; +} + +.site-title--sm-size-4 { + font-size: 1.4em; +} + +.site-title--sm-size-5 { + font-size: 1.5em; +} + +.tagline--sm-size-1 { + font-size: .75em; +} + +.tagline--sm-size-2 { + font-size: .8em; +} + +.tagline--sm-size-3 { + font-size: .85em; +} + +.tagline--sm-size-4 { + font-size: .9em; +} + +.tagline--sm-size-5 { + font-size: .95em; +} + +@media screen and (min-width: 576px) { + .logo--md-size-1 .custom-logo-link img { + max-width: 12em; + max-height: 3.55em; + } + + .logo--md-size-2 .custom-logo-link img { + max-width: 13.5em; + max-height: 3.85em; + } + + .logo--md-size-3 .custom-logo-link img { + max-width: 15em; + max-height: 4.15em; + } + + .logo--md-size-4 .custom-logo-link img { + max-width: 16.5em; + max-height: 4.45em; + } + + .logo--md-size-5 .custom-logo-link img { + max-width: 18em; + max-height: 4.75em; + } + + .site-title--md-size-1 { + font-size: 1.1em; + } + + .site-title--md-size-2 { + font-size: 1.2em; + } + + .site-title--md-size-3 { + font-size: 1.3em; + } + + .site-title--md-size-4 { + font-size: 1.4em; + } + + .site-title--md-size-5 { + font-size: 1.5em; + } + + .tagline--md-size-1 { + font-size: .75em; + } + + .tagline--md-size-2 { + font-size: .8em; + } + + .tagline--md-size-3 { + font-size: .85em; + } + + .tagline--md-size-4 { + font-size: .9em; + } + + .tagline--md-size-5 { + font-size: .95em; + } +} + +@media screen and (min-width: 1200px) { + .logo--lg-size-1 .custom-logo-link img { + max-width: 12em; + max-height: 3.55em; + } + + .logo--lg-size-2 .custom-logo-link img { + max-width: 13.5em; + max-height: 3.85em; + } + + .logo--lg-size-3 .custom-logo-link img { + max-width: 15em; + max-height: 4.15em; + } + + .logo--lg-size-4 .custom-logo-link img { + max-width: 16.5em; + max-height: 4.45em; + } + + .logo--lg-size-5 .custom-logo-link img { + max-width: 18em; + max-height: 4.75em; + } + + .site-title--lg-size-1 { + font-size: 1.1em; + } + + .site-title--lg-size-2 { + font-size: 1.2em; + } + + .site-title--lg-size-3 { + font-size: 1.3em; + } + + .site-title--lg-size-4 { + font-size: 1.4em; + } + + .site-title--lg-size-5 { + font-size: 1.5em; + } + + .tagline--lg-size-1 { + font-size: .75em; + } + + .tagline--lg-size-2 { + font-size: .8em; + } + + .tagline--lg-size-3 { + font-size: .85em; + } + + .tagline--lg-size-4 { + font-size: .9em; + } + + .tagline--lg-size-5 { + font-size: .95em; + } +} + +/* Top Banner +--------------------------------------------- */ +.top-banner { + margin-top: 1rem; +} + +.top-banner-shadow { + box-shadow: 0 1px 35px 0 rgb(0 0 0 / 15%); +} + +.top-banner-link, +.top-banner-image { + display: block; +} + +.top-banner-link:focus { + outline: 2px solid; +} + +.top-banner-link:focus:not(:focus-visible) { + outline: none; +} + +.top-banner-image { + max-height: 150px; + width: auto; +} + +.top-banner-hide-sm, +.top-banner-hide-sm .top-banner-image { + display: none; +} + +@media screen and (min-width: 576px) { + + .top-banner-hide-sm, + .top-banner-hide-sm .top-banner-image { + display: block; + } + + .top-banner-hide-md, + .top-banner-hide-md .top-banner-image { + display: none; + } +} + +@media screen and (min-width: 768px) { + .top-banner { + margin-top: 0; + max-width: 60%; + } + + .top-banner-hide-md, + .top-banner-hide-md .top-banner-image { + display: block; + } +} + +@media screen and (min-width: 1200px) { + .top-banner { + max-width: 70%; + } +} + +/* Primary Navbar +--------------------------------------------- */ +.primary-navbar { + padding: .5em 0; + font-size: .95em; + font-weight: 600; + background: #166dd6; + color: #fff; +} + +.main-navigation ul { + display: none; + list-style-type: none; + margin: 0; + padding: 0; +} + +.main-navigation.toggled ul { + display: block; +} + +.main-navigation { + display: flex; + flex-direction: column; +} + +.primary-menu-toggle { + align-self: flex-end; + display: inline-block; + padding: .35em .4em; +} + +.primary-menu-toggle .svg-icon { + width: 1.55em; + height: 1.55em; +} + +.main-navigation.toggled .primary-menu-toggle .svg-icon:first-child, +.main-navigation:not(.toggled) .primary-menu-toggle .svg-icon:last-child { + display: none; +} + +.main-navigation li { + position: relative; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + padding: .4em; +} + +.main-navigation li>a { + flex-basis: auto; + width: 100%; +} + +.main-navigation li.menu-item-has-children>a { + width: calc(100% - 35px); +} + +.main-navigation-arrow-btn { + width: 30px; + flex-shrink: 0; + padding: 5px 6px; + border: none; + background: transparent; + color: #fff; + cursor: pointer; + transition: .25s all; +} + +.main-navigation-arrow-btn:focus { + color: #fff; +} + +.main-navigation-arrow-btn .svg-icon { + width: .95em; + height: .95em; +} + +.main-navigation:not(.toggled) li:hover>.main-navigation-arrow-btn, +.main-navigation li.focus>.main-navigation-arrow-btn, +.main-navigation .main-navigation-arrow-btn:hover, +.main-navigation .main-navigation-arrow-btn:active { + background: #fff; + color: #166dd6; +} + +.primary-menu-toggle:focus, +.main-navigation li .main-navigation-arrow-btn:focus { + outline: 2px dotted #fff; +} + +.primary-menu-toggle:focus:not(:focus-visible), +.main-navigation li .main-navigation-arrow-btn:focus:not(:focus-visible) { + outline: none; +} + +.main-navigation ul ul { + position: absolute; + left: 30px; + width: calc(100% - 15px); + flex-grow: 0; + flex-shrink: 0; + display: block; + padding: 0; + opacity: 0; + height: 0; + overflow: hidden; + background: #166dd6; + transition: .3s all; + z-index: -1; +} + +.main-navigation:not(.toggled):not(.main-navigation--touch) ul li:hover>ul, +.main-navigation ul li.focus>ul { + position: relative; + top: 5px; + left: 15px; + opacity: 1; + height: auto; + overflow: visible; + z-index: 99995; +} + +.main-navigation ul li, +.main-navigation ul ul li { + border-top: 1px solid rgba(255, 255, 255, .25); +} + +.main-navigation a { + text-decoration: none; + padding: .3em .5em; + color: #fff; + transition: .25s all; +} + +.main-navigation a:hover, +.main-navigation a:focus, +.main-navigation a:active { + color: #166dd6; + background: #fff; +} + +@media screen and (min-width: 768px) { + .primary-navbar { + padding: .25em 0; + } + + .main-navigation ul { + display: flex; + flex-wrap: wrap; + } + + .primary-menu-toggle { + display: none; + } + + .main-navigation { + display: block; + } + + .main-navigation>div { + max-width: 100%; + } + + .main-navigation ul li { + border: 0; + } + + .main-navigation .menu>li:first-child { + padding: .2em .2em .2em 0; + } + + .main-navigation .menu>li:not(:first-child), + .main-navigation ul ul li { + padding: .2em; + } + + .main-navigation .menu>li.menu-item-has-children>a { + width: auto; + } + + .main-navigation ul ul li.menu-item-has-children>a { + width: calc(100% - 32px); + } + + .main-navigation-arrow-btn { + margin-left: 2px; + } + + .main-navigation ul ul { + width: auto; + left: 15%; + transition: .2s all; + } + + .main-navigation:not(.toggled):not(.main-navigation--touch) ul li:hover>ul, + .main-navigation ul li.focus>ul { + position: absolute; + top: 100%; + left: 0; + } + + .main-navigation:not(.toggled):not(.main-navigation--touch) ul ul li:hover>ul, + .main-navigation ul ul li.focus>ul { + top: 0; + left: 100%; + } + + .main-navigation ul ul li { + width: 240px; + } +} + +/* Primary Menu Search +--------------------------------------------- */ +.primary-menu-search .primary-menu-search-toggle { + display: none; + width: 32px; + height: 32px; + justify-content: center; + align-items: center; + padding: .5em; +} + +.primary-menu-search-toggle .svg-icon { + width: 1em; + height: 1em; +} + +.primary-menu-search .search-form-wrap { + min-width: 250px; +} + +.primary-menu-search .search-form { + flex-wrap: nowrap; + padding: .4em; + overflow-x: auto; + background: #fff; + box-shadow: 1px 2px 3px rgba(0, 0, 0, .07); + z-index: 99995; +} + +.primary-menu-search .search-form>.search-submit { + max-width: 100%; +} + +.main-navigation .primary-menu-search { + justify-content: center; + align-items: center; + padding-top: 1.6em; +} + +@media screen and (min-width: 320px) { + .primary-menu-search .search-form>label { + max-width: 180px; + } +} + +@media screen and (min-width: 350px) { + .primary-menu-search .search-form>label { + max-width: 200px; + } +} + +@media screen and (min-width: 768px) { + .primary-menu-search .primary-menu-search-toggle { + display: inline-flex; + } + + .primary-menu-search .search-form>label { + max-width: 210px; + } + + .main-navigation .primary-menu-search { + display: flex; + justify-content: flex-end; + margin-left: auto; + padding-top: .4em; + } + + .primary-menu-search .search-form-wrap { + position: absolute; + top: calc(100% + 8px); + right: calc(100% - 32px); + } + + .primary-menu-search:not(.toggled) .search-form-wrap, + .primary-menu-search.toggled .svg-icon:nth-of-type(1), + .primary-menu-search-toggle .svg-icon:nth-of-type(2) { + display: none; + } + + .primary-menu-search.toggled .svg-icon:nth-of-type(2) { + display: inline-block; + } + + .primary-menu-search.toggled .search-form-wrap { + display: flex; + box-shadow: 1px 2px 3px rgba(0, 0, 0, .14); + } + + .primary-menu-search .search-form::before { + content: ''; + position: absolute; + top: -18px; + left: calc(100% - 9px); + border: 9px solid transparent; + border-bottom-color: rgba(255, 255, 255, .8); + transform: translateX(-50%); + } +} + +/*-------------------------------------------------------------- +# Content +--------------------------------------------------------------*/ + +/* Posts and pages +--------------------------------------------- */ +.updated:not(.published) { + display: none; +} + +.pb-archive { + margin-bottom: 1.5em; + padding-bottom: 1.5em; + border-bottom: 1px solid #e1e1e1; +} + +.pb-archive.has-post-thumbnail .pb-content>.post-thumbnail, +.pb-singular>.post-thumbnail { + display: block; +} + +.pb-archive.has-post-thumbnail .pb-content>.post-thumbnail { + margin-bottom: 1em; +} + +.pb-singular>.post-thumbnail { + margin-bottom: 1.5em; +} + +@media screen and (min-width: 768px) { + body.pb-content-columns .pb-archive.has-post-thumbnail .pb-content { + display: flex; + align-items: center; + } + + body.pb-content-columns .pb-archive.has-post-thumbnail .pb-content>.post-thumbnail { + width: 36%; + margin-right: 1.5em; + margin-bottom: 0; + } + + body.pb-content-columns .pb-archive.has-post-thumbnail .pb-content>*:nth-child(2) { + width: 64%; + } + + body.pb-content-cover .pb-archive.has-post-thumbnail .pb-content { + align-items: stretch; + } + + body.pb-content-cover .pb-archive .pb-content>.post-thumbnail img { + height: 100%; + -o-object-fit: cover; + object-fit: cover; + } +} + +.pb-archive .pb-content>.post-thumbnail img, +.pb-singular>.post-thumbnail img { + display: block; +} + +.pb-article a.post-thumbnail:focus:not(:focus-visible) { + outline: none; +} + +.pb-article .entry-header>.entry-title, +.page-header>.page-title { + margin-top: 0; + margin-bottom: .45em; + font-size: 1.46em; + word-break: break-word; +} + +.pb-singular:not(.type-post) .entry-header>.entry-title, +.page-header>.page-title { + margin-bottom: .875em; +} + +.pb-archv-title { + margin-top: 0; + font-size: 1.62em; +} + +.entry-title a { + text-decoration: none; +} + +.entry-title, +.entry-title a { + color: #404040; +} + +.entry-title a:hover, +.entry-title a:focus, +.entry-title a:active { + color: #f69275; +} + +.entry-meta, +.cat-links, +.tag-links { + font-size: .85em; +} + +.entry-meta { + margin-bottom: 1.1em; +} + +.hide-entry-meta { + margin-bottom: 1.5em; +} + +.cat-links, +.tag-links { + display: block; + margin-top: 1.5em; +} + +.entry-meta>* { + display: inline-block; + margin: 0 .4em .4em 0; +} + +.entry-meta a, +.cat-links a, +.tag-links a { + display: inline-block; + vertical-align: middle; + text-decoration: none; +} + +.entry-meta a, +.entry-meta .svg-icon, +.cat-links a, +.cat-links .svg-icon, +.tag-links a, +.tag-links .svg-icon { + color: #979797; +} + +.entry-meta a:hover, +.entry-meta a:focus, +.entry-meta a:active, +.cat-links a:hover, +.cat-links a:focus, +.cat-links a:active, +.tag-links a:hover, +.tag-links a:focus, +.tag-links a:active { + color: #404040; + text-decoration: underline; +} + +.entry-meta .svg-icon, +.cat-links .svg-icon, +.tag-links .svg-icon { + width: 1.5em; + height: 1.5em; + padding: .1em; +} + +.entry-meta .posted-by .svg-icon { + margin-right: -.1em; +} + +.entry-meta .comments-link .svg-icon, +.cat-links .svg-icon, +.tag-links .svg-icon { + margin-right: .3em; +} + +.more-link-wrap, +.page-content>*:last-child, +.entry-content>*:last-child, +.entry-summary>*:last-child, +.comment-content>*:last-child, +.pb-no-content>.entry-header>*:last-child { + margin-bottom: 0; +} + +.more-link-wrap { + margin-top: 1.5em; +} + +.more-link { + display: inline-block; + padding-top: .58em; + padding-bottom: .62em; + text-decoration: none; + font-size: .875rem; +} + +.more-link:hover { + text-decoration: none; +} + +.more-link:active, +.more-link:focus { + outline-color: #404040; +} + +.post-edit-link-wrap { + display: block; + margin-top: 1em; + color: #979797; +} + +.post-edit-link { + font-size: .85em; +} + +.navigation .nav-links, +.page-links { + display: flex; + flex-wrap: wrap; +} + +.navigation .nav-links, +.page-links { + margin-top: 1.5em; +} + +.navigation .nav-links .prev::before, +.navigation .nav-links .nav-previous>a::before { + content: '\00ab'; + margin-right: .3em; +} + +.navigation .nav-links .next::after, +.navigation .nav-links .nav-next>a::after { + content: '\00bb'; + margin-left: .3em; +} + +.navigation .nav-links .page-numbers, +.page-links .post-page-numbers { + margin-left: .6em; + margin-right: .6em; +} + +.navigation .nav-links .nav-previous, +.navigation .nav-links .prev { + margin-right: auto; + text-align: left; +} + +.navigation .nav-links> :first-child, +.navigation .nav-links .nav-previous, +.navigation .nav-links .prev { + margin-left: 0; +} + +.navigation .nav-links .nav-next, +.navigation .nav-links .next { + margin-left: auto; + text-align: right; +} + +.navigation .nav-links> :last-child, +.navigation .nav-links .nav-next, +.navigation .nav-links .next { + margin-right: 0; +} + +@media screen and (min-width: 768px) { + + .navigation .nav-links .nav-next, + .navigation .nav-links .nav-previous { + flex-basis: 49%; + } +} + +.navigation .nav-links a, +.page-links a { + text-decoration: none; +} + +.pagination .nav-links a:not(.prev):not(.next):hover, +.pagination .nav-links a:not(.prev):not(.next):focus, +.pagination .nav-links a:not(.prev):not(.next):active, +.page-links a:hover, +.page-links a:focus, +.page-links a:active { + text-decoration: underline; +} + +.nav-links .nav-title { + word-break: break-word; +} + +.nav-links .nav-previous>a, +.nav-links .nav-next>a { + display: inline-flex; +} + +.pb-article.sticky .pb-sticky { + color: #979797; +} + +.pb-article.sticky .pb-sticky .svg-icon { + width: 1.4em; + height: 1.4em; + margin-right: .15em; +} + +.pb-sticky-label { + display: inline-block; + vertical-align: middle; +} + +/* Comments +--------------------------------------------- */ +.comment-content a { + word-break: break-word; +} + +.comments-title { + margin-bottom: 1.5em; + padding: .5em 0; + border-bottom: 1px solid #e1e1e1; +} + +.comments-title, +.comment-reply-title { + font-size: 1.3em; +} + +.comment-list, +.comment-list .children { + list-style-type: none; +} + +.comment-list { + margin: 0; + padding: 0; +} + +.comment-list .children { + padding: 0; +} + +.comment-body { + display: flex; + flex-direction: column; + margin-bottom: 1.5em; + padding-bottom: 1.5em; + border-bottom: 1px solid #e1e1e1; +} + +.comment-meta { + margin-bottom: 1.1em; +} + +.comment-meta a { + text-decoration: none; +} + +.comment-meta .comment-author { + display: flex; + align-items: center; +} + +.comment-meta .comment-author .avatar, +.comment-meta .comment-author .fn, +.comment-meta .comment-author .says { + display: inline-block; + margin: 0 .4em .4em 0; +} + +.comment-meta .comment-author .fn { + font-weight: 600; +} + +.comment-metadata { + font-size: .85em; +} + +.comment-metadata a, +.comment-metadata .edit-link { + display: inline-block; +} + +.comment-metadata a { + margin-right: .4em; + color: #979797; +} + +.comment-metadata a:hover, +.comment-metadata a:focus, +.comment-metadata a:active { + color: #404040; + text-decoration: underline; +} + +.comment-body .reply { + display: block; + margin-top: 1em; +} + +.comment-reply-title { + margin-top: 1em; + margin-bottom: 1em; +} + +.comment-reply-title>small { + margin-left: .4em; +} + +.comments-area .must-log-in, +.comments-area .no-comments { + margin-bottom: 0; +} + +.bypostauthor .comment-author .says { + position: relative; +} + +.bypostauthor .comment-author .says::after { + content: ""; + position: absolute; + right: -18px; + top: 7px; + width: 6px; + height: 11px; + border-bottom: 3px solid; + border-right: 3px solid; + transform: rotate(45deg); + opacity: .5; +} + +.navigation.comment-navigation .nav-links { + margin-bottom: 1.5em; +} + +/* Media +--------------------------------------------- */ +.page-content .wp-smiley, +.entry-content .wp-smiley, +.comment-content .wp-smiley { + border: none; + margin-bottom: 0; + margin-top: 0; + padding: 0; +} + +/* Make sure logo link wraps around logo image. */ +.custom-logo-link { + display: inline-block; +} + +.svg-icon { + display: inline-block; + vertical-align: middle; + fill: currentColor; + line-height: 1em; +} + +/* Captions +--------------------------------------------- */ +.wp-caption { + margin-bottom: 1.5em; + max-width: 100%; +} + +.wp-caption img[class*="wp-image-"] { + display: block; + margin-left: auto; + margin-right: auto; +} + +.wp-caption .wp-caption-text { + margin: .8075em 0; +} + +.wp-caption-text { + text-align: center; +} + +/* Galleries +--------------------------------------------- */ +.gallery { + margin-bottom: 1.5em; +} + +.gallery-item { + display: inline-block; + text-align: center; + vertical-align: top; + width: 100%; +} + +.gallery-item img { + vertical-align: bottom; +} + +.gallery-columns-2 .gallery-item { + max-width: 50%; +} + +.gallery-columns-3 .gallery-item { + max-width: 33.33%; +} + +.gallery-columns-4 .gallery-item { + max-width: 25%; +} + +.gallery-columns-5 .gallery-item { + max-width: 20%; +} + +.gallery-columns-6 .gallery-item { + max-width: 16.66%; +} + +.gallery-columns-7 .gallery-item { + max-width: 14.28%; +} + +.gallery-columns-8 .gallery-item { + max-width: 12.5%; +} + +.gallery-columns-9 .gallery-item { + max-width: 11.11%; +} + +.gallery-caption { + display: block; +} + +/* Forms +--------------------------------------------- */ +.post-password-form input[type="submit"] { + margin-top: .5rem; +} + +/*-------------------------------------------------------------- +# Sidebar +--------------------------------------------------------------*/ + +/* Sidebar Widgets +--------------------------------------------- */ +.widget { + margin: 0 0 1.5em; +} + +.widget h1, +.widget h2 { + font-size: 1.1em; +} + +.widget h3 { + font-size: 1.08em; +} + +.widget h4 { + font-size: 1.05em; +} + +.widget h5 { + font-size: 1.02em; +} + +.widget h6 { + font-size: 1em; +} + +.c-sidebar { + width: 100%; + font-size: .95em; + color: #404040; +} + +.c-sidebar .widget .widget-title, +.c-sidebar .widget_block h1:first-child, +.c-sidebar .widget_block h2:first-child, +.c-sidebar .widget_block h3:first-child { + margin-bottom: 1.5em; + padding-bottom: .5em; + border-bottom: 2px solid #eee; +} + +.c-sidebar .widget .widget-title::after, +.c-sidebar .widget_block h1:first-child::after, +.c-sidebar .widget_block h2:first-child::after, +.c-sidebar .widget_block h3:first-child::after { + content: ""; + background: #166dd6; + position: absolute; + left: 0; + bottom: -2px; + height: 1px; + width: 10%; +} + +.widget .widget-title, +.widget_block h1:first-child, +.widget_block h2:first-child, +.widget_block h3:first-child { + position: relative; + margin-top: 0; + font-size: 1.1em; +} + +.search-form { + display: flex; +} + +.search-form>label { + max-width: 65%; + width: 100%; + margin-bottom: 0; +} + +.search-form>.search-submit { + max-width: 35%; + width: auto; +} + +.widget_search .search-form { + max-width: 400px; +} + +.widget_search .search-form .search-field { + width: 100%; +} + +@media screen and (min-width: 350px) { + .search-form { + flex-wrap: wrap; + } + + .search-form>label, + .search-form>.search-submit { + max-width: -moz-fit-content; + max-width: fit-content; + width: auto; + } + + .widget_search .search-form { + flex-wrap: nowrap; + } + + .widget_search .search-form>label { + max-width: 65%; + width: 100%; + } + + body.double-sidebar .widget_search .search-form>label { + max-width: 62%; + } + + .widget_search .search-form>.search-submit { + max-width: 35%; + } + + body.double-sidebar .widget_search .search-form>.search-submit { + max-width: 38%; + } +} + +.widget ul, +.widget ol { + margin: 0; + padding: 0; + list-style-position: inside; +} + +.widget ul { + list-style-type: none; +} + +.widget li>ul, +.widget li>ol { + margin-left: 1.5em; +} + +.widget li:not(:first-child) { + padding-top: .4em; +} + +.widget li:not(:last-child) { + padding-bottom: .4em; +} + +.c-sidebar .widget li:not(:last-child) { + border-bottom: 1px solid #e1e1e1; +} + +.widget li>ul>li:first-child, +.widget li>ol>li:first-child { + padding-top: .4em; +} + +.widget li.wp-social-link:not(:first-child) { + padding-top: 0; +} + +.widget li.wp-social-link:not(:last-child) { + padding-bottom: 0; +} + +.c-sidebar .widget li.wp-social-link { + border-width: 0; +} + +.c-sidebar a { + color: #404040; +} + +.c-sidebar a:hover, +.c-sidebar a:focus, +.c-sidebar a:active { + color: #f69275; + text-decoration: underline; +} + +.widget li a, +.wp-block-tag-cloud .tag-cloud-link, +.widget .tagcloud .tag-cloud-link { + text-decoration: none; +} + +.widget .textwidget>*:last-child { + margin-bottom: 0; +} + +.widget .textwidget a { + text-decoration: underline; +} + +.widget .wp-calendar-table { + margin-bottom: .5em; + text-align: center; +} + +.widget .wp-calendar-table caption { + padding-bottom: .5em; +} + +.widget .wp-calendar-table th, +.widget .wp-calendar-table td { + padding: .2em .4em; +} + +.widget .wp-calendar-nav { + display: flex; + flex-wrap: wrap; + justify-content: space-between; +} + +.widget .gallery { + margin-bottom: 0; +} + +.widget .gallery-item { + margin: 0; + padding: 5px 10px 5px 0; +} + +.widget .wp-block-latest-comments__comment { + margin-bottom: 0; +} + +/* Sticky Sidebar +--------------------------------------------- */ +@media screen and (min-width: 1024px) { + body:not(.double-sidebar) .inner-wrapper-sticky { + padding-bottom: 1px; + } +} + +@media screen and (min-width: 1280px) { + body.double-sidebar .inner-wrapper-sticky { + padding-bottom: 1px; + } +} + +/*-------------------------------------------------------------- +# Footer +--------------------------------------------------------------*/ + +/* Footer Widgets +--------------------------------------------- */ +.footer-widgets { + padding: .5em 0; + font-size: .85em; + color: #fff; + background: #232323; +} + +.footer-widgets-wrap { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: flex-start; + border-bottom: 1px solid #666; +} + +.c-sidebar-footer { + margin-top: 1.5em; + padding: 0 14px; +} + +.footer-widgets-1 .c-sidebar-footer { + flex-basis: 100%; +} + +@media screen and (min-width: 350px) { + .c-sidebar-footer { + padding: 0 24px; + } +} + +@media screen and (min-width: 576px) { + .c-sidebar-footer { + padding: 0; + } + + .footer-widgets-4 .c-sidebar-footer, + .footer-widgets-3 .c-sidebar-footer, + .footer-widgets-2 .c-sidebar-footer { + flex-basis: calc(50% - 40px); + } +} + +@media screen and (min-width: 1024px) { + + .footer-widgets-4 .c-sidebar-footer, + .footer-widgets-3 .c-sidebar-footer { + flex-basis: calc(33.33333333% - 45px); + } + + .footer-widgets-2 .c-sidebar-footer { + flex-basis: calc(50% - 45px); + } +} + +@media screen and (min-width: 1200px) { + .footer-widgets-4 .c-sidebar-footer { + flex-basis: calc(25% - 47px); + } + + .footer-widgets-3 .c-sidebar-footer { + flex-basis: calc(33.33333333% - 47px); + } + + .footer-widgets-2 .c-sidebar-footer { + flex-basis: calc(50% - 47px); + } +} + +@media screen and (min-width: 1280px) { + .footer-widgets-4 .c-sidebar-footer { + flex-basis: calc(25% - 50px); + } + + .footer-widgets-3 .c-sidebar-footer { + flex-basis: calc(33.33333333% - 50px); + } + + .footer-widgets-2 .c-sidebar-footer { + flex-basis: calc(50% - 50px); + } +} + +.footer-widgets .widget .widget-title, +.footer-widgets .widget_block h1:first-child, +.footer-widgets .widget_block h2:first-child, +.footer-widgets .widget_block h3:first-child { + margin-bottom: .8em; + padding-bottom: .4em; +} + +.footer-widgets a { + color: #b7b7b7; +} + +.footer-widgets a:hover, +.footer-widgets a:focus, +.footer-widgets a:active { + color: #fff; + text-decoration: underline; +} + +.footer-widgets .widget .wp-calendar-table table, +.footer-widgets .widget .wp-calendar-table th, +.footer-widgets .widget .wp-calendar-table td { + border-color: #666; +} + +.footer-widgets .wp-block-calendar caption, +.footer-widgets .wp-block-calendar tbody { + color: inherit; +} + +.footer-widgets .wp-block-calendar th { + background-color: transparent; +} + +.pressbook-dark .wp-block-table figcaption, +.pressbook-dark .wp-block-video figcaption, +.pressbook-dark .wp-block-audio figcaption, +.pressbook-dark .wp-block-embed figcaption, +.pressbook-dark .wp-block-image figcaption, +.pressbook-dark .wp-block-gallery figcaption, +.pressbook-dark .wp-block-calendar table caption, +.pressbook-dark .wp-block-calendar table tbody { + color: #a7a7a7; +} + +/* Copyright Text +--------------------------------------------- */ +.copyright-text { + padding: 1em 0; + text-align: center; + font-size: .8em; + color: #e1e1e1; + background: #232323; +} + +.copyright-text-wrap>p { + display: inline-block; + margin: 0; +} + +.copyright-text a { + color: #f69275; + text-decoration: none; +} + +.copyright-text a:hover, +.copyright-text a:focus, +.copyright-text a:active { + color: #fff; + text-decoration: underline; +} + +/* Go to Top +--------------------------------------------- */ +.go-to-top { + position: fixed; + bottom: 30px; + right: 30px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 32px; + height: 32px; + line-height: 32px; + border-radius: 50%; + opacity: 0; + visibility: hidden; + z-index: 9999; + background: rgba(0, 0, 0, .35); + box-shadow: 0 0 10px rgba(0, 0, 0, .05); + transition: opacity .5s, visibility .5s; +} + +.go-to-top:hover, +.go-to-top:focus { + background: linear-gradient(0deg, #522db8 0%, #166dd6 100%); +} + +.go-to-top:focus { + outline: none; + box-shadow: 0px 0px 3px #522db8; +} + +.go-to-top:active { + background: #522db8; +} + +.go-to-top::after { + content: ""; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 11px solid #fff; + position: relative; + bottom: 1px; +} + +.go-to-top--show { + opacity: .8; + visibility: visible; +} + +.go-to-top--fade-out { + opacity: .6; +} + +@media screen and (min-width: 1024px) { + .go-to-top { + width: 34px; + height: 34px; + line-height: 34px; + } + + .go-to-top::after { + border-left-width: 7px; + border-right-width: 7px; + border-bottom-width: 12px; + } +} + +/*-------------------------------------------------------------- +# Plugins +--------------------------------------------------------------*/ + +/* WooCommerce +--------------------------------------------- */ +body.woocommerce-page:not(.archive) .site-main, +body.woocommerce-page.wc-no-sidebar .site-main { + max-width: 100%; + width: 100%; +} + +@media screen and (min-width: 1024px) { + + /* No Sidebar */ + body.woocommerce-page.wc-no-sidebar .site-main { + padding-left: 49px; + padding-right: 49px; + } + + /* Single Sidebar */ + body.woocommerce-page.archive.wc-sidebar .site-main { + max-width: 630px; + padding-left: 24px; + padding-right: 24px; + } + + body.woocommerce-page.archive.wc-sidebar .c-sidebar .widget { + padding: 19px 24px; + } + + body.woocommerce-page.archive.wc-sidebar .c-sidebar-shop { + margin-right: 25px; + order: -1; + } +} + +@media screen and (min-width: 1200px) { + + /* Single Sidebar */ + body.woocommerce-page.archive.wc-sidebar .site-main { + max-width: 730px; + padding-left: 39px; + padding-right: 39px; + } + + body.woocommerce-page.archive.wc-sidebar .c-sidebar { + max-width: 340px; + } + + body.woocommerce-page.archive.wc-sidebar .c-sidebar-shop { + margin-right: auto; + } + + body.woocommerce-page.archive.wc-sidebar .c-sidebar .widget { + padding: 24px 29px; + } + + /* Large Width */ + body.woocommerce-page.archive.wc-sidebar.double-sidebar .site-main { + max-width: 100%; + } + + body.woocommerce-page.archive.wc-sidebar.double-sidebar .c-sidebar-shop { + min-width: 300px; + margin-right: 40px; + } +} + +.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item:not(:first-child) { + padding-top: .4em; +} + +.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item:not(:last-child) { + padding-bottom: .4em; +} + +.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item>ul>li:first-child, +.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item>ol>li:first-child { + padding-top: .4em; +} + +.woocommerce table.shop_attributes td { + padding: 0 8px; +} + +.woocommerce-product-search { + display: flex; +} + +.woocommerce-product-search>.search-field { + max-width: 65%; + width: 100%; +} + +.woocommerce-product-search>button { + max-width: 35%; + width: auto; +} + +@media screen and (min-width: 350px) { + .woocommerce-product-search { + flex-wrap: nowrap; + } + + .woocommerce-product-search>.search-field { + max-width: 65%; + width: 100%; + } + + body.double-sidebar .woocommerce-product-search>.search-field { + max-width: 60%; + } + + .woocommerce-product-search>button { + max-width: 35%; + } + + body.double-sidebar .woocommerce-product-search>button { + max-width: 40%; + } +} + +/* Jetpack infinite scroll +--------------------------------------------- */ + +/* Hide the Posts Navigation and the Footer when Infinite Scroll is in use. */ +.infinite-scroll .navigation.pagination, +.infinite-scroll.neverending .site-footer { + display: none; +} + +/* Re-display the Theme Footer when Infinite Scroll has reached its end. */ +.infinity-end.neverending .site-footer { + display: block; +} + +body.infinite-scroll #infinite-handle { + margin-top: 1.5em; +} + +/*-------------------------------------------------------------- +# Utilities +--------------------------------------------------------------*/ +#page .t-margin { + margin-top: 1.5em; +} + +#page .b-margin { + margin-bottom: 1.5em; +} + +#page .no-t-margin { + margin-top: 0; +} + +#page .no-b-margin { + margin-bottom: 0; +} + +#page .no-t-padding { + padding-top: 0; +} + +#page .no-b-padding { + padding-bottom: 0; +} + +#page .no-x-padding { + padding-left: 0; + padding-right: 0; +} + +#page .u-transparent-bg { + background: transparent; + border: 0; +} + +.u-justify { + display: flex; + gap: 0.5em; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + align-items: center; +} + +.u-justify-left { + justify-content: flex-start; +} + +.u-justify-right { + justify-content: flex-end; +} + +/* Accessibility +--------------------------------------------- */ +.hide-clip, +.hide-entry-meta>*, +.hide-posted-on>.posted-on, +.hide-posted-by>.posted-by { + position: absolute; + clip: rect(1px, 1px, 1px, 1px); +} + +/* Text meant only for screen readers. */ +.screen-reader-text { + border: 0; + clip: rect(1px, 1px, 1px, 1px); + -webkit-clip-path: inset(50%); + clip-path: inset(50%); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute !important; + width: 1px; + word-wrap: normal !important; +} + +.screen-reader-text:focus { + background: #f1f1f1; + border-radius: 3px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, .6); + clip: auto !important; + -webkit-clip-path: none; + clip-path: none; + color: #21759b; + display: block; + font-size: .875rem; + font-weight: 600; + height: auto; + left: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; +} + +/* Do not show the outline on the skip link target. */ +#primary[tabindex="-1"]:focus { + outline: 0; +} + +/* Alignments +--------------------------------------------- */ +.alignleft { + /*rtl:ignore*/ + float: left; + + /*rtl:ignore*/ + margin-right: 1.5em; + margin-bottom: 1.5em; +} + +.alignright { + /*rtl:ignore*/ + float: right; + + /*rtl:ignore*/ + margin-left: 1.5em; + margin-bottom: 1.5em; +} + +.aligncenter { + clear: both; + display: block; + margin-left: auto; + margin-right: auto; + margin-bottom: 1.5em; +} + +.entry-content .alignfull, +body.page.page-template-default .entry-content .alignfull, +body.page.page-template-small .entry-content .alignfull, +body.page.page-template-medium .entry-content .alignfull, +body.page.page-template-large .entry-content .alignfull, +body.page.page-template-full .entry-content .alignfull, +#page .block-section .entry-content .alignfull { + margin-left: calc(50% - 50vw); + max-width: 100vw; + width: 100vw; +} + +.entry-content .alignwide { + margin-left: -15px; + width: calc(100% + 30px); + max-width: calc(100% + 30px); +} + +@media screen and (min-width: 576px) { + .entry-content .alignwide { + margin-left: -35px; + width: calc(100% + 70px); + max-width: calc(100% + 70px); + } +} + +@media screen and (min-width: 1024px) { + + /* No Sidebar */ + body.no-sidebar .entry-content .alignwide, + body.page.page-template-default .entry-content .alignwide, + body.page.page-template-small .entry-content .alignwide, + body.page.page-template-medium .entry-content .alignwide, + body.page.page-template-large .entry-content .alignwide, + body.page.page-template-full .entry-content .alignwide, + #page .block-section .entry-content .alignwide { + margin-left: -50px; + width: calc(100% + 100px); + max-width: calc(100% + 100px); + } + + /* Single Sidebar */ + body.single-sidebar .entry-content .alignfull, + body.single-sidebar .entry-content .alignwide { + margin-left: -25px; + width: calc(100% + 50px); + max-width: calc(100% + 50px); + } + + /* Double Sidebar */ + body.double-sidebar .entry-content .alignwide { + margin-left: -50px; + width: calc(100% + 100px); + max-width: calc(100% + 100px); + } +} + +@media screen and (min-width: 1200px) { + + /* Single Sidebar */ + body.single-sidebar .entry-content .alignfull, + body.single-sidebar .entry-content .alignwide { + margin-left: -40px; + width: calc(100% + 80px); + max-width: calc(100% + 80px); + } +} + +@media screen and (min-width: 1280px) { + + /* Double Sidebar */ + body.double-sidebar .entry-content .alignfull, + body.double-sidebar .entry-content .alignwide { + margin-left: -30px; + width: calc(100% + 60px); + max-width: calc(100% + 60px); + } +} + +/* Clearings +--------------------------------------------- */ +.clear:before, +.clear:after, +.entry-content:before, +.entry-content:after, +.entry-footer:before, +.entry-footer:after, +.site-content:before, +.site-content:after, +.site-footer:before, +.site-footer:after, +.has-drop-cap:after, +.navigation.post-navigation .nav-links:after, +.c-sidebar .widget:after, +.c-sidebar-footer .widget:after { + content: ""; + display: table; + table-layout: fixed; +} + +.clear:after, +.entry-content:after, +.entry-footer:after, +.site-content:after, +.site-footer:after, +.has-drop-cap:after, +.navigation.post-navigation .nav-links:after, +.page-links, +.c-sidebar .widget:after, +.c-sidebar-footer .widget:after { + clear: both; +} \ No newline at end of file diff --git a/style.min-rtl.css b/style.min-rtl.css new file mode 100644 index 0000000..0a17ebf --- /dev/null +++ b/style.min-rtl.css @@ -0,0 +1 @@ +html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:1.94em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background:0 0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}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{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[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}template{display:none}[hidden]{display:none}*,::after,::before{box-sizing:inherit}html{box-sizing:border-box}body,button,input,optgroup,select,textarea{color:#404040;font-family:Inter,Arial,Helvetica,sans-serif;font-size:16px;font-size:1rem;line-height:1.75}@media screen and (min-width:768px){body,button,input,optgroup,select,textarea{font-size:17px;font-size:1.0625rem}}h1,h2,h3,h4,h5,h6{font-family:Lato,Helvetica,Arial,sans-serif;font-weight:700;line-height:1.5;clear:both}h2{font-size:1.78em;margin:.73em 0}h3{font-size:1.62em;margin:.8em 0}h4{font-size:1.46em;margin:.89em 0}h5{font-size:1.3em;margin:1em 0}h6{font-size:1.14em;margin:1.14em 0}p{margin-top:0;margin-bottom:1.5em}cite,dfn,em,i{font-style:italic}blockquote{margin:0 1.5em}address{margin:0 0 1.5em}pre{background:#eee;font-family:'Courier 10 Pitch',courier,monospace;line-height:1.6;margin-bottom:1.75em;max-width:100%;overflow:auto;padding:1.6em}code,kbd,tt,var{font-family:monaco,consolas,'Andale Mono','DejaVu Sans Mono',monospace}abbr,acronym{border-bottom:1px dotted #666;cursor:help}ins,mark{background:#fff9c0;text-decoration:none}big{font-size:125%}body{background:#ededed}hr{background:#ccc;border:0;height:1px;margin-bottom:1.5em}ol,ul{margin:0 0 1.5em 0;padding:0;list-style-position:inside}ul{list-style-type:disc}ol{list-style-type:decimal}ol ul,ul ul{list-style-type:circle}li>ol,li>ul{margin-bottom:0;margin-right:1.5em}li:not(:first-child){padding-top:.2em}li:not(:last-child){padding-bottom:.2em}li>ol>li:first-child,li>ul>li:first-child{padding-top:.4em}dt{font-weight:700}dd{margin:0 1.5em 1.5em}embed,iframe,object{max-width:100%}img{height:auto;max-width:100%}figure{margin:0 0 1em 0}table{margin:0 0 1.5em;width:100%;border-collapse:collapse}table,td,th{border:1px solid #e1e1e1}td,th{padding:.2em .4em}a{text-decoration:underline;transition:color .2s}a{color:#166dd6}a:active,a:focus,a:hover{color:#f69275}a:focus{outline:thin dotted}a:active,a:focus:not(:focus-visible),a:hover{outline:0}p.has-text-color a,p.has-text-color a:active,p.has-text-color a:focus,p.has-text-color a:hover{color:inherit}.more-link,.wp-block-search .wp-block-search__button,button,input[type=button],input[type=reset],input[type=submit]{position:relative;padding:.45em 1em .5em;line-height:1;font-weight:600;border-radius:0;border-color:transparent;color:#fff;background-image:linear-gradient(to left,#f3c841 0,#f69275 51%,#f3c841 100%);background-size:200% auto;transition:all .3s ease-in-out}.more-link:active,.more-link:focus,.more-link:hover,.wp-block-search .wp-block-search__button:active,.wp-block-search .wp-block-search__button:focus,.wp-block-search .wp-block-search__button:hover,button:active,button:focus,button:hover,input[type=button]:active,input[type=button]:focus,input[type=button]:hover,input[type=reset]:active,input[type=reset]:focus,input[type=reset]:hover,input[type=submit]:active,input[type=submit]:focus,input[type=submit]:hover{color:#fff;background-position:left center}.more-link:active,.more-link:focus,.wp-block-search .wp-block-search__button:active,.wp-block-search .wp-block-search__button:focus,button:active,button:focus,input[type=button]:active,input[type=button]:focus,input[type=reset]:active,input[type=reset]:focus,input[type=submit]:active,input[type=submit]:focus{outline-style:dashed;outline-width:thin}.more-link:focus:not(:focus-visible),.wp-block-search .wp-block-search__button:focus:not(:focus-visible),button:focus:not(:focus-visible),input[type=button]:focus:not(:focus-visible),input[type=reset]:focus:not(:focus-visible),input[type=submit]:focus:not(:focus-visible){outline:0}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=range],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{display:block;max-width:100%;padding:8px 10px;border:1px solid #ccc;border-radius:0;color:#666}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=range]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{color:#111;outline-style:dashed;outline-width:thin}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=range],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{line-height:normal}textarea{width:100%}.wp-block-quote p{margin-bottom:.75em}.wp-block-quote.is-large p,.wp-block-quote.is-style-large p{font-size:1.3em}.wp-block-quote cite,.wp-block-quote footer,.wp-block-quote__citation{font-size:.85em}.wp-block-quote.is-large cite,.wp-block-quote.is-large footer,.wp-block-quote.is-style-large cite,.wp-block-quote.is-style-large footer{font-size:.95em}.wp-block-quote,.wp-block-quote.is-large,.wp-block-quote.is-style-large{margin-bottom:1.75em}.wp-block-pullquote{padding:2.4em 0}.wp-block-pullquote p{font-size:1.75em;margin-bottom:0}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{display:block;margin-top:1.5em}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:1.9em}.wp-block-pullquote.is-style-solid-color blockquote{max-width:70%}.wp-block-pullquote.is-style-solid-color blockquote cite{color:inherit}.wp-block-audio,.wp-block-calendar,.wp-block-embed,.wp-block-gallery,.wp-block-image,.wp-block-media-text,.wp-block-table,.wp-block-video{margin-bottom:1.5em}.wp-block-media-text .wp-block-media-text__media{margin-bottom:1em}@media screen and (min-width:600px){.wp-block-media-text .wp-block-media-text__media{margin-bottom:0}}.wp-block-calendar table:where(:not(.has-text-color)){color:inherit}.wp-block-calendar .wp-calendar-table,.wp-block-table table{margin-bottom:0}.wp-block-calendar .wp-calendar-nav{margin-top:.5em}.wp-block-image img{display:block}.wp-block-embed figcaption,.wp-block-gallery figcaption,.wp-block-image figcaption,.wp-block-table figcaption,.wp-block-video figcaption{font-size:.85em}.wp-block-embed figcaption,.wp-block-image figcaption,.wp-block-table figcaption,.wp-block-video figcaption{margin-top:1em;margin-bottom:0}.wp-block-audio figcaption{margin-top:.75em;margin-bottom:0;font-size:.8em}.wp-block-table.is-style-stripes{border-bottom:0}.wp-block-code{padding:0;border:0;border-radius:0}.wp-block-code>code{padding:.8em 1em;border:1px solid #ddd;border-radius:4px;color:inherit}.wp-block-search .wp-block-search__inside-wrapper{display:flex}.wp-block-search .wp-block-search__input{border:1px solid #ccc}.wp-block-search .wp-block-search__button{margin-right:0}.wp-block-search__input>.wp-block-search__input{max-width:65%;width:100%}.wp-block-search__input>.wp-block-search__button{max-width:35%;width:auto}.wp-block-search__button.has-icon{padding:0 .4em}.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__input{padding:7px 10px}@media screen and (min-width:600px){.wp-block-search .wp-block-search__input{flex-wrap:nowrap}.wp-block-search__input>.wp-block-search__input{max-width:65%;width:100%}.wp-block-search__input>.wp-block-search__button{max-width:35%}}.wp-block-rss{padding:0;list-style-type:none}.wp-block-rss .wp-block-rss__item:not(:last-child){margin-bottom:1em}.wp-block-rss .wp-block-rss__item:not(:first-child){padding-top:0}.wp-block-latest-comments__comment{line-height:inherit}.wp-block-button__link{text-decoration:none}.wp-block-social-links .wp-block-social-link{padding:0}.site{display:flex;flex-direction:column;min-height:100vh;overflow-x:hidden}.site-content{flex-grow:1}.u-wrapper{width:100%;margin-right:auto;margin-left:auto;padding-right:10px;padding-left:10px}@media screen and (min-width:576px){.u-wrapper{max-width:540px;padding-right:15px;padding-left:15px}}@media screen and (min-width:768px){.u-wrapper{max-width:720px}}@media screen and (min-width:992px){.u-wrapper{max-width:960px}}@media screen and (min-width:1200px){.u-wrapper{max-width:1140px}}@media screen and (min-width:1280px){body.double-sidebar .u-wrapper{max-width:1230px}}@media screen and (min-width:1360px){body.double-sidebar .u-wrapper{max-width:1280px}}@media screen and (min-width:1400px){body.double-sidebar .u-wrapper{max-width:1320px}}.pb-content-sidebar{display:flex;flex-wrap:wrap;justify-content:center;align-items:flex-start;margin-top:1.5em}.pb-content-sidebar::after{content:'';width:100%}.site-main{max-width:670px;width:100%;flex-basis:100%;margin-bottom:1.5em}body.page.page-template-small .pb-content-sidebar{max-width:750px}body.page.page-template-medium .pb-content-sidebar{max-width:1140px}body.page.page-template-large .pb-content-sidebar{max-width:1320px}body.page.page-template-default .site-main,body.page.page-template-full .pb-content-sidebar,body.page.page-template-full .site-main,body.page.page-template-large .site-main,body.page.page-template-medium .site-main,body.page.page-template-small .site-main{max-width:100%}body.content-no-t-padding .site .site-content .site-main,body.side-widget-no-t-padding .site .site-content .c-sidebar .widget{padding-top:0}body.content-no-b-padding .site .site-content .site-main,body.side-widget-no-b-padding .site .site-content .c-sidebar .widget{padding-bottom:0}body.content-no-x-padding .site .site-content .site-main,body.side-widget-no-x-padding .site .site-content .c-sidebar .widget{padding-right:0;padding-left:0}body.side-widget-no-shadow .c-sidebar .widget{box-shadow:none}.c-sidebar{max-width:310px;min-width:260px;flex-grow:1;flex-basis:30%}.c-sidebar-left{order:1}.c-sidebar-right{order:2}.c-sidebar .widget,.site-main{padding:14px;background:#fff}.site-main{border:1px solid #fff}.c-sidebar .widget{border:1px solid #fafafa;box-shadow:-1px 2px 3px rgba(0,0,0,.07)}@media screen and (min-width:350px){.c-sidebar{max-width:330px}.c-sidebar .widget{padding:19px 24px}body.double-sidebar .c-sidebar{min-width:330px}}@media screen and (min-width:576px){.site-main{padding:24px 34px}.c-sidebar{max-width:340px}.c-sidebar .widget{padding:24px 29px}}@media screen and (min-width:768px){body.double-sidebar .pb-content-sidebar{flex-wrap:wrap}body.double-sidebar .pb-content-sidebar::after{content:''}body.double-sidebar .c-sidebar{max-width:320px}body.double-sidebar .c-sidebar .widget{padding-right:24px;padding-left:24px}body.double-sidebar .c-sidebar-left,body.double-sidebar .c-sidebar-right{margin-right:auto;margin-left:auto}}@media screen and (min-width:1024px){.pb-content-sidebar{flex-wrap:nowrap}.pb-content-sidebar::after{content:none}.site-main{padding-top:29px;padding-bottom:29px}body.no-sidebar .site-main{max-width:750px}body.no-sidebar .site-main,body.page.page-template-default .site-main,body.page.page-template-full .site-main,body.page.page-template-large .site-main,body.page.page-template-medium .site-main,body.page.page-template-small .site-main{padding-right:49px;padding-left:49px}body.single-sidebar .site-main{max-width:630px;padding-right:24px;padding-left:24px}body.single-sidebar .c-sidebar .widget{padding:19px 24px}body.single-sidebar .c-sidebar-left{margin-left:25px;order:-1}body.single-sidebar .c-sidebar-right{margin-right:25px}body.double-sidebar .site-main{max-width:750px;padding-right:49px;padding-left:49px}}@media screen and (min-width:1200px){body.no-sidebar .site-main{max-width:750px}body.single-sidebar .site-main{max-width:730px;padding-right:39px;padding-left:39px}.c-sidebar{max-width:340px}body.single-sidebar .c-sidebar-left{margin-left:auto}body.single-sidebar .c-sidebar-right{margin-right:auto}body.single-sidebar .c-sidebar .widget{padding:24px 29px}}@media screen and (min-width:1280px){body.double-sidebar .site-main{max-width:600px;padding-right:29px;padding-left:29px}body.double-sidebar .pb-content-sidebar{flex-wrap:nowrap}body.double-sidebar .pb-content-sidebar::after{content:none}body.double-sidebar .c-sidebar{min-width:260px}body.double-sidebar .c-sidebar-left{order:-1;margin-right:0;margin-left:25px}body.double-sidebar .c-sidebar-right{order:1;margin-right:25px;margin-left:0}body.double-sidebar .c-sidebar .widget{padding:19px}}@media screen and (min-width:1360px){body.double-sidebar .site-main{max-width:660px}}@media screen and (min-width:1280px){body.double-sidebar.side-widget-ld-lg-left .c-sidebar-right{order:-1;margin-right:0;margin-left:25px}body.double-sidebar.side-widget-ld-lg-right .c-sidebar-left{order:0;margin-right:25px;margin-left:0}}.top-navbar{background:linear-gradient(0deg,#166dd6 0,#1257ab 100%);color:#fff}.top-menus{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;line-height:1.6em}.top-menus .menu{list-style-type:none;margin:0;padding:0;display:inline-flex;flex-wrap:wrap;justify-content:center;align-items:center}.top-menus li{padding:.4rem .75rem;border:1px solid rgba(255,255,255,.25);margin-bottom:0;margin-right:-1px}@media screen and (min-width:768px){.top-menus{justify-content:flex-start}.top-menus>nav{flex-grow:1}}.social-navigation a{color:#fff}.social-navigation a .svg-icon{width:1.55em;height:1.55em;padding:.15em;border:1px solid transparent;transition:.25s all}.social-navigation a:active .svg-icon,.social-navigation a:focus .svg-icon,.social-navigation a:hover .svg-icon{color:#166dd6;background:#fff;border-color:#fff;border-radius:50%;text-shadow:0 1px 1px rgba(0,0,0,.15)}@media screen and (min-width:768px){.social-navigation{flex-basis:38%}.social-navigation .menu{justify-content:flex-start}}.top-navigation{font-size:.8em}.top-navigation a{text-decoration:none;color:#fff;border-bottom:2px solid transparent;transition:.2s border-color}.top-navigation a:active,.top-navigation a:focus,.top-navigation a:hover{color:#fff;border-color:#fff;text-shadow:0 1px 1px rgba(0,0,0,.15)}@media screen and (min-width:768px){.top-navigation{flex-basis:62%;text-align:left}.top-navigation .menu{justify-content:flex-end}}.site-branding{padding:1em 0;background-color:#fff;background-position:center center;background-size:contain;background-repeat:repeat}.site-branding-wrap{display:flex;flex-wrap:wrap;justify-content:center;align-items:center}.site-logo-title{max-width:600px;display:flex;align-items:center}.has-banner-next-sm{margin-left:1rem}@media screen and (min-width:576px){.has-banner-next-md{margin-left:1rem}}@media screen and (min-width:768px){.site-branding-wrap{flex-wrap:nowrap;justify-content:space-between}.has-banner-next-lg{margin-left:1rem}}.site-branding .custom-logo-link img{display:block;max-width:12em;max-height:3.55em;width:auto;height:auto}.site-branding .custom-logo-link{color:#404040}.site-logo-only .custom-logo-link{margin-left:0}.site-logo-title:not(.site-logo-only) .custom-logo-link{margin-left:.75rem}.site-tagline,.site-title{margin:0}.site-title{font-family:Lato,Helvetica,Arial,sans-serif;font-size:1.2em;line-height:1.5;font-weight:700;word-break:break-word}.site-title a{text-decoration:none}.site-title,.site-title a,.site-title a:active,.site-title a:focus,.site-title a:hover{color:#404040}.site-tagline{font-size:.8em;color:#979797}.logo--sm-size-1 .custom-logo-link img{max-width:12em;max-height:3.55em}.logo--sm-size-2 .custom-logo-link img{max-width:13.5em;max-height:3.85em}.logo--sm-size-3 .custom-logo-link img{max-width:15em;max-height:4.15em}.logo--sm-size-4 .custom-logo-link img{max-width:16.5em;max-height:4.45em}.logo--sm-size-5 .custom-logo-link img{max-width:18em;max-height:4.75em}.site-title--sm-size-1{font-size:1.1em}.site-title--sm-size-2{font-size:1.2em}.site-title--sm-size-3{font-size:1.3em}.site-title--sm-size-4{font-size:1.4em}.site-title--sm-size-5{font-size:1.5em}.tagline--sm-size-1{font-size:.75em}.tagline--sm-size-2{font-size:.8em}.tagline--sm-size-3{font-size:.85em}.tagline--sm-size-4{font-size:.9em}.tagline--sm-size-5{font-size:.95em}@media screen and (min-width:576px){.logo--md-size-1 .custom-logo-link img{max-width:12em;max-height:3.55em}.logo--md-size-2 .custom-logo-link img{max-width:13.5em;max-height:3.85em}.logo--md-size-3 .custom-logo-link img{max-width:15em;max-height:4.15em}.logo--md-size-4 .custom-logo-link img{max-width:16.5em;max-height:4.45em}.logo--md-size-5 .custom-logo-link img{max-width:18em;max-height:4.75em}.site-title--md-size-1{font-size:1.1em}.site-title--md-size-2{font-size:1.2em}.site-title--md-size-3{font-size:1.3em}.site-title--md-size-4{font-size:1.4em}.site-title--md-size-5{font-size:1.5em}.tagline--md-size-1{font-size:.75em}.tagline--md-size-2{font-size:.8em}.tagline--md-size-3{font-size:.85em}.tagline--md-size-4{font-size:.9em}.tagline--md-size-5{font-size:.95em}}@media screen and (min-width:1200px){.logo--lg-size-1 .custom-logo-link img{max-width:12em;max-height:3.55em}.logo--lg-size-2 .custom-logo-link img{max-width:13.5em;max-height:3.85em}.logo--lg-size-3 .custom-logo-link img{max-width:15em;max-height:4.15em}.logo--lg-size-4 .custom-logo-link img{max-width:16.5em;max-height:4.45em}.logo--lg-size-5 .custom-logo-link img{max-width:18em;max-height:4.75em}.site-title--lg-size-1{font-size:1.1em}.site-title--lg-size-2{font-size:1.2em}.site-title--lg-size-3{font-size:1.3em}.site-title--lg-size-4{font-size:1.4em}.site-title--lg-size-5{font-size:1.5em}.tagline--lg-size-1{font-size:.75em}.tagline--lg-size-2{font-size:.8em}.tagline--lg-size-3{font-size:.85em}.tagline--lg-size-4{font-size:.9em}.tagline--lg-size-5{font-size:.95em}}.top-banner{margin-top:1rem}.top-banner-shadow{box-shadow:0 1px 35px 0 rgb(0 0 0 / 15%)}.top-banner-image,.top-banner-link{display:block}.top-banner-link:focus{outline:2px solid}.top-banner-link:focus:not(:focus-visible){outline:0}.top-banner-image{max-height:150px;width:auto}.top-banner-hide-sm,.top-banner-hide-sm .top-banner-image{display:none}@media screen and (min-width:576px){.top-banner-hide-sm,.top-banner-hide-sm .top-banner-image{display:block}.top-banner-hide-md,.top-banner-hide-md .top-banner-image{display:none}}@media screen and (min-width:768px){.top-banner{margin-top:0;max-width:60%}.top-banner-hide-md,.top-banner-hide-md .top-banner-image{display:block}}@media screen and (min-width:1200px){.top-banner{max-width:70%}}.primary-navbar{padding:.5em 0;font-size:.95em;font-weight:600;background:#166dd6;color:#fff}.main-navigation ul{display:none;list-style-type:none;margin:0;padding:0}.main-navigation.toggled ul{display:block}.main-navigation{display:flex;flex-direction:column}.primary-menu-toggle{align-self:flex-end;display:inline-block;padding:.35em .4em}.primary-menu-toggle .svg-icon{width:1.55em;height:1.55em}.main-navigation.toggled .primary-menu-toggle .svg-icon:first-child,.main-navigation:not(.toggled) .primary-menu-toggle .svg-icon:last-child{display:none}.main-navigation li{position:relative;display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding:.4em}.main-navigation li>a{flex-basis:auto;width:100%}.main-navigation li.menu-item-has-children>a{width:calc(100% - 35px)}.main-navigation-arrow-btn{width:30px;flex-shrink:0;padding:5px 6px;border:none;background:0 0;color:#fff;cursor:pointer;transition:.25s all}.main-navigation-arrow-btn:focus{color:#fff}.main-navigation-arrow-btn .svg-icon{width:.95em;height:.95em}.main-navigation .main-navigation-arrow-btn:active,.main-navigation .main-navigation-arrow-btn:hover,.main-navigation li.focus>.main-navigation-arrow-btn,.main-navigation:not(.toggled) li:hover>.main-navigation-arrow-btn{background:#fff;color:#166dd6}.main-navigation li .main-navigation-arrow-btn:focus,.primary-menu-toggle:focus{outline:2px dotted #fff}.main-navigation li .main-navigation-arrow-btn:focus:not(:focus-visible),.primary-menu-toggle:focus:not(:focus-visible){outline:0}.main-navigation ul ul{position:absolute;right:30px;width:calc(100% - 15px);flex-grow:0;flex-shrink:0;display:block;padding:0;opacity:0;height:0;overflow:hidden;background:#166dd6;transition:.3s all;z-index:-1}.main-navigation ul li.focus>ul,.main-navigation:not(.toggled):not(.main-navigation--touch) ul li:hover>ul{position:relative;top:5px;right:15px;opacity:1;height:auto;overflow:visible;z-index:99995}.main-navigation ul li,.main-navigation ul ul li{border-top:1px solid rgba(255,255,255,.25)}.main-navigation a{text-decoration:none;padding:.3em .5em;color:#fff;transition:.25s all}.main-navigation a:active,.main-navigation a:focus,.main-navigation a:hover{color:#166dd6;background:#fff}@media screen and (min-width:768px){.primary-navbar{padding:.25em 0}.main-navigation ul{display:flex;flex-wrap:wrap}.primary-menu-toggle{display:none}.main-navigation{display:block}.main-navigation>div{max-width:100%}.main-navigation ul li{border:0}.main-navigation .menu>li:first-child{padding:.2em 0 .2em .2em}.main-navigation .menu>li:not(:first-child),.main-navigation ul ul li{padding:.2em}.main-navigation .menu>li.menu-item-has-children>a{width:auto}.main-navigation ul ul li.menu-item-has-children>a{width:calc(100% - 32px)}.main-navigation-arrow-btn{margin-right:2px}.main-navigation ul ul{width:auto;right:15%;transition:.2s all}.main-navigation ul li.focus>ul,.main-navigation:not(.toggled):not(.main-navigation--touch) ul li:hover>ul{position:absolute;top:100%;right:0}.main-navigation ul ul li.focus>ul,.main-navigation:not(.toggled):not(.main-navigation--touch) ul ul li:hover>ul{top:0;right:100%}.main-navigation ul ul li{width:240px}}.primary-menu-search .primary-menu-search-toggle{display:none;width:32px;height:32px;justify-content:center;align-items:center;padding:.5em}.primary-menu-search-toggle .svg-icon{width:1em;height:1em}.primary-menu-search .search-form-wrap{min-width:250px}.primary-menu-search .search-form{flex-wrap:nowrap;padding:.4em;overflow-x:auto;background:#fff;box-shadow:-1px 2px 3px rgba(0,0,0,.07);z-index:99995}.primary-menu-search .search-form>.search-submit{max-width:100%}.main-navigation .primary-menu-search{justify-content:center;align-items:center;padding-top:1.6em}@media screen and (min-width:320px){.primary-menu-search .search-form>label{max-width:180px}}@media screen and (min-width:350px){.primary-menu-search .search-form>label{max-width:200px}}@media screen and (min-width:768px){.primary-menu-search .primary-menu-search-toggle{display:inline-flex}.primary-menu-search .search-form>label{max-width:210px}.main-navigation .primary-menu-search{display:flex;justify-content:flex-end;margin-right:auto;padding-top:.4em}.primary-menu-search .search-form-wrap{position:absolute;top:calc(100% + 8px);left:calc(100% - 32px)}.primary-menu-search-toggle .svg-icon:nth-of-type(2),.primary-menu-search.toggled .svg-icon:first-of-type,.primary-menu-search:not(.toggled) .search-form-wrap{display:none}.primary-menu-search.toggled .svg-icon:nth-of-type(2){display:inline-block}.primary-menu-search.toggled .search-form-wrap{display:flex;box-shadow:-1px 2px 3px rgba(0,0,0,.14)}.primary-menu-search .search-form::before{content:'';position:absolute;top:-18px;right:calc(100% - 9px);border:9px solid transparent;border-bottom-color:rgba(255,255,255,.8);transform:translateX(50%)}}.updated:not(.published){display:none}.pb-archive{margin-bottom:1.5em;padding-bottom:1.5em;border-bottom:1px solid #e1e1e1}.pb-archive.has-post-thumbnail .pb-content>.post-thumbnail,.pb-singular>.post-thumbnail{display:block}.pb-archive.has-post-thumbnail .pb-content>.post-thumbnail{margin-bottom:1em}.pb-singular>.post-thumbnail{margin-bottom:1.5em}@media screen and (min-width:768px){body.pb-content-columns .pb-archive.has-post-thumbnail .pb-content{display:flex;align-items:center}body.pb-content-columns .pb-archive.has-post-thumbnail .pb-content>.post-thumbnail{width:36%;margin-left:1.5em;margin-bottom:0}body.pb-content-columns .pb-archive.has-post-thumbnail .pb-content>:nth-child(2){width:64%}body.pb-content-cover .pb-archive.has-post-thumbnail .pb-content{align-items:stretch}body.pb-content-cover .pb-archive .pb-content>.post-thumbnail img{height:100%;-o-object-fit:cover;object-fit:cover}}.pb-archive .pb-content>.post-thumbnail img,.pb-singular>.post-thumbnail img{display:block}.pb-article a.post-thumbnail:focus:not(:focus-visible){outline:0}.page-header>.page-title,.pb-article .entry-header>.entry-title{margin-top:0;margin-bottom:.45em;font-size:1.46em;word-break:break-word}.page-header>.page-title,.pb-singular:not(.type-post) .entry-header>.entry-title{margin-bottom:.875em}.pb-archv-title{margin-top:0;font-size:1.62em}.entry-title a{text-decoration:none}.entry-title,.entry-title a{color:#404040}.entry-title a:active,.entry-title a:focus,.entry-title a:hover{color:#f69275}.cat-links,.entry-meta,.tag-links{font-size:.85em}.entry-meta{margin-bottom:1.1em}.hide-entry-meta{margin-bottom:1.5em}.cat-links,.tag-links{display:block;margin-top:1.5em}.entry-meta>*{display:inline-block;margin:0 0 .4em .4em}.cat-links a,.entry-meta a,.tag-links a{display:inline-block;vertical-align:middle;text-decoration:none}.cat-links .svg-icon,.cat-links a,.entry-meta .svg-icon,.entry-meta a,.tag-links .svg-icon,.tag-links a{color:#979797}.cat-links a:active,.cat-links a:focus,.cat-links a:hover,.entry-meta a:active,.entry-meta a:focus,.entry-meta a:hover,.tag-links a:active,.tag-links a:focus,.tag-links a:hover{color:#404040;text-decoration:underline}.cat-links .svg-icon,.entry-meta .svg-icon,.tag-links .svg-icon{width:1.5em;height:1.5em;padding:.1em}.entry-meta .posted-by .svg-icon{margin-left:-.1em}.cat-links .svg-icon,.entry-meta .comments-link .svg-icon,.tag-links .svg-icon{margin-left:.3em}.comment-content>:last-child,.entry-content>:last-child,.entry-summary>:last-child,.more-link-wrap,.page-content>:last-child,.pb-no-content>.entry-header>:last-child{margin-bottom:0}.more-link-wrap{margin-top:1.5em}.more-link{display:inline-block;padding-top:.58em;padding-bottom:.62em;text-decoration:none;font-size:.875rem}.more-link:hover{text-decoration:none}.more-link:active,.more-link:focus{outline-color:#404040}.post-edit-link-wrap{display:block;margin-top:1em;color:#979797}.post-edit-link{font-size:.85em}.navigation .nav-links,.page-links{display:flex;flex-wrap:wrap}.navigation .nav-links,.page-links{margin-top:1.5em}.navigation .nav-links .nav-previous>a::before,.navigation .nav-links .prev::before{content:'\00ab';margin-left:.3em}.navigation .nav-links .nav-next>a::after,.navigation .nav-links .next::after{content:'\00bb';margin-right:.3em}.navigation .nav-links .page-numbers,.page-links .post-page-numbers{margin-right:.6em;margin-left:.6em}.navigation .nav-links .nav-previous,.navigation .nav-links .prev{margin-left:auto;text-align:right}.navigation .nav-links .nav-previous,.navigation .nav-links .prev,.navigation .nav-links>:first-child{margin-right:0}.navigation .nav-links .nav-next,.navigation .nav-links .next{margin-right:auto;text-align:left}.navigation .nav-links .nav-next,.navigation .nav-links .next,.navigation .nav-links>:last-child{margin-left:0}@media screen and (min-width:768px){.navigation .nav-links .nav-next,.navigation .nav-links .nav-previous{flex-basis:49%}}.navigation .nav-links a,.page-links a{text-decoration:none}.page-links a:active,.page-links a:focus,.page-links a:hover,.pagination .nav-links a:not(.prev):not(.next):active,.pagination .nav-links a:not(.prev):not(.next):focus,.pagination .nav-links a:not(.prev):not(.next):hover{text-decoration:underline}.nav-links .nav-title{word-break:break-word}.nav-links .nav-next>a,.nav-links .nav-previous>a{display:inline-flex}.pb-article.sticky .pb-sticky{color:#979797}.pb-article.sticky .pb-sticky .svg-icon{width:1.4em;height:1.4em;margin-left:.15em}.pb-sticky-label{display:inline-block;vertical-align:middle}.comment-content a{word-break:break-word}.comments-title{margin-bottom:1.5em;padding:.5em 0;border-bottom:1px solid #e1e1e1}.comment-reply-title,.comments-title{font-size:1.3em}.comment-list,.comment-list .children{list-style-type:none}.comment-list{margin:0;padding:0}.comment-list .children{padding:0}.comment-body{display:flex;flex-direction:column;margin-bottom:1.5em;padding-bottom:1.5em;border-bottom:1px solid #e1e1e1}.comment-meta{margin-bottom:1.1em}.comment-meta a{text-decoration:none}.comment-meta .comment-author{display:flex;align-items:center}.comment-meta .comment-author .avatar,.comment-meta .comment-author .fn,.comment-meta .comment-author .says{display:inline-block;margin:0 0 .4em .4em}.comment-meta .comment-author .fn{font-weight:600}.comment-metadata{font-size:.85em}.comment-metadata .edit-link,.comment-metadata a{display:inline-block}.comment-metadata a{margin-left:.4em;color:#979797}.comment-metadata a:active,.comment-metadata a:focus,.comment-metadata a:hover{color:#404040;text-decoration:underline}.comment-body .reply{display:block;margin-top:1em}.comment-reply-title{margin-top:1em;margin-bottom:1em}.comment-reply-title>small{margin-right:.4em}.comments-area .must-log-in,.comments-area .no-comments{margin-bottom:0}.bypostauthor .comment-author .says{position:relative}.bypostauthor .comment-author .says::after{content:"";position:absolute;left:-18px;top:7px;width:6px;height:11px;border-bottom:3px solid;border-left:3px solid;transform:rotate(-45deg);opacity:.5}.navigation.comment-navigation .nav-links{margin-bottom:1.5em}.comment-content .wp-smiley,.entry-content .wp-smiley,.page-content .wp-smiley{border:none;margin-bottom:0;margin-top:0;padding:0}.custom-logo-link{display:inline-block}.svg-icon{display:inline-block;vertical-align:middle;fill:currentColor;line-height:1em}.wp-caption{margin-bottom:1.5em;max-width:100%}.wp-caption img[class*=wp-image-]{display:block;margin-right:auto;margin-left:auto}.wp-caption .wp-caption-text{margin:.8075em 0}.wp-caption-text{text-align:center}.gallery{margin-bottom:1.5em}.gallery-item{display:inline-block;text-align:center;vertical-align:top;width:100%}.gallery-item img{vertical-align:bottom}.gallery-columns-2 .gallery-item{max-width:50%}.gallery-columns-3 .gallery-item{max-width:33.33%}.gallery-columns-4 .gallery-item{max-width:25%}.gallery-columns-5 .gallery-item{max-width:20%}.gallery-columns-6 .gallery-item{max-width:16.66%}.gallery-columns-7 .gallery-item{max-width:14.28%}.gallery-columns-8 .gallery-item{max-width:12.5%}.gallery-columns-9 .gallery-item{max-width:11.11%}.gallery-caption{display:block}.post-password-form input[type=submit]{margin-top:.5rem}.widget{margin:0 0 1.5em}.widget h1,.widget h2{font-size:1.1em}.widget h3{font-size:1.08em}.widget h4{font-size:1.05em}.widget h5{font-size:1.02em}.widget h6{font-size:1em}.c-sidebar{width:100%;font-size:.95em;color:#404040}.c-sidebar .widget .widget-title,.c-sidebar .widget_block h1:first-child,.c-sidebar .widget_block h2:first-child,.c-sidebar .widget_block h3:first-child{margin-bottom:1.5em;padding-bottom:.5em;border-bottom:2px solid #eee}.c-sidebar .widget .widget-title::after,.c-sidebar .widget_block h1:first-child::after,.c-sidebar .widget_block h2:first-child::after,.c-sidebar .widget_block h3:first-child::after{content:"";background:#166dd6;position:absolute;right:0;bottom:-2px;height:1px;width:10%}.widget .widget-title,.widget_block h1:first-child,.widget_block h2:first-child,.widget_block h3:first-child{position:relative;margin-top:0;font-size:1.1em}.search-form{display:flex}.search-form>label{max-width:65%;width:100%;margin-bottom:0}.search-form>.search-submit{max-width:35%;width:auto}.widget_search .search-form{max-width:400px}.widget_search .search-form .search-field{width:100%}@media screen and (min-width:350px){.search-form{flex-wrap:wrap}.search-form>.search-submit,.search-form>label{max-width:-moz-fit-content;max-width:fit-content;width:auto}.widget_search .search-form{flex-wrap:nowrap}.widget_search .search-form>label{max-width:65%;width:100%}body.double-sidebar .widget_search .search-form>label{max-width:62%}.widget_search .search-form>.search-submit{max-width:35%}body.double-sidebar .widget_search .search-form>.search-submit{max-width:38%}}.widget ol,.widget ul{margin:0;padding:0;list-style-position:inside}.widget ul{list-style-type:none}.widget li>ol,.widget li>ul{margin-right:1.5em}.widget li:not(:first-child){padding-top:.4em}.widget li:not(:last-child){padding-bottom:.4em}.c-sidebar .widget li:not(:last-child){border-bottom:1px solid #e1e1e1}.widget li>ol>li:first-child,.widget li>ul>li:first-child{padding-top:.4em}.widget li.wp-social-link:not(:first-child){padding-top:0}.widget li.wp-social-link:not(:last-child){padding-bottom:0}.c-sidebar .widget li.wp-social-link{border-width:0}.c-sidebar a{color:#404040}.c-sidebar a:active,.c-sidebar a:focus,.c-sidebar a:hover{color:#f69275;text-decoration:underline}.widget .tagcloud .tag-cloud-link,.widget li a,.wp-block-tag-cloud .tag-cloud-link{text-decoration:none}.widget .textwidget>:last-child{margin-bottom:0}.widget .textwidget a{text-decoration:underline}.widget .wp-calendar-table{margin-bottom:.5em;text-align:center}.widget .wp-calendar-table caption{padding-bottom:.5em}.widget .wp-calendar-table td,.widget .wp-calendar-table th{padding:.2em .4em}.widget .wp-calendar-nav{display:flex;flex-wrap:wrap;justify-content:space-between}.widget .gallery{margin-bottom:0}.widget .gallery-item{margin:0;padding:5px 0 5px 10px}.widget .wp-block-latest-comments__comment{margin-bottom:0}@media screen and (min-width:1024px){body:not(.double-sidebar) .inner-wrapper-sticky{padding-bottom:1px}}@media screen and (min-width:1280px){body.double-sidebar .inner-wrapper-sticky{padding-bottom:1px}}.footer-widgets{padding:.5em 0;font-size:.85em;color:#fff;background:#232323}.footer-widgets-wrap{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;border-bottom:1px solid #666}.c-sidebar-footer{margin-top:1.5em;padding:0 14px}.footer-widgets-1 .c-sidebar-footer{flex-basis:100%}@media screen and (min-width:350px){.c-sidebar-footer{padding:0 24px}}@media screen and (min-width:576px){.c-sidebar-footer{padding:0}.footer-widgets-2 .c-sidebar-footer,.footer-widgets-3 .c-sidebar-footer,.footer-widgets-4 .c-sidebar-footer{flex-basis:calc(50% - 40px)}}@media screen and (min-width:1024px){.footer-widgets-3 .c-sidebar-footer,.footer-widgets-4 .c-sidebar-footer{flex-basis:calc(33.33333333% - 45px)}.footer-widgets-2 .c-sidebar-footer{flex-basis:calc(50% - 45px)}}@media screen and (min-width:1200px){.footer-widgets-4 .c-sidebar-footer{flex-basis:calc(25% - 47px)}.footer-widgets-3 .c-sidebar-footer{flex-basis:calc(33.33333333% - 47px)}.footer-widgets-2 .c-sidebar-footer{flex-basis:calc(50% - 47px)}}@media screen and (min-width:1280px){.footer-widgets-4 .c-sidebar-footer{flex-basis:calc(25% - 50px)}.footer-widgets-3 .c-sidebar-footer{flex-basis:calc(33.33333333% - 50px)}.footer-widgets-2 .c-sidebar-footer{flex-basis:calc(50% - 50px)}}.footer-widgets .widget .widget-title,.footer-widgets .widget_block h1:first-child,.footer-widgets .widget_block h2:first-child,.footer-widgets .widget_block h3:first-child{margin-bottom:.8em;padding-bottom:.4em}.footer-widgets a{color:#b7b7b7}.footer-widgets a:active,.footer-widgets a:focus,.footer-widgets a:hover{color:#fff;text-decoration:underline}.footer-widgets .widget .wp-calendar-table table,.footer-widgets .widget .wp-calendar-table td,.footer-widgets .widget .wp-calendar-table th{border-color:#666}.footer-widgets .wp-block-calendar caption,.footer-widgets .wp-block-calendar tbody{color:inherit}.footer-widgets .wp-block-calendar th{background-color:transparent}.pressbook-dark .wp-block-audio figcaption,.pressbook-dark .wp-block-calendar table caption,.pressbook-dark .wp-block-calendar table tbody,.pressbook-dark .wp-block-embed figcaption,.pressbook-dark .wp-block-gallery figcaption,.pressbook-dark .wp-block-image figcaption,.pressbook-dark .wp-block-table figcaption,.pressbook-dark .wp-block-video figcaption{color:#a7a7a7}.copyright-text{padding:1em 0;text-align:center;font-size:.8em;color:#e1e1e1;background:#232323}.copyright-text-wrap>p{display:inline-block;margin:0}.copyright-text a{color:#f69275;text-decoration:none}.copyright-text a:active,.copyright-text a:focus,.copyright-text a:hover{color:#fff;text-decoration:underline}.go-to-top{position:fixed;bottom:30px;left:30px;display:flex;flex-direction:column;justify-content:center;align-items:center;width:32px;height:32px;line-height:32px;border-radius:50%;opacity:0;visibility:hidden;z-index:9999;background:rgba(0,0,0,.35);box-shadow:0 0 10px rgba(0,0,0,.05);transition:opacity .5s,visibility .5s}.go-to-top:focus,.go-to-top:hover{background:linear-gradient(0deg,#522db8 0,#166dd6 100%)}.go-to-top:focus{outline:0;box-shadow:0 0 3px #522db8}.go-to-top:active{background:#522db8}.go-to-top::after{content:"";border-right:6px solid transparent;border-left:6px solid transparent;border-bottom:11px solid #fff;position:relative;bottom:1px}.go-to-top--show{opacity:.8;visibility:visible}.go-to-top--fade-out{opacity:.6}@media screen and (min-width:1024px){.go-to-top{width:34px;height:34px;line-height:34px}.go-to-top::after{border-right-width:7px;border-left-width:7px;border-bottom-width:12px}}body.woocommerce-page.wc-no-sidebar .site-main,body.woocommerce-page:not(.archive) .site-main{max-width:100%;width:100%}@media screen and (min-width:1024px){body.woocommerce-page.wc-no-sidebar .site-main{padding-right:49px;padding-left:49px}body.woocommerce-page.archive.wc-sidebar .site-main{max-width:630px;padding-right:24px;padding-left:24px}body.woocommerce-page.archive.wc-sidebar .c-sidebar .widget{padding:19px 24px}body.woocommerce-page.archive.wc-sidebar .c-sidebar-shop{margin-left:25px;order:-1}}@media screen and (min-width:1200px){body.woocommerce-page.archive.wc-sidebar .site-main{max-width:730px;padding-right:39px;padding-left:39px}body.woocommerce-page.archive.wc-sidebar .c-sidebar{max-width:340px}body.woocommerce-page.archive.wc-sidebar .c-sidebar-shop{margin-left:auto}body.woocommerce-page.archive.wc-sidebar .c-sidebar .widget{padding:24px 29px}body.woocommerce-page.archive.wc-sidebar.double-sidebar .site-main{max-width:100%}body.woocommerce-page.archive.wc-sidebar.double-sidebar .c-sidebar-shop{min-width:300px;margin-left:40px}}.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item:not(:first-child){padding-top:.4em}.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item:not(:last-child){padding-bottom:.4em}.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item>ol>li:first-child,.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item>ul>li:first-child{padding-top:.4em}.woocommerce table.shop_attributes td{padding:0 8px}.woocommerce-product-search{display:flex}.woocommerce-product-search>.search-field{max-width:65%;width:100%}.woocommerce-product-search>button{max-width:35%;width:auto}@media screen and (min-width:350px){.woocommerce-product-search{flex-wrap:nowrap}.woocommerce-product-search>.search-field{max-width:65%;width:100%}body.double-sidebar .woocommerce-product-search>.search-field{max-width:60%}.woocommerce-product-search>button{max-width:35%}body.double-sidebar .woocommerce-product-search>button{max-width:40%}}.infinite-scroll .navigation.pagination,.infinite-scroll.neverending .site-footer{display:none}.infinity-end.neverending .site-footer{display:block}body.infinite-scroll #infinite-handle{margin-top:1.5em}#page .t-margin{margin-top:1.5em}#page .b-margin{margin-bottom:1.5em}#page .no-t-margin{margin-top:0}#page .no-b-margin{margin-bottom:0}#page .no-t-padding{padding-top:0}#page .no-b-padding{padding-bottom:0}#page .no-x-padding{padding-right:0;padding-left:0}#page .u-transparent-bg{background:0 0;border:0}.u-justify{display:flex;gap:.5em;flex-direction:row;flex-wrap:wrap;justify-content:center;align-items:center}.u-justify-left{justify-content:flex-start}.u-justify-right{justify-content:flex-end}.hide-clip,.hide-entry-meta>*,.hide-posted-by>.posted-by,.hide-posted-on>.posted-on{position:absolute;clip:rect(1px,1px,1px,1px)}.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;width:1px;word-wrap:normal!important}.screen-reader-text:focus{background:#f1f1f1;border-radius:3px;box-shadow:0 0 2px 2px rgba(0,0,0,.6);clip:auto!important;-webkit-clip-path:none;clip-path:none;color:#21759b;display:block;font-size:.875rem;font-weight:600;height:auto;right:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}#primary[tabindex="-1"]:focus{outline:0}.alignleft{float:left;margin-right:1.5em;margin-bottom:1.5em}.alignright{float:right;margin-left:1.5em;margin-bottom:1.5em}.aligncenter{clear:both;display:block;margin-right:auto;margin-left:auto;margin-bottom:1.5em}#page .block-section .entry-content .alignfull,.entry-content .alignfull,body.page.page-template-default .entry-content .alignfull,body.page.page-template-full .entry-content .alignfull,body.page.page-template-large .entry-content .alignfull,body.page.page-template-medium .entry-content .alignfull,body.page.page-template-small .entry-content .alignfull{margin-right:calc(50% - 50vw);max-width:100vw;width:100vw}.entry-content .alignwide{margin-right:-15px;width:calc(100% + 30px);max-width:calc(100% + 30px)}@media screen and (min-width:576px){.entry-content .alignwide{margin-right:-35px;width:calc(100% + 70px);max-width:calc(100% + 70px)}}@media screen and (min-width:1024px){#page .block-section .entry-content .alignwide,body.no-sidebar .entry-content .alignwide,body.page.page-template-default .entry-content .alignwide,body.page.page-template-full .entry-content .alignwide,body.page.page-template-large .entry-content .alignwide,body.page.page-template-medium .entry-content .alignwide,body.page.page-template-small .entry-content .alignwide{margin-right:-50px;width:calc(100% + 100px);max-width:calc(100% + 100px)}body.single-sidebar .entry-content .alignfull,body.single-sidebar .entry-content .alignwide{margin-right:-25px;width:calc(100% + 50px);max-width:calc(100% + 50px)}body.double-sidebar .entry-content .alignwide{margin-right:-50px;width:calc(100% + 100px);max-width:calc(100% + 100px)}}@media screen and (min-width:1200px){body.single-sidebar .entry-content .alignfull,body.single-sidebar .entry-content .alignwide{margin-right:-40px;width:calc(100% + 80px);max-width:calc(100% + 80px)}}@media screen and (min-width:1280px){body.double-sidebar .entry-content .alignfull,body.double-sidebar .entry-content .alignwide{margin-right:-30px;width:calc(100% + 60px);max-width:calc(100% + 60px)}}.c-sidebar .widget:after,.c-sidebar-footer .widget:after,.clear:after,.clear:before,.entry-content:after,.entry-content:before,.entry-footer:after,.entry-footer:before,.has-drop-cap:after,.navigation.post-navigation .nav-links:after,.site-content:after,.site-content:before,.site-footer:after,.site-footer:before{content:"";display:table;table-layout:fixed}.c-sidebar .widget:after,.c-sidebar-footer .widget:after,.clear:after,.entry-content:after,.entry-footer:after,.has-drop-cap:after,.navigation.post-navigation .nav-links:after,.page-links,.site-content:after,.site-footer:after{clear:both} \ No newline at end of file diff --git a/style.min.css b/style.min.css new file mode 100644 index 0000000..64b66d7 --- /dev/null +++ b/style.min.css @@ -0,0 +1 @@ +html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:1.94em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background:0 0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}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{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[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}template{display:none}[hidden]{display:none}*,::after,::before{box-sizing:inherit}html{box-sizing:border-box}body,button,input,optgroup,select,textarea{color:#404040;font-family:Inter,Arial,Helvetica,sans-serif;font-size:16px;font-size:1rem;line-height:1.75}@media screen and (min-width:768px){body,button,input,optgroup,select,textarea{font-size:17px;font-size:1.0625rem}}h1,h2,h3,h4,h5,h6{font-family:Lato,Helvetica,Arial,sans-serif;font-weight:700;line-height:1.5;clear:both}h2{font-size:1.78em;margin:.73em 0}h3{font-size:1.62em;margin:.8em 0}h4{font-size:1.46em;margin:.89em 0}h5{font-size:1.3em;margin:1em 0}h6{font-size:1.14em;margin:1.14em 0}p{margin-top:0;margin-bottom:1.5em}cite,dfn,em,i{font-style:italic}blockquote{margin:0 1.5em}address{margin:0 0 1.5em}pre{background:#eee;font-family:'Courier 10 Pitch',courier,monospace;line-height:1.6;margin-bottom:1.75em;max-width:100%;overflow:auto;padding:1.6em}code,kbd,tt,var{font-family:monaco,consolas,'Andale Mono','DejaVu Sans Mono',monospace}abbr,acronym{border-bottom:1px dotted #666;cursor:help}ins,mark{background:#fff9c0;text-decoration:none}big{font-size:125%}body{background:#ededed}hr{background:#ccc;border:0;height:1px;margin-bottom:1.5em}ol,ul{margin:0 0 1.5em 0;padding:0;list-style-position:inside}ul{list-style-type:disc}ol{list-style-type:decimal}ol ul,ul ul{list-style-type:circle}li>ol,li>ul{margin-bottom:0;margin-left:1.5em}li:not(:first-child){padding-top:.2em}li:not(:last-child){padding-bottom:.2em}li>ol>li:first-child,li>ul>li:first-child{padding-top:.4em}dt{font-weight:700}dd{margin:0 1.5em 1.5em}embed,iframe,object{max-width:100%}img{height:auto;max-width:100%}figure{margin:0 0 1em 0}table{margin:0 0 1.5em;width:100%;border-collapse:collapse}table,td,th{border:1px solid #e1e1e1}td,th{padding:.2em .4em}a{text-decoration:underline;transition:color .2s}a{color:#166dd6}a:active,a:focus,a:hover{color:#f69275}a:focus{outline:thin dotted}a:active,a:focus:not(:focus-visible),a:hover{outline:0}p.has-text-color a,p.has-text-color a:active,p.has-text-color a:focus,p.has-text-color a:hover{color:inherit}.more-link,.wp-block-search .wp-block-search__button,button,input[type=button],input[type=reset],input[type=submit]{position:relative;padding:.45em 1em .5em;line-height:1;font-weight:600;border-radius:0;border-color:transparent;color:#fff;background-image:linear-gradient(to right,#f3c841 0,#f69275 51%,#f3c841 100%);background-size:200% auto;transition:all .3s ease-in-out}.more-link:active,.more-link:focus,.more-link:hover,.wp-block-search .wp-block-search__button:active,.wp-block-search .wp-block-search__button:focus,.wp-block-search .wp-block-search__button:hover,button:active,button:focus,button:hover,input[type=button]:active,input[type=button]:focus,input[type=button]:hover,input[type=reset]:active,input[type=reset]:focus,input[type=reset]:hover,input[type=submit]:active,input[type=submit]:focus,input[type=submit]:hover{color:#fff;background-position:right center}.more-link:active,.more-link:focus,.wp-block-search .wp-block-search__button:active,.wp-block-search .wp-block-search__button:focus,button:active,button:focus,input[type=button]:active,input[type=button]:focus,input[type=reset]:active,input[type=reset]:focus,input[type=submit]:active,input[type=submit]:focus{outline-style:dashed;outline-width:thin}.more-link:focus:not(:focus-visible),.wp-block-search .wp-block-search__button:focus:not(:focus-visible),button:focus:not(:focus-visible),input[type=button]:focus:not(:focus-visible),input[type=reset]:focus:not(:focus-visible),input[type=submit]:focus:not(:focus-visible){outline:0}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=range],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{display:block;max-width:100%;padding:8px 10px;border:1px solid #ccc;border-radius:0;color:#666}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=range]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{color:#111;outline-style:dashed;outline-width:thin}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=range],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{line-height:normal}textarea{width:100%}.wp-block-quote p{margin-bottom:.75em}.wp-block-quote.is-large p,.wp-block-quote.is-style-large p{font-size:1.3em}.wp-block-quote cite,.wp-block-quote footer,.wp-block-quote__citation{font-size:.85em}.wp-block-quote.is-large cite,.wp-block-quote.is-large footer,.wp-block-quote.is-style-large cite,.wp-block-quote.is-style-large footer{font-size:.95em}.wp-block-quote,.wp-block-quote.is-large,.wp-block-quote.is-style-large{margin-bottom:1.75em}.wp-block-pullquote{padding:2.4em 0}.wp-block-pullquote p{font-size:1.75em;margin-bottom:0}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{display:block;margin-top:1.5em}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:1.9em}.wp-block-pullquote.is-style-solid-color blockquote{max-width:70%}.wp-block-pullquote.is-style-solid-color blockquote cite{color:inherit}.wp-block-audio,.wp-block-calendar,.wp-block-embed,.wp-block-gallery,.wp-block-image,.wp-block-media-text,.wp-block-table,.wp-block-video{margin-bottom:1.5em}.wp-block-media-text .wp-block-media-text__media{margin-bottom:1em}@media screen and (min-width:600px){.wp-block-media-text .wp-block-media-text__media{margin-bottom:0}}.wp-block-calendar table:where(:not(.has-text-color)){color:inherit}.wp-block-calendar .wp-calendar-table,.wp-block-table table{margin-bottom:0}.wp-block-calendar .wp-calendar-nav{margin-top:.5em}.wp-block-image img{display:block}.wp-block-embed figcaption,.wp-block-gallery figcaption,.wp-block-image figcaption,.wp-block-table figcaption,.wp-block-video figcaption{font-size:.85em}.wp-block-embed figcaption,.wp-block-image figcaption,.wp-block-table figcaption,.wp-block-video figcaption{margin-top:1em;margin-bottom:0}.wp-block-audio figcaption{margin-top:.75em;margin-bottom:0;font-size:.8em}.wp-block-table.is-style-stripes{border-bottom:0}.wp-block-code{padding:0;border:0;border-radius:0}.wp-block-code>code{padding:.8em 1em;border:1px solid #ddd;border-radius:4px;color:inherit}.wp-block-search .wp-block-search__inside-wrapper{display:flex}.wp-block-search .wp-block-search__input{border:1px solid #ccc}.wp-block-search .wp-block-search__button{margin-left:0}.wp-block-search__input>.wp-block-search__input{max-width:65%;width:100%}.wp-block-search__input>.wp-block-search__button{max-width:35%;width:auto}.wp-block-search__button.has-icon{padding:0 .4em}.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__input{padding:7px 10px}@media screen and (min-width:600px){.wp-block-search .wp-block-search__input{flex-wrap:nowrap}.wp-block-search__input>.wp-block-search__input{max-width:65%;width:100%}.wp-block-search__input>.wp-block-search__button{max-width:35%}}.wp-block-rss{padding:0;list-style-type:none}.wp-block-rss .wp-block-rss__item:not(:last-child){margin-bottom:1em}.wp-block-rss .wp-block-rss__item:not(:first-child){padding-top:0}.wp-block-latest-comments__comment{line-height:inherit}.wp-block-button__link{text-decoration:none}.wp-block-social-links .wp-block-social-link{padding:0}.site{display:flex;flex-direction:column;min-height:100vh;overflow-x:hidden}.site-content{flex-grow:1}.u-wrapper{width:100%;margin-left:auto;margin-right:auto;padding-left:10px;padding-right:10px}@media screen and (min-width:576px){.u-wrapper{max-width:540px;padding-left:15px;padding-right:15px}}@media screen and (min-width:768px){.u-wrapper{max-width:720px}}@media screen and (min-width:992px){.u-wrapper{max-width:960px}}@media screen and (min-width:1200px){.u-wrapper{max-width:1140px}}@media screen and (min-width:1280px){body.double-sidebar .u-wrapper{max-width:1230px}}@media screen and (min-width:1360px){body.double-sidebar .u-wrapper{max-width:1280px}}@media screen and (min-width:1400px){body.double-sidebar .u-wrapper{max-width:1320px}}.pb-content-sidebar{display:flex;flex-wrap:wrap;justify-content:center;align-items:flex-start;margin-top:1.5em}.pb-content-sidebar::after{content:'';width:100%}.site-main{max-width:670px;width:100%;flex-basis:100%;margin-bottom:1.5em}body.page.page-template-small .pb-content-sidebar{max-width:750px}body.page.page-template-medium .pb-content-sidebar{max-width:1140px}body.page.page-template-large .pb-content-sidebar{max-width:1320px}body.page.page-template-default .site-main,body.page.page-template-full .pb-content-sidebar,body.page.page-template-full .site-main,body.page.page-template-large .site-main,body.page.page-template-medium .site-main,body.page.page-template-small .site-main{max-width:100%}body.content-no-t-padding .site .site-content .site-main,body.side-widget-no-t-padding .site .site-content .c-sidebar .widget{padding-top:0}body.content-no-b-padding .site .site-content .site-main,body.side-widget-no-b-padding .site .site-content .c-sidebar .widget{padding-bottom:0}body.content-no-x-padding .site .site-content .site-main,body.side-widget-no-x-padding .site .site-content .c-sidebar .widget{padding-left:0;padding-right:0}body.side-widget-no-shadow .c-sidebar .widget{box-shadow:none}.c-sidebar{max-width:310px;min-width:260px;flex-grow:1;flex-basis:30%}.c-sidebar-left{order:1}.c-sidebar-right{order:2}.c-sidebar .widget,.site-main{padding:14px;background:#fff}.site-main{border:1px solid #fff}.c-sidebar .widget{border:1px solid #fafafa;box-shadow:1px 2px 3px rgba(0,0,0,.07)}@media screen and (min-width:350px){.c-sidebar{max-width:330px}.c-sidebar .widget{padding:19px 24px}body.double-sidebar .c-sidebar{min-width:330px}}@media screen and (min-width:576px){.site-main{padding:24px 34px}.c-sidebar{max-width:340px}.c-sidebar .widget{padding:24px 29px}}@media screen and (min-width:768px){body.double-sidebar .pb-content-sidebar{flex-wrap:wrap}body.double-sidebar .pb-content-sidebar::after{content:''}body.double-sidebar .c-sidebar{max-width:320px}body.double-sidebar .c-sidebar .widget{padding-left:24px;padding-right:24px}body.double-sidebar .c-sidebar-left,body.double-sidebar .c-sidebar-right{margin-left:auto;margin-right:auto}}@media screen and (min-width:1024px){.pb-content-sidebar{flex-wrap:nowrap}.pb-content-sidebar::after{content:none}.site-main{padding-top:29px;padding-bottom:29px}body.no-sidebar .site-main{max-width:750px}body.no-sidebar .site-main,body.page.page-template-default .site-main,body.page.page-template-full .site-main,body.page.page-template-large .site-main,body.page.page-template-medium .site-main,body.page.page-template-small .site-main{padding-left:49px;padding-right:49px}body.single-sidebar .site-main{max-width:630px;padding-left:24px;padding-right:24px}body.single-sidebar .c-sidebar .widget{padding:19px 24px}body.single-sidebar .c-sidebar-left{margin-right:25px;order:-1}body.single-sidebar .c-sidebar-right{margin-left:25px}body.double-sidebar .site-main{max-width:750px;padding-left:49px;padding-right:49px}}@media screen and (min-width:1200px){body.no-sidebar .site-main{max-width:750px}body.single-sidebar .site-main{max-width:730px;padding-left:39px;padding-right:39px}.c-sidebar{max-width:340px}body.single-sidebar .c-sidebar-left{margin-right:auto}body.single-sidebar .c-sidebar-right{margin-left:auto}body.single-sidebar .c-sidebar .widget{padding:24px 29px}}@media screen and (min-width:1280px){body.double-sidebar .site-main{max-width:600px;padding-left:29px;padding-right:29px}body.double-sidebar .pb-content-sidebar{flex-wrap:nowrap}body.double-sidebar .pb-content-sidebar::after{content:none}body.double-sidebar .c-sidebar{min-width:260px}body.double-sidebar .c-sidebar-left{order:-1;margin-left:0;margin-right:25px}body.double-sidebar .c-sidebar-right{order:1;margin-left:25px;margin-right:0}body.double-sidebar .c-sidebar .widget{padding:19px}}@media screen and (min-width:1360px){body.double-sidebar .site-main{max-width:660px}}@media screen and (min-width:1280px){body.double-sidebar.side-widget-ld-lg-left .c-sidebar-right{order:-1;margin-left:0;margin-right:25px}body.double-sidebar.side-widget-ld-lg-right .c-sidebar-left{order:0;margin-left:25px;margin-right:0}}.top-navbar{background:linear-gradient(0deg,#166dd6 0,#1257ab 100%);color:#fff}.top-menus{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;line-height:1.6em}.top-menus .menu{list-style-type:none;margin:0;padding:0;display:inline-flex;flex-wrap:wrap;justify-content:center;align-items:center}.top-menus li{padding:.4rem .75rem;border:1px solid rgba(255,255,255,.25);margin-bottom:0;margin-left:-1px}@media screen and (min-width:768px){.top-menus{justify-content:flex-start}.top-menus>nav{flex-grow:1}}.social-navigation a{color:#fff}.social-navigation a .svg-icon{width:1.55em;height:1.55em;padding:.15em;border:1px solid transparent;transition:.25s all}.social-navigation a:active .svg-icon,.social-navigation a:focus .svg-icon,.social-navigation a:hover .svg-icon{color:#166dd6;background:#fff;border-color:#fff;border-radius:50%;text-shadow:0 1px 1px rgba(0,0,0,.15)}@media screen and (min-width:768px){.social-navigation{flex-basis:38%}.social-navigation .menu{justify-content:flex-start}}.top-navigation{font-size:.8em}.top-navigation a{text-decoration:none;color:#fff;border-bottom:2px solid transparent;transition:.2s border-color}.top-navigation a:active,.top-navigation a:focus,.top-navigation a:hover{color:#fff;border-color:#fff;text-shadow:0 1px 1px rgba(0,0,0,.15)}@media screen and (min-width:768px){.top-navigation{flex-basis:62%;text-align:right}.top-navigation .menu{justify-content:flex-end}}.site-branding{padding:1em 0;background-color:#fff;background-position:center center;background-size:contain;background-repeat:repeat}.site-branding-wrap{display:flex;flex-wrap:wrap;justify-content:center;align-items:center}.site-logo-title{max-width:600px;display:flex;align-items:center}.has-banner-next-sm{margin-right:1rem}@media screen and (min-width:576px){.has-banner-next-md{margin-right:1rem}}@media screen and (min-width:768px){.site-branding-wrap{flex-wrap:nowrap;justify-content:space-between}.has-banner-next-lg{margin-right:1rem}}.site-branding .custom-logo-link img{display:block;max-width:12em;max-height:3.55em;width:auto;height:auto}.site-branding .custom-logo-link{color:#404040}.site-logo-only .custom-logo-link{margin-right:0}.site-logo-title:not(.site-logo-only) .custom-logo-link{margin-right:.75rem}.site-tagline,.site-title{margin:0}.site-title{font-family:Lato,Helvetica,Arial,sans-serif;font-size:1.2em;line-height:1.5;font-weight:700;word-break:break-word}.site-title a{text-decoration:none}.site-title,.site-title a,.site-title a:active,.site-title a:focus,.site-title a:hover{color:#404040}.site-tagline{font-size:.8em;color:#979797}.logo--sm-size-1 .custom-logo-link img{max-width:12em;max-height:3.55em}.logo--sm-size-2 .custom-logo-link img{max-width:13.5em;max-height:3.85em}.logo--sm-size-3 .custom-logo-link img{max-width:15em;max-height:4.15em}.logo--sm-size-4 .custom-logo-link img{max-width:16.5em;max-height:4.45em}.logo--sm-size-5 .custom-logo-link img{max-width:18em;max-height:4.75em}.site-title--sm-size-1{font-size:1.1em}.site-title--sm-size-2{font-size:1.2em}.site-title--sm-size-3{font-size:1.3em}.site-title--sm-size-4{font-size:1.4em}.site-title--sm-size-5{font-size:1.5em}.tagline--sm-size-1{font-size:.75em}.tagline--sm-size-2{font-size:.8em}.tagline--sm-size-3{font-size:.85em}.tagline--sm-size-4{font-size:.9em}.tagline--sm-size-5{font-size:.95em}@media screen and (min-width:576px){.logo--md-size-1 .custom-logo-link img{max-width:12em;max-height:3.55em}.logo--md-size-2 .custom-logo-link img{max-width:13.5em;max-height:3.85em}.logo--md-size-3 .custom-logo-link img{max-width:15em;max-height:4.15em}.logo--md-size-4 .custom-logo-link img{max-width:16.5em;max-height:4.45em}.logo--md-size-5 .custom-logo-link img{max-width:18em;max-height:4.75em}.site-title--md-size-1{font-size:1.1em}.site-title--md-size-2{font-size:1.2em}.site-title--md-size-3{font-size:1.3em}.site-title--md-size-4{font-size:1.4em}.site-title--md-size-5{font-size:1.5em}.tagline--md-size-1{font-size:.75em}.tagline--md-size-2{font-size:.8em}.tagline--md-size-3{font-size:.85em}.tagline--md-size-4{font-size:.9em}.tagline--md-size-5{font-size:.95em}}@media screen and (min-width:1200px){.logo--lg-size-1 .custom-logo-link img{max-width:12em;max-height:3.55em}.logo--lg-size-2 .custom-logo-link img{max-width:13.5em;max-height:3.85em}.logo--lg-size-3 .custom-logo-link img{max-width:15em;max-height:4.15em}.logo--lg-size-4 .custom-logo-link img{max-width:16.5em;max-height:4.45em}.logo--lg-size-5 .custom-logo-link img{max-width:18em;max-height:4.75em}.site-title--lg-size-1{font-size:1.1em}.site-title--lg-size-2{font-size:1.2em}.site-title--lg-size-3{font-size:1.3em}.site-title--lg-size-4{font-size:1.4em}.site-title--lg-size-5{font-size:1.5em}.tagline--lg-size-1{font-size:.75em}.tagline--lg-size-2{font-size:.8em}.tagline--lg-size-3{font-size:.85em}.tagline--lg-size-4{font-size:.9em}.tagline--lg-size-5{font-size:.95em}}.top-banner{margin-top:1rem}.top-banner-shadow{box-shadow:0 1px 35px 0 rgb(0 0 0 / 15%)}.top-banner-image,.top-banner-link{display:block}.top-banner-link:focus{outline:2px solid}.top-banner-link:focus:not(:focus-visible){outline:0}.top-banner-image{max-height:150px;width:auto}.top-banner-hide-sm,.top-banner-hide-sm .top-banner-image{display:none}@media screen and (min-width:576px){.top-banner-hide-sm,.top-banner-hide-sm .top-banner-image{display:block}.top-banner-hide-md,.top-banner-hide-md .top-banner-image{display:none}}@media screen and (min-width:768px){.top-banner{margin-top:0;max-width:60%}.top-banner-hide-md,.top-banner-hide-md .top-banner-image{display:block}}@media screen and (min-width:1200px){.top-banner{max-width:70%}}.primary-navbar{padding:.5em 0;font-size:.95em;font-weight:600;background:#166dd6;color:#fff}.main-navigation ul{display:none;list-style-type:none;margin:0;padding:0}.main-navigation.toggled ul{display:block}.main-navigation{display:flex;flex-direction:column}.primary-menu-toggle{align-self:flex-end;display:inline-block;padding:.35em .4em}.primary-menu-toggle .svg-icon{width:1.55em;height:1.55em}.main-navigation.toggled .primary-menu-toggle .svg-icon:first-child,.main-navigation:not(.toggled) .primary-menu-toggle .svg-icon:last-child{display:none}.main-navigation li{position:relative;display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding:.4em}.main-navigation li>a{flex-basis:auto;width:100%}.main-navigation li.menu-item-has-children>a{width:calc(100% - 35px)}.main-navigation-arrow-btn{width:30px;flex-shrink:0;padding:5px 6px;border:none;background:0 0;color:#fff;cursor:pointer;transition:.25s all}.main-navigation-arrow-btn:focus{color:#fff}.main-navigation-arrow-btn .svg-icon{width:.95em;height:.95em}.main-navigation .main-navigation-arrow-btn:active,.main-navigation .main-navigation-arrow-btn:hover,.main-navigation li.focus>.main-navigation-arrow-btn,.main-navigation:not(.toggled) li:hover>.main-navigation-arrow-btn{background:#fff;color:#166dd6}.main-navigation li .main-navigation-arrow-btn:focus,.primary-menu-toggle:focus{outline:2px dotted #fff}.main-navigation li .main-navigation-arrow-btn:focus:not(:focus-visible),.primary-menu-toggle:focus:not(:focus-visible){outline:0}.main-navigation ul ul{position:absolute;left:30px;width:calc(100% - 15px);flex-grow:0;flex-shrink:0;display:block;padding:0;opacity:0;height:0;overflow:hidden;background:#166dd6;transition:.3s all;z-index:-1}.main-navigation ul li.focus>ul,.main-navigation:not(.toggled):not(.main-navigation--touch) ul li:hover>ul{position:relative;top:5px;left:15px;opacity:1;height:auto;overflow:visible;z-index:99995}.main-navigation ul li,.main-navigation ul ul li{border-top:1px solid rgba(255,255,255,.25)}.main-navigation a{text-decoration:none;padding:.3em .5em;color:#fff;transition:.25s all}.main-navigation a:active,.main-navigation a:focus,.main-navigation a:hover{color:#166dd6;background:#fff}@media screen and (min-width:768px){.primary-navbar{padding:.25em 0}.main-navigation ul{display:flex;flex-wrap:wrap}.primary-menu-toggle{display:none}.main-navigation{display:block}.main-navigation>div{max-width:100%}.main-navigation ul li{border:0}.main-navigation .menu>li:first-child{padding:.2em .2em .2em 0}.main-navigation .menu>li:not(:first-child),.main-navigation ul ul li{padding:.2em}.main-navigation .menu>li.menu-item-has-children>a{width:auto}.main-navigation ul ul li.menu-item-has-children>a{width:calc(100% - 32px)}.main-navigation-arrow-btn{margin-left:2px}.main-navigation ul ul{width:auto;left:15%;transition:.2s all}.main-navigation ul li.focus>ul,.main-navigation:not(.toggled):not(.main-navigation--touch) ul li:hover>ul{position:absolute;top:100%;left:0}.main-navigation ul ul li.focus>ul,.main-navigation:not(.toggled):not(.main-navigation--touch) ul ul li:hover>ul{top:0;left:100%}.main-navigation ul ul li{width:240px}}.primary-menu-search .primary-menu-search-toggle{display:none;width:32px;height:32px;justify-content:center;align-items:center;padding:.5em}.primary-menu-search-toggle .svg-icon{width:1em;height:1em}.primary-menu-search .search-form-wrap{min-width:250px}.primary-menu-search .search-form{flex-wrap:nowrap;padding:.4em;overflow-x:auto;background:#fff;box-shadow:1px 2px 3px rgba(0,0,0,.07);z-index:99995}.primary-menu-search .search-form>.search-submit{max-width:100%}.main-navigation .primary-menu-search{justify-content:center;align-items:center;padding-top:1.6em}@media screen and (min-width:320px){.primary-menu-search .search-form>label{max-width:180px}}@media screen and (min-width:350px){.primary-menu-search .search-form>label{max-width:200px}}@media screen and (min-width:768px){.primary-menu-search .primary-menu-search-toggle{display:inline-flex}.primary-menu-search .search-form>label{max-width:210px}.main-navigation .primary-menu-search{display:flex;justify-content:flex-end;margin-left:auto;padding-top:.4em}.primary-menu-search .search-form-wrap{position:absolute;top:calc(100% + 8px);right:calc(100% - 32px)}.primary-menu-search-toggle .svg-icon:nth-of-type(2),.primary-menu-search.toggled .svg-icon:first-of-type,.primary-menu-search:not(.toggled) .search-form-wrap{display:none}.primary-menu-search.toggled .svg-icon:nth-of-type(2){display:inline-block}.primary-menu-search.toggled .search-form-wrap{display:flex;box-shadow:1px 2px 3px rgba(0,0,0,.14)}.primary-menu-search .search-form::before{content:'';position:absolute;top:-18px;left:calc(100% - 9px);border:9px solid transparent;border-bottom-color:rgba(255,255,255,.8);transform:translateX(-50%)}}.updated:not(.published){display:none}.pb-archive{margin-bottom:1.5em;padding-bottom:1.5em;border-bottom:1px solid #e1e1e1}.pb-archive.has-post-thumbnail .pb-content>.post-thumbnail,.pb-singular>.post-thumbnail{display:block}.pb-archive.has-post-thumbnail .pb-content>.post-thumbnail{margin-bottom:1em}.pb-singular>.post-thumbnail{margin-bottom:1.5em}@media screen and (min-width:768px){body.pb-content-columns .pb-archive.has-post-thumbnail .pb-content{display:flex;align-items:center}body.pb-content-columns .pb-archive.has-post-thumbnail .pb-content>.post-thumbnail{width:36%;margin-right:1.5em;margin-bottom:0}body.pb-content-columns .pb-archive.has-post-thumbnail .pb-content>:nth-child(2){width:64%}body.pb-content-cover .pb-archive.has-post-thumbnail .pb-content{align-items:stretch}body.pb-content-cover .pb-archive .pb-content>.post-thumbnail img{height:100%;-o-object-fit:cover;object-fit:cover}}.pb-archive .pb-content>.post-thumbnail img,.pb-singular>.post-thumbnail img{display:block}.pb-article a.post-thumbnail:focus:not(:focus-visible){outline:0}.page-header>.page-title,.pb-article .entry-header>.entry-title{margin-top:0;margin-bottom:.45em;font-size:1.46em;word-break:break-word}.page-header>.page-title,.pb-singular:not(.type-post) .entry-header>.entry-title{margin-bottom:.875em}.pb-archv-title{margin-top:0;font-size:1.62em}.entry-title a{text-decoration:none}.entry-title,.entry-title a{color:#404040}.entry-title a:active,.entry-title a:focus,.entry-title a:hover{color:#f69275}.cat-links,.entry-meta,.tag-links{font-size:.85em}.entry-meta{margin-bottom:1.1em}.hide-entry-meta{margin-bottom:1.5em}.cat-links,.tag-links{display:block;margin-top:1.5em}.entry-meta>*{display:inline-block;margin:0 .4em .4em 0}.cat-links a,.entry-meta a,.tag-links a{display:inline-block;vertical-align:middle;text-decoration:none}.cat-links .svg-icon,.cat-links a,.entry-meta .svg-icon,.entry-meta a,.tag-links .svg-icon,.tag-links a{color:#979797}.cat-links a:active,.cat-links a:focus,.cat-links a:hover,.entry-meta a:active,.entry-meta a:focus,.entry-meta a:hover,.tag-links a:active,.tag-links a:focus,.tag-links a:hover{color:#404040;text-decoration:underline}.cat-links .svg-icon,.entry-meta .svg-icon,.tag-links .svg-icon{width:1.5em;height:1.5em;padding:.1em}.entry-meta .posted-by .svg-icon{margin-right:-.1em}.cat-links .svg-icon,.entry-meta .comments-link .svg-icon,.tag-links .svg-icon{margin-right:.3em}.comment-content>:last-child,.entry-content>:last-child,.entry-summary>:last-child,.more-link-wrap,.page-content>:last-child,.pb-no-content>.entry-header>:last-child{margin-bottom:0}.more-link-wrap{margin-top:1.5em}.more-link{display:inline-block;padding-top:.58em;padding-bottom:.62em;text-decoration:none;font-size:.875rem}.more-link:hover{text-decoration:none}.more-link:active,.more-link:focus{outline-color:#404040}.post-edit-link-wrap{display:block;margin-top:1em;color:#979797}.post-edit-link{font-size:.85em}.navigation .nav-links,.page-links{display:flex;flex-wrap:wrap}.navigation .nav-links,.page-links{margin-top:1.5em}.navigation .nav-links .nav-previous>a::before,.navigation .nav-links .prev::before{content:'\00ab';margin-right:.3em}.navigation .nav-links .nav-next>a::after,.navigation .nav-links .next::after{content:'\00bb';margin-left:.3em}.navigation .nav-links .page-numbers,.page-links .post-page-numbers{margin-left:.6em;margin-right:.6em}.navigation .nav-links .nav-previous,.navigation .nav-links .prev{margin-right:auto;text-align:left}.navigation .nav-links .nav-previous,.navigation .nav-links .prev,.navigation .nav-links>:first-child{margin-left:0}.navigation .nav-links .nav-next,.navigation .nav-links .next{margin-left:auto;text-align:right}.navigation .nav-links .nav-next,.navigation .nav-links .next,.navigation .nav-links>:last-child{margin-right:0}@media screen and (min-width:768px){.navigation .nav-links .nav-next,.navigation .nav-links .nav-previous{flex-basis:49%}}.navigation .nav-links a,.page-links a{text-decoration:none}.page-links a:active,.page-links a:focus,.page-links a:hover,.pagination .nav-links a:not(.prev):not(.next):active,.pagination .nav-links a:not(.prev):not(.next):focus,.pagination .nav-links a:not(.prev):not(.next):hover{text-decoration:underline}.nav-links .nav-title{word-break:break-word}.nav-links .nav-next>a,.nav-links .nav-previous>a{display:inline-flex}.pb-article.sticky .pb-sticky{color:#979797}.pb-article.sticky .pb-sticky .svg-icon{width:1.4em;height:1.4em;margin-right:.15em}.pb-sticky-label{display:inline-block;vertical-align:middle}.comment-content a{word-break:break-word}.comments-title{margin-bottom:1.5em;padding:.5em 0;border-bottom:1px solid #e1e1e1}.comment-reply-title,.comments-title{font-size:1.3em}.comment-list,.comment-list .children{list-style-type:none}.comment-list{margin:0;padding:0}.comment-list .children{padding:0}.comment-body{display:flex;flex-direction:column;margin-bottom:1.5em;padding-bottom:1.5em;border-bottom:1px solid #e1e1e1}.comment-meta{margin-bottom:1.1em}.comment-meta a{text-decoration:none}.comment-meta .comment-author{display:flex;align-items:center}.comment-meta .comment-author .avatar,.comment-meta .comment-author .fn,.comment-meta .comment-author .says{display:inline-block;margin:0 .4em .4em 0}.comment-meta .comment-author .fn{font-weight:600}.comment-metadata{font-size:.85em}.comment-metadata .edit-link,.comment-metadata a{display:inline-block}.comment-metadata a{margin-right:.4em;color:#979797}.comment-metadata a:active,.comment-metadata a:focus,.comment-metadata a:hover{color:#404040;text-decoration:underline}.comment-body .reply{display:block;margin-top:1em}.comment-reply-title{margin-top:1em;margin-bottom:1em}.comment-reply-title>small{margin-left:.4em}.comments-area .must-log-in,.comments-area .no-comments{margin-bottom:0}.bypostauthor .comment-author .says{position:relative}.bypostauthor .comment-author .says::after{content:"";position:absolute;right:-18px;top:7px;width:6px;height:11px;border-bottom:3px solid;border-right:3px solid;transform:rotate(45deg);opacity:.5}.navigation.comment-navigation .nav-links{margin-bottom:1.5em}.comment-content .wp-smiley,.entry-content .wp-smiley,.page-content .wp-smiley{border:none;margin-bottom:0;margin-top:0;padding:0}.custom-logo-link{display:inline-block}.svg-icon{display:inline-block;vertical-align:middle;fill:currentColor;line-height:1em}.wp-caption{margin-bottom:1.5em;max-width:100%}.wp-caption img[class*=wp-image-]{display:block;margin-left:auto;margin-right:auto}.wp-caption .wp-caption-text{margin:.8075em 0}.wp-caption-text{text-align:center}.gallery{margin-bottom:1.5em}.gallery-item{display:inline-block;text-align:center;vertical-align:top;width:100%}.gallery-item img{vertical-align:bottom}.gallery-columns-2 .gallery-item{max-width:50%}.gallery-columns-3 .gallery-item{max-width:33.33%}.gallery-columns-4 .gallery-item{max-width:25%}.gallery-columns-5 .gallery-item{max-width:20%}.gallery-columns-6 .gallery-item{max-width:16.66%}.gallery-columns-7 .gallery-item{max-width:14.28%}.gallery-columns-8 .gallery-item{max-width:12.5%}.gallery-columns-9 .gallery-item{max-width:11.11%}.gallery-caption{display:block}.post-password-form input[type=submit]{margin-top:.5rem}.widget{margin:0 0 1.5em}.widget h1,.widget h2{font-size:1.1em}.widget h3{font-size:1.08em}.widget h4{font-size:1.05em}.widget h5{font-size:1.02em}.widget h6{font-size:1em}.c-sidebar{width:100%;font-size:.95em;color:#404040}.c-sidebar .widget .widget-title,.c-sidebar .widget_block h1:first-child,.c-sidebar .widget_block h2:first-child,.c-sidebar .widget_block h3:first-child{margin-bottom:1.5em;padding-bottom:.5em;border-bottom:2px solid #eee}.c-sidebar .widget .widget-title::after,.c-sidebar .widget_block h1:first-child::after,.c-sidebar .widget_block h2:first-child::after,.c-sidebar .widget_block h3:first-child::after{content:"";background:#166dd6;position:absolute;left:0;bottom:-2px;height:1px;width:10%}.widget .widget-title,.widget_block h1:first-child,.widget_block h2:first-child,.widget_block h3:first-child{position:relative;margin-top:0;font-size:1.1em}.search-form{display:flex}.search-form>label{max-width:65%;width:100%;margin-bottom:0}.search-form>.search-submit{max-width:35%;width:auto}.widget_search .search-form{max-width:400px}.widget_search .search-form .search-field{width:100%}@media screen and (min-width:350px){.search-form{flex-wrap:wrap}.search-form>.search-submit,.search-form>label{max-width:-moz-fit-content;max-width:fit-content;width:auto}.widget_search .search-form{flex-wrap:nowrap}.widget_search .search-form>label{max-width:65%;width:100%}body.double-sidebar .widget_search .search-form>label{max-width:62%}.widget_search .search-form>.search-submit{max-width:35%}body.double-sidebar .widget_search .search-form>.search-submit{max-width:38%}}.widget ol,.widget ul{margin:0;padding:0;list-style-position:inside}.widget ul{list-style-type:none}.widget li>ol,.widget li>ul{margin-left:1.5em}.widget li:not(:first-child){padding-top:.4em}.widget li:not(:last-child){padding-bottom:.4em}.c-sidebar .widget li:not(:last-child){border-bottom:1px solid #e1e1e1}.widget li>ol>li:first-child,.widget li>ul>li:first-child{padding-top:.4em}.widget li.wp-social-link:not(:first-child){padding-top:0}.widget li.wp-social-link:not(:last-child){padding-bottom:0}.c-sidebar .widget li.wp-social-link{border-width:0}.c-sidebar a{color:#404040}.c-sidebar a:active,.c-sidebar a:focus,.c-sidebar a:hover{color:#f69275;text-decoration:underline}.widget .tagcloud .tag-cloud-link,.widget li a,.wp-block-tag-cloud .tag-cloud-link{text-decoration:none}.widget .textwidget>:last-child{margin-bottom:0}.widget .textwidget a{text-decoration:underline}.widget .wp-calendar-table{margin-bottom:.5em;text-align:center}.widget .wp-calendar-table caption{padding-bottom:.5em}.widget .wp-calendar-table td,.widget .wp-calendar-table th{padding:.2em .4em}.widget .wp-calendar-nav{display:flex;flex-wrap:wrap;justify-content:space-between}.widget .gallery{margin-bottom:0}.widget .gallery-item{margin:0;padding:5px 10px 5px 0}.widget .wp-block-latest-comments__comment{margin-bottom:0}@media screen and (min-width:1024px){body:not(.double-sidebar) .inner-wrapper-sticky{padding-bottom:1px}}@media screen and (min-width:1280px){body.double-sidebar .inner-wrapper-sticky{padding-bottom:1px}}.footer-widgets{padding:.5em 0;font-size:.85em;color:#fff;background:#232323}.footer-widgets-wrap{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;border-bottom:1px solid #666}.c-sidebar-footer{margin-top:1.5em;padding:0 14px}.footer-widgets-1 .c-sidebar-footer{flex-basis:100%}@media screen and (min-width:350px){.c-sidebar-footer{padding:0 24px}}@media screen and (min-width:576px){.c-sidebar-footer{padding:0}.footer-widgets-2 .c-sidebar-footer,.footer-widgets-3 .c-sidebar-footer,.footer-widgets-4 .c-sidebar-footer{flex-basis:calc(50% - 40px)}}@media screen and (min-width:1024px){.footer-widgets-3 .c-sidebar-footer,.footer-widgets-4 .c-sidebar-footer{flex-basis:calc(33.33333333% - 45px)}.footer-widgets-2 .c-sidebar-footer{flex-basis:calc(50% - 45px)}}@media screen and (min-width:1200px){.footer-widgets-4 .c-sidebar-footer{flex-basis:calc(25% - 47px)}.footer-widgets-3 .c-sidebar-footer{flex-basis:calc(33.33333333% - 47px)}.footer-widgets-2 .c-sidebar-footer{flex-basis:calc(50% - 47px)}}@media screen and (min-width:1280px){.footer-widgets-4 .c-sidebar-footer{flex-basis:calc(25% - 50px)}.footer-widgets-3 .c-sidebar-footer{flex-basis:calc(33.33333333% - 50px)}.footer-widgets-2 .c-sidebar-footer{flex-basis:calc(50% - 50px)}}.footer-widgets .widget .widget-title,.footer-widgets .widget_block h1:first-child,.footer-widgets .widget_block h2:first-child,.footer-widgets .widget_block h3:first-child{margin-bottom:.8em;padding-bottom:.4em}.footer-widgets a{color:#b7b7b7}.footer-widgets a:active,.footer-widgets a:focus,.footer-widgets a:hover{color:#fff;text-decoration:underline}.footer-widgets .widget .wp-calendar-table table,.footer-widgets .widget .wp-calendar-table td,.footer-widgets .widget .wp-calendar-table th{border-color:#666}.footer-widgets .wp-block-calendar caption,.footer-widgets .wp-block-calendar tbody{color:inherit}.footer-widgets .wp-block-calendar th{background-color:transparent}.pressbook-dark .wp-block-audio figcaption,.pressbook-dark .wp-block-calendar table caption,.pressbook-dark .wp-block-calendar table tbody,.pressbook-dark .wp-block-embed figcaption,.pressbook-dark .wp-block-gallery figcaption,.pressbook-dark .wp-block-image figcaption,.pressbook-dark .wp-block-table figcaption,.pressbook-dark .wp-block-video figcaption{color:#a7a7a7}.copyright-text{padding:1em 0;text-align:center;font-size:.8em;color:#e1e1e1;background:#232323}.copyright-text-wrap>p{display:inline-block;margin:0}.copyright-text a{color:#f69275;text-decoration:none}.copyright-text a:active,.copyright-text a:focus,.copyright-text a:hover{color:#fff;text-decoration:underline}.go-to-top{position:fixed;bottom:30px;right:30px;display:flex;flex-direction:column;justify-content:center;align-items:center;width:32px;height:32px;line-height:32px;border-radius:50%;opacity:0;visibility:hidden;z-index:9999;background:rgba(0,0,0,.35);box-shadow:0 0 10px rgba(0,0,0,.05);transition:opacity .5s,visibility .5s}.go-to-top:focus,.go-to-top:hover{background:linear-gradient(0deg,#522db8 0,#166dd6 100%)}.go-to-top:focus{outline:0;box-shadow:0 0 3px #522db8}.go-to-top:active{background:#522db8}.go-to-top::after{content:"";border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:11px solid #fff;position:relative;bottom:1px}.go-to-top--show{opacity:.8;visibility:visible}.go-to-top--fade-out{opacity:.6}@media screen and (min-width:1024px){.go-to-top{width:34px;height:34px;line-height:34px}.go-to-top::after{border-left-width:7px;border-right-width:7px;border-bottom-width:12px}}body.woocommerce-page.wc-no-sidebar .site-main,body.woocommerce-page:not(.archive) .site-main{max-width:100%;width:100%}@media screen and (min-width:1024px){body.woocommerce-page.wc-no-sidebar .site-main{padding-left:49px;padding-right:49px}body.woocommerce-page.archive.wc-sidebar .site-main{max-width:630px;padding-left:24px;padding-right:24px}body.woocommerce-page.archive.wc-sidebar .c-sidebar .widget{padding:19px 24px}body.woocommerce-page.archive.wc-sidebar .c-sidebar-shop{margin-right:25px;order:-1}}@media screen and (min-width:1200px){body.woocommerce-page.archive.wc-sidebar .site-main{max-width:730px;padding-left:39px;padding-right:39px}body.woocommerce-page.archive.wc-sidebar .c-sidebar{max-width:340px}body.woocommerce-page.archive.wc-sidebar .c-sidebar-shop{margin-right:auto}body.woocommerce-page.archive.wc-sidebar .c-sidebar .widget{padding:24px 29px}body.woocommerce-page.archive.wc-sidebar.double-sidebar .site-main{max-width:100%}body.woocommerce-page.archive.wc-sidebar.double-sidebar .c-sidebar-shop{min-width:300px;margin-right:40px}}.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item:not(:first-child){padding-top:.4em}.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item:not(:last-child){padding-bottom:.4em}.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item>ol>li:first-child,.woocommerce .widget .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item>ul>li:first-child{padding-top:.4em}.woocommerce table.shop_attributes td{padding:0 8px}.woocommerce-product-search{display:flex}.woocommerce-product-search>.search-field{max-width:65%;width:100%}.woocommerce-product-search>button{max-width:35%;width:auto}@media screen and (min-width:350px){.woocommerce-product-search{flex-wrap:nowrap}.woocommerce-product-search>.search-field{max-width:65%;width:100%}body.double-sidebar .woocommerce-product-search>.search-field{max-width:60%}.woocommerce-product-search>button{max-width:35%}body.double-sidebar .woocommerce-product-search>button{max-width:40%}}.infinite-scroll .navigation.pagination,.infinite-scroll.neverending .site-footer{display:none}.infinity-end.neverending .site-footer{display:block}body.infinite-scroll #infinite-handle{margin-top:1.5em}#page .t-margin{margin-top:1.5em}#page .b-margin{margin-bottom:1.5em}#page .no-t-margin{margin-top:0}#page .no-b-margin{margin-bottom:0}#page .no-t-padding{padding-top:0}#page .no-b-padding{padding-bottom:0}#page .no-x-padding{padding-left:0;padding-right:0}#page .u-transparent-bg{background:0 0;border:0}.u-justify{display:flex;gap:.5em;flex-direction:row;flex-wrap:wrap;justify-content:center;align-items:center}.u-justify-left{justify-content:flex-start}.u-justify-right{justify-content:flex-end}.hide-clip,.hide-entry-meta>*,.hide-posted-by>.posted-by,.hide-posted-on>.posted-on{position:absolute;clip:rect(1px,1px,1px,1px)}.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;width:1px;word-wrap:normal!important}.screen-reader-text:focus{background:#f1f1f1;border-radius:3px;box-shadow:0 0 2px 2px rgba(0,0,0,.6);clip:auto!important;-webkit-clip-path:none;clip-path:none;color:#21759b;display:block;font-size:.875rem;font-weight:600;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}#primary[tabindex="-1"]:focus{outline:0}.alignleft{float:left;margin-right:1.5em;margin-bottom:1.5em}.alignright{float:right;margin-left:1.5em;margin-bottom:1.5em}.aligncenter{clear:both;display:block;margin-left:auto;margin-right:auto;margin-bottom:1.5em}#page .block-section .entry-content .alignfull,.entry-content .alignfull,body.page.page-template-default .entry-content .alignfull,body.page.page-template-full .entry-content .alignfull,body.page.page-template-large .entry-content .alignfull,body.page.page-template-medium .entry-content .alignfull,body.page.page-template-small .entry-content .alignfull{margin-left:calc(50% - 50vw);max-width:100vw;width:100vw}.entry-content .alignwide{margin-left:-15px;width:calc(100% + 30px);max-width:calc(100% + 30px)}@media screen and (min-width:576px){.entry-content .alignwide{margin-left:-35px;width:calc(100% + 70px);max-width:calc(100% + 70px)}}@media screen and (min-width:1024px){#page .block-section .entry-content .alignwide,body.no-sidebar .entry-content .alignwide,body.page.page-template-default .entry-content .alignwide,body.page.page-template-full .entry-content .alignwide,body.page.page-template-large .entry-content .alignwide,body.page.page-template-medium .entry-content .alignwide,body.page.page-template-small .entry-content .alignwide{margin-left:-50px;width:calc(100% + 100px);max-width:calc(100% + 100px)}body.single-sidebar .entry-content .alignfull,body.single-sidebar .entry-content .alignwide{margin-left:-25px;width:calc(100% + 50px);max-width:calc(100% + 50px)}body.double-sidebar .entry-content .alignwide{margin-left:-50px;width:calc(100% + 100px);max-width:calc(100% + 100px)}}@media screen and (min-width:1200px){body.single-sidebar .entry-content .alignfull,body.single-sidebar .entry-content .alignwide{margin-left:-40px;width:calc(100% + 80px);max-width:calc(100% + 80px)}}@media screen and (min-width:1280px){body.double-sidebar .entry-content .alignfull,body.double-sidebar .entry-content .alignwide{margin-left:-30px;width:calc(100% + 60px);max-width:calc(100% + 60px)}}.c-sidebar .widget:after,.c-sidebar-footer .widget:after,.clear:after,.clear:before,.entry-content:after,.entry-content:before,.entry-footer:after,.entry-footer:before,.has-drop-cap:after,.navigation.post-navigation .nav-links:after,.site-content:after,.site-content:before,.site-footer:after,.site-footer:before{content:"";display:table;table-layout:fixed}.c-sidebar .widget:after,.c-sidebar-footer .widget:after,.clear:after,.entry-content:after,.entry-footer:after,.has-drop-cap:after,.navigation.post-navigation .nav-links:after,.page-links,.site-content:after,.site-footer:after{clear:both} \ No newline at end of file diff --git a/template-parts/content-none.php b/template-parts/content-none.php new file mode 100644 index 0000000..5d7849b --- /dev/null +++ b/template-parts/content-none.php @@ -0,0 +1,51 @@ + + + diff --git a/template-parts/content-page-no-title.php b/template-parts/content-page-no-title.php new file mode 100644 index 0000000..7e65d55 --- /dev/null +++ b/template-parts/content-page-no-title.php @@ -0,0 +1,30 @@ + + +
    > + + +
    +
    + '', + ) + ); + ?> +
    +
    + + +
    diff --git a/template-parts/content-page.php b/template-parts/content-page.php new file mode 100644 index 0000000..70c0848 --- /dev/null +++ b/template-parts/content-page.php @@ -0,0 +1,34 @@ + + +
    > + + +
    + ', '' ); ?> +
    + +
    +
    + '', + ) + ); + ?> +
    +
    + + +
    diff --git a/template-parts/content-single.php b/template-parts/content-single.php new file mode 100644 index 0000000..be902cc --- /dev/null +++ b/template-parts/content-single.php @@ -0,0 +1,52 @@ + + +
    > + + +
    + ', '' ); + + if ( 'post' === get_post_type() ) { + ?> +
    + +
    + +
    + +
    +
    + '', + ) + ); + ?> +
    +
    + + +
    diff --git a/template-parts/content.php b/template-parts/content.php new file mode 100644 index 0000000..67e464e --- /dev/null +++ b/template-parts/content.php @@ -0,0 +1,74 @@ + + +
    > +
    + ', '' ); + + if ( 'post' === get_post_type() ) { + ?> +
    + '; + PressBook\IconsHelper::the_theme_svg( 'bookmark' ); + echo ( '' . esc_html( PressBook\Options\Blog::featured_label_text() ) . '' ); + echo ''; + } + ?> +
    + +
    + + +
    + +
    + +
    + +
    + '', + ) + ); + ?> +
    + +
    + +
    diff --git a/template-parts/footer/block-section.php b/template-parts/footer/block-section.php new file mode 100644 index 0000000..e74c603 --- /dev/null +++ b/template-parts/footer/block-section.php @@ -0,0 +1,68 @@ + 'wp_block', + 'no_found_rows' => true, + 'post__in' => ( empty( $pressbook_footer_block['id'] ) ? array( 0 ) : array( $pressbook_footer_block['id'] ) ), + ) +); + +if ( $pressbook_footer_block_query->have_posts() ) { + if ( $pressbook_footer_block['b_margin'] ) { + $pressbook_footer_block_class = 'block-section footer-block footer-block-1 b-margin'; + } else { + $pressbook_footer_block_class = 'block-section footer-block footer-block-1'; + } + ?> + + + + \ No newline at end of file diff --git a/template-parts/footer/widgets.php b/template-parts/footer/widgets.php new file mode 100644 index 0000000..20a1afe --- /dev/null +++ b/template-parts/footer/widgets.php @@ -0,0 +1,30 @@ + 0 ) { + ?> + + 'wp_block', + 'no_found_rows' => true, + 'post__in' => ( empty( $pressbook_header_block['id'] ) ? array( 0 ) : array( $pressbook_header_block['id'] ) ), + ) +); + +if ( $pressbook_header_block_query->have_posts() ) { + if ( $pressbook_header_block['t_margin'] ) { + $pressbook_header_block_class = 'block-section header-block header-block-1 t-margin'; + } else { + $pressbook_header_block_class = 'block-section header-block header-block-1'; + } + ?> +
    + +
    + have_posts() ) { + $pressbook_header_block_query->the_post(); + ?> +
    + +
    + +
    + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + OGS + +
    + + +
    +
    diff --git a/template-parts/header/top-banner.php b/template-parts/header/top-banner.php new file mode 100644 index 0000000..0650ea3 --- /dev/null +++ b/template-parts/header/top-banner.php @@ -0,0 +1,64 @@ + 'wp_block', + 'no_found_rows' => true, + 'post__in' => array( $pressbook_tb_block ), + ) + ); + + if ( $pressbook_tb_block_query->have_posts() ) { + while ( $pressbook_tb_block_query->have_posts() ) { + $pressbook_tb_block_query->the_post(); + the_content(); + } + + wp_reset_postdata(); + return; + } +} + +$pressbook_top_banner = PressBook\Options\TopBanner::get_top_banner(); + +if ( '' === wp_get_attachment_image( $pressbook_top_banner['image'] ) ) { + return; +} + +$pressbook_top_banner_has_link = ( '' !== $pressbook_top_banner['link_url'] ); +?> + +
    + ' ); + } + + echo wp_get_attachment_image( $pressbook_top_banner['image'], 'full', false, array( 'class' => 'top-banner-image' ) ); + + if ( $pressbook_top_banner_has_link ) { + echo ''; + } + ?> +
    diff --git a/template-parts/header/top-navbar.php b/template-parts/header/top-navbar.php new file mode 100644 index 0000000..00b38e7 --- /dev/null +++ b/template-parts/header/top-navbar.php @@ -0,0 +1,54 @@ + +
    +
    +
    + + + + + +
    +
    +
    +
    + + +
    + ' . wp_kses( + /* translators: 1: link to WP admin new post page */ + __( 'Ready to publish your first post? Get started here.', 'pressbook' ), + array( + 'a' => array( + 'href' => array(), + ), + ) + ) . '

    ', + esc_url( admin_url( 'post-new.php' ) ) + ); + + } elseif ( is_search() ) { + ?> + +

    + + +

    + +
    +